Получает режим запуска клиентского приложения текущего сеанса работы.
Синтаксис
ТекущийРежимЗапуска()Полное описание, параметры и ограничения
Глобальный контекст.ТекущийРежимЗапуска (Global context.CurrentRunMode)
Глобальный контекст (Global context)
ТекущийРежимЗапуска (CurrentRunMode)
Доступен, начиная с версии 8.2.
Синтаксис:
ТекущийРежимЗапуска()
Возвращаемое значение:
Тип: РежимЗапускаКлиентскогоПриложения, Неопределено.
Неопределено, если режим запуска не является ни обычным, ни управляемым - например, внешнее соединение.
Описание:
Получает режим запуска клиентского приложения текущего сеанса работы.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Свой учебный профиль: пять таймаутов, проверка чисел и точное восстановление
Одна кнопка собственной новой File ИБ: фактически получить положительный профиль, явно изменить все5 чисел в секундах, перечитать, восстановить сохранённые исходные числа и проверить каждое.
Где и как запускать
Неглобальный обычный клиентский модуль собственной новой пустой File CF 8.5.1.1343 в отдельной VM; один обычный толстый клиент. Будущие административные изменения своей базы, не только памяти.
Подготовка
Только в отдельной НОВОЙ одноразовой Windows VM вручную создайте новую пустую файловую ИБ C:\1c-labs\OwnSessionTimeouts5_c2e5dc81-1386-47c4-a48d-4206cf19c695\IB. Не используйте копию рабочей базы, типовую конфигурацию или чужую CF. UUID пути и имена — контроль учебной подготовки, не защита от злонамеренной подмены или junction.
Конфигуратор → Конфигурация → свойства: Имя=СтендТаймаутов85; Версия=OwnSessionTimeouts5-5b908a73-7c6d-4204-a0a4-b2c4514ff156; ОсновнойРежимЗапуска=ОбычноеПриложение; РежимСовместимости=НеИспользовать; встроенный язык Русский. Не добавляйте документы, справочники, регистры, общие реквизиты, задания или расширения. Отсутствие общих реквизитов исключает разделители в этом пустом стенде.
Общие → Роли → Таймауты85Администратор: права Администрирование, АктивныеПользователи и доступ к собственной общей форме. Администрирование → Пользователи: единственный свой Таймауты85Ученик с этой ролью и РежимЗапуска=ОбычноеПриложение. Код не создаёт пользователей, не меняет права и проверяет настоящий UUID текущего пользователя и единственного соединения.
В Конфигураторе только этой новой ИБ: Администрирование → Параметры информационной базы. Установленная справка описывает в группе Информационная база ожидание блокировок и четыре таймера: завершение при бездействии, завершение спящего сеанса, засыпание пассивного сеанса, предупреждение о завершении. Вручную подготовьте строго положительные длительные значения, например 86400, 172800, 28800, 43200 секунд для соответствующих четырёх таймеров и30 секунд ожидания блокировки. Это отдельная ручная подготовка своей базы, не код урока и не обещание эквивалентности полей UI глобальным getter. Ноль не трактуется. Закройте Конфигуратор и все соединения, затем фактически прочитайте все5 getter этим уроком; неположительные значения означают отказ ДО setter.
Общие → Общие модули → Таймауты85: КлиентОбычноеПриложение=Да; Сервер, Глобальный, ВызовСервера, Привилегированный, КлиентУправляемоеПриложение, ВнешнееСоединение=Нет; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Вставьте CODE целиком. Все вызовы идут из одного обычного толстого клиента, без собственного серверного обработчика формы или переноса между сеансами. Native методы спящего/пассивного сеанса сами документируют серверный запрос; отсутствие собственного RPC не означает отсутствия такого запроса.
Общие → Общие формы → УрокТаймаутов85: создайте ОБЫЧНУЮ форму. Добавьте реквизит Протокол85, неограниченная Строка; многострочное поле для него только для просмотра. Исходные числа не переводятся в реквизиты формы с фиксированной точностью и не округляются. Добавьте обычный элемент управления Кнопка с именем Настроить85 и заголовком Проверить, настроить и восстановить. Его событие Нажатие привяжите к Настроить85Нажатие() из FORM. Это не команда управляемой формы и не кнопка командной панели. Вставьте весь FORM, включая Перем. Не вызывайте обработчик вручную; его native синтаксис Нажатие() не имеет параметров.
Конфигурация → Открыть модуль обычного приложения: вставьте APPLICATION целиком. Штатное ПриНачалеРаботыСистемы() получает именно свою обычную общую форму и открывает её. Обновите только эту новую пустую конфигурацию. Запустите один обычный толстый клиент 8.5.1.1343 под своим единственным пользователем; Конфигуратор и другие подключения должны быть закрыты. Не переносите урок в тонкий/веб/управляемый клиент.
Нажмите собственную кнопку ровно один раз. Сначала считываются все пять настоящих getter и проверяются числовые типы и строго положительные исходные значения. Любой ноль, отрицательное число, неверный тип или стенд останавливает урок без setter. Начальный профиль должен быть достаточно длительным для непрерывного ручного прогона; не оставляйте сеанс бездействовать, не ставьте паузы или остановы отладчика.
Временный профиль выбирается явно и отличается по каждому параметру: завершение43200 либо86400; спящий86400 либо172800; засыпание14400 либо28800; предупреждение21600 либо43200; блокировка30 либо45 секунд. Альтернатива нужна, если исходное число равно предпочтительному. Это только учебные положительные числа, не рекомендованные производственные настройки и не утверждение о хронологии предупреждений. Сон, завершение сеанса и конкурирующие транзакции не создаются и не ожидаются.
После пяти setter выполняются все пять getter и полное сравнение с выбранным профилем. Затем setter получают точные сохранённые реальные исходные числа, включая возможную дробную часть; снова читаются и сравниваются все пять getter. Только после этого возвращается фиксированный пакет из15 числовых полей и строкового кода; форма проверяет все16 полей до отображения. Каждая строка показывает исходное → фактически прочитанное временное → фактически восстановленное.
УстановитьВремяОжиданияБлокировкиДанных меняет параметр информационной базы, требует Администрирование и неустановленные разделители; при необходимости на время вызова захватывает монопольный режим, отказ его захвата вызывает исключение. Урок — только собственная новая File ИБ без других соединений, не SQL/IBM DB2. Проверка одного соединения не защищает от гонки появления другого. Не вызывайте native setter без аргумента ради восстановления: документированные defaults20/1200/86400 не равны обещанию вернуть реальное исходное значение.
Для четырёх таймеров установленная справка не уточняет охват текущих/прочих/будущих сеансов и сохранение настройки; урок ничего такого не обещает. Он доказывает лишь будущую нормальную последовательность вызовов и сравнение getter в том же клиентском контексте. Семантика нуля не установлена, поэтому он исключён. Никаких обещаний фактического сна, завершения или блокировочного конфликта по числовому чтению нет.
После ЛЮБОЙ ошибки обработчик устанавливает постоянный STOP текущей формы и повторно поднимает исходную ошибку. В catch нет восстановительных setter, повторной команды или автоматического rollback. Возможен частично изменённый профиль, новые срабатывания таймеров и потеря сеанса до завершения. Не переоткрывайте форму для обхода STOP; сохраните ошибку и остановите эту учебную VM. Отдельное ручное восстановление или создание нового пустого стенда требует отдельного решения; код его не выполняет.
Нормальный протокол подтверждает восстановление только после всех проверок; отказ не считается успешным примером. Нет операций с прикладными данными, но это будущие реальные административные изменения собственной базы, не пример только в памяти; возможные платформенные системные записи не исключаются. Здесь VM/CF/ИБ не создавались, платформа не запускалась, настройки не менялись: проверка статическая по установленной справке.
Процедура ПроверитьСтенд85() Экспорт
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSessionTimeouts5_c2e5dc81-1386-47c4-a48d-4206cf19c695\IB"";" Тогда
ВызватьИсключение "Разрешён только свой новый обычный толстый клиент в отдельной учебной VM";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("Таймауты85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УрокТаймаутов85") = Неопределено Тогда
ВызватьИсключение "Нужен пустой стенд: один модуль и форма, без данных, разделителей и заданий";
КонецЕсли;
МодульМД = Метаданные.ОбщиеМодули.Найти("Таймауты85");
Если Не МодульМД.КлиентОбычноеПриложение Или МодульМД.Сервер Или МодульМД.Глобальный
Или МодульМД.ВызовСервера Или МодульМД.Привилегированный Или МодульМД.КлиентУправляемоеПриложение
Или МодульМД.ВнешнееСоединение
Или МодульМД.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Нужен неглобальный обычный клиентский модуль без сервера, RPC, привилегий и кеширования";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "В своей лаборатории не должно быть расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ТипЗнч(Текущий) <> Тип("ПользовательИнформационнойБазы") Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один настоящий собственный учебный пользователь";
КонецЕсли;
Если Текущий.Имя <> "Таймауты85Ученик" Или Текущий.РежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение
Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпала собственная идентичность или обычный режим пользователя";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и все остальные соединения своей новой базы";
КонецЕсли;
Соединение = Соединения[0];
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединение.Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Единственное соединение должно принадлежать своему текущему пользователю";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьЧисловыеПоля85(Пакет, Имена, ЕстьКод)
Если ТипЗнч(Пакет) <> Тип("ФиксированнаяСтруктура") Тогда
ВызватьИсключение "Нужен собственный фиксированный пакет";
КонецЕсли;
Поля = СтрРазделить(Имена, ",");
Если Пакет.Количество() <> Поля.Количество() + ?(ЕстьКод, 1, 0) Тогда
ВызватьИсключение "Число полей пакета не совпало";
КонецЕсли;
Для Каждого Имя Из Поля Цикл
Если Не Пакет.Свойство(Имя, ЗначениеПоля) Или ТипЗнч(ЗначениеПоля) <> Тип("Число") Тогда
ВызватьИсключение "Каждое обязательное поле должно быть настоящим числом";
КонецЕсли;
Если ЗначениеПоля <= 0 Тогда
ВызватьИсключение "Только строго положительные значения в секундах; ноль не интерпретируется";
КонецЕсли;
КонецЦикла;
Если ЕстьКод Тогда
Если Не Пакет.Свойство("Код", ЗначениеКода) Или ТипЗнч(ЗначениеКода) <> Тип("Строка") Тогда
ВызватьИсключение "Нужен строковый код собственного урока";
КонецЕсли;
Если ЗначениеКода <> "OwnSessionTimeouts5-5b908a73-7c6d-4204-a0a4-b2c4514ff156" Тогда
ВызватьИсключение "Подменён код собственного пакета";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьПрофиль85(Профиль)
ПроверитьЧисловыеПоля85(Профиль, "Завершение,Спящий,Засыпание,Предупреждение,Блокировка", Ложь);
КонецПроцедуры
Функция ПрочитатьПрофиль85()
Профиль = Новый ФиксированнаяСтруктура(Новый Структура("Завершение,Спящий,Засыпание,Предупреждение,Блокировка",
ПолучитьВремяЗавершенияСеансаПриБездействии(), ПолучитьВремяЗавершенияСпящегоСеанса(),
ПолучитьВремяЗасыпанияПассивногоСеанса(), ПолучитьВремяПредупрежденияОЗавершенииСеансаПриБездействии(),
ПолучитьВремяОжиданияБлокировкиДанных()));
ПроверитьПрофиль85(Профиль);
Возврат Профиль;
КонецФункции
Функция ВыбратьПрофиль85(Исходный)
ПроверитьПрофиль85(Исходный);
Учебный = Новый ФиксированнаяСтруктура(Новый Структура("Завершение,Спящий,Засыпание,Предупреждение,Блокировка",
?(Исходный.Завершение = 43200, 86400, 43200), ?(Исходный.Спящий = 86400, 172800, 86400),
?(Исходный.Засыпание = 14400, 28800, 14400), ?(Исходный.Предупреждение = 21600, 43200, 21600),
?(Исходный.Блокировка = 30, 45, 30)));
ПроверитьПрофиль85(Учебный);
Возврат Учебный;
КонецФункции
Процедура УстановитьПрофиль85(Профиль)
ПроверитьСтенд85();
ПроверитьПрофиль85(Профиль);
УстановитьВремяЗавершенияСеансаПриБездействии(Профиль.Завершение);
УстановитьВремяЗавершенияСпящегоСеанса(Профиль.Спящий);
УстановитьВремяЗасыпанияПассивногоСеанса(Профиль.Засыпание);
УстановитьВремяПредупрежденияОЗавершенииСеансаПриБездействии(Профиль.Предупреждение);
УстановитьВремяОжиданияБлокировкиДанных(Профиль.Блокировка);
КонецПроцедуры
Процедура СверитьПрофиль85(Фактический, Ожидаемый)
ПроверитьПрофиль85(Фактический);
ПроверитьПрофиль85(Ожидаемый);
Если Фактический.Завершение <> Ожидаемый.Завершение Или Фактический.Спящий <> Ожидаемый.Спящий
Или Фактический.Засыпание <> Ожидаемый.Засыпание Или Фактический.Предупреждение <> Ожидаемый.Предупреждение
Или Фактический.Блокировка <> Ожидаемый.Блокировка Тогда
ВызватьИсключение "Все пять фактических getter должны подтвердить ожидаемый профиль";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьИтог85(Итог) Экспорт
ПроверитьЧисловыеПоля85(Итог, "ДоЗавершение,ДоСпящий,ДоЗасыпание,ДоПредупреждение,ДоБлокировка,УчебныйЗавершение,УчебныйСпящий,УчебныйЗасыпание,УчебныйПредупреждение,УчебныйБлокировка,ПослеЗавершение,ПослеСпящий,ПослеЗасыпание,ПослеПредупреждение,ПослеБлокировка", Истина);
Для Каждого Имя Из СтрРазделить("Завершение,Спящий,Засыпание,Предупреждение,Блокировка", ",") Цикл
Итог.Свойство("До" + Имя, До);
Итог.Свойство("Учебный" + Имя, Учебный);
Итог.Свойство("После" + Имя, После);
Если До <> После Или До = Учебный Тогда
ВызватьИсключение "Каждый параметр должен реально измениться и вернуться к исходному числу";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция НастроитьИВосстановить85() Экспорт
ПроверитьСтенд85();
Исходный = ПрочитатьПрофиль85();
Учебный = ВыбратьПрофиль85(Исходный);
УстановитьПрофиль85(Учебный);
Фактический = ПрочитатьПрофиль85();
СверитьПрофиль85(Фактический, Учебный);
УстановитьПрофиль85(Исходный);
Восстановленный = ПрочитатьПрофиль85();
СверитьПрофиль85(Восстановленный, Исходный);
Итог = Новый ФиксированнаяСтруктура(Новый Структура("ДоЗавершение,ДоСпящий,ДоЗасыпание,ДоПредупреждение,ДоБлокировка,УчебныйЗавершение,УчебныйСпящий,УчебныйЗасыпание,УчебныйПредупреждение,УчебныйБлокировка,ПослеЗавершение,ПослеСпящий,ПослеЗасыпание,ПослеПредупреждение,ПослеБлокировка,Код",
Исходный.Завершение, Исходный.Спящий, Исходный.Засыпание, Исходный.Предупреждение, Исходный.Блокировка,
Фактический.Завершение, Фактический.Спящий, Фактический.Засыпание, Фактический.Предупреждение, Фактический.Блокировка,
Восстановленный.Завершение, Восстановленный.Спящий, Восстановленный.Засыпание, Восстановленный.Предупреждение, Восстановленный.Блокировка,
"OwnSessionTimeouts5-5b908a73-7c6d-4204-a0a4-b2c4514ff156"));
ПроверитьИтог85(Итог);
Возврат Итог;
КонецФункцииОбычная кнопка, полный числовой протокол и остановка после ошибки
Общие → Общие формы → УрокТаймаутов85 → Модуль обычной формы
Толстый обычный клиент
Перем Остановка85;
Перем Завершено85;
Процедура Настроить85Нажатие()
Попытка
Если Остановка85 = Истина Или Завершено85 = Истина Тогда
ВызватьИсключение "В этой форме повторение запрещено";
КонецЕсли;
Итог = Таймауты85.НастроитьИВосстановить85();
Таймауты85.ПроверитьИтог85(Итог);
Протокол85 = "Все числа в секундах. Исходное → временно установленное → восстановленное:";
Для Каждого Имя Из СтрРазделить("Завершение,Спящий,Засыпание,Предупреждение,Блокировка", ",") Цикл
Итог.Свойство("До" + Имя, До);
Итог.Свойство("Учебный" + Имя, Учебный);
Итог.Свойство("После" + Имя, После);
Протокол85 = Протокол85 + Символы.ПС + Имя + ": " + Строка(До) + " → " + Строка(Учебный) + " → " + Строка(После);
КонецЦикла;
Завершено85 = Истина;
Протокол85 = Протокол85 + Символы.ПС + "Подтверждено чтением всех пяти параметров. Сон, завершение сеанса и конфликт блокировок не проверялись.";
Исключение
Остановка85 = Истина;
Протокол85 = "ОТКАЗ, не успех. Повторение запрещено. Часть параметров могла остаться изменённой; новые срабатывания таймеров возможны. Не переоткрывайте форму для обхода STOP, сохраните исходную ошибку и остановите свою учебную VM.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыШтатный запуск своей обычной общей формы
Конфигурация → Открыть модуль обычного приложения
Толстый обычный клиент
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
Таймауты85.ПроверитьСтенд85();
СвояФорма = ПолучитьОбщуюФорму("УрокТаймаутов85");
Если ТипЗнч(СвояФорма) <> Тип("Форма") Тогда
ВызватьИсключение "Нужна собственная обычная форма";
КонецЕсли;
СвояФорма.Открыть();
#Иначе
ВызватьИсключение "Нужен толстый обычный клиент 8.5.1.1343";
#КонецЕсли
КонецПроцедурыРазбор по шагам
В новой отдельной VM подготовить пустую File CF, точные имена/версию, единственного администратора, обычную форму/кнопку, клиентский модуль и модуль обычного приложения. Отдельно вручную задать положительную подготовку через Параметры информационной базы, не обещая UI/global эквивалентность.
До первого setter проверить стенд и все пять фактических положительных исходных чисел. Выбрать длительный положительный профиль, отличающийся по каждому полю.
Один раз установить все пять чисел и прочитать весь профиль в том же клиентском контексте. Полностью сравнить его с выбранным; без этого не переходить к нормальному продолжению.
Установить точные ранее прочитанные исходные числа, снова прочитать все пять и подтвердить полное равенство. Проверить пакет16 и вывести фактические три числовых набора без ожидания сна или конфликта.
Как проверить результат
Все пять До/Учебный/После имеют native числовой тип и значения>0 в секундах. Учебный отличается от До, После точно равно До для каждого. Реальные getter после каждого набора setter обязательны.
Пакет имеет ровно16 полей:15 положительных чисел и собственный строковый код. Полные проверки имён/типов выполняются до чтения и отображения. Provider0args, ровно5 primary; zero scope и фактические таймерные события не выдумываются.
Любая ошибка — отказ со sticky STOP этой формы, без повторных мутаций/автоматического восстановления. Успех возможен только по нормальному пути после полного последнего чтения.
Ожидаемый результат
Ожидаемый будущий ручной результат: пять строк До → Учебный → После, где Учебный фактически отличается, а После полностью равно сохранённому До. Это проверка параметров, не доказательство сна/завершения/конфликта. Здесь 1С не запускалась.
На что обратить внимание
Никогда не используйте рабочую или чужую ИБ. Путь/имена не являются защитой от намеренной подмены; требуется действительно собственная новая изолированная лаборатория.
Ноль и отрицательные исходные числа исключены ДО setter. Не подменяйте неизвестную семантику нуля догадкой и не приписывайте четырём таймерам область всех/будущих сеансов или постоянное хранение.
Getter подтверждают числовое чтение, а не срабатывание таймера. Нет паузы, ожидания, отладки с остановом, специально спящего сеанса или конкурирующих транзакций.
Lock setter относится к ИБ и может временно требовать монопольный режим. Не гарантируется отсутствие гонки подключения. Native defaults не восстановление; все пять исходных чисел берутся из getter.
Ошибка может оставить профиль изменённым и вызвать новые таймерные события; автоматический откат не обещается. STOP ограничен текущей формой; не переоткрывайте её для обхода запрета.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Собственная копия заявки: обычный редактор и проверка реальных данных
Часть одного собственного учебного плана без исполнения маршрута. Реальные фабрики/сохранение/чтение/выбор, отдельные числовые результаты и понятный протокол новичку.
Где и как запускать
Платформа8.5.1.1343, Windows толстый клиент, ОбычноеПриложение; собственная общая форма-контроллер.
Подготовка
Задача урока — подготовить копию заявки и отдельного плана работ, сравнить обычные и управляемые редакторы и передать проверенную ссылку своему пульту. Это не исполнение бизнес-процесса: Старт, Выполнить и продвижение карты не вызываются; все флаги исполнения только читаются.
Вручную создайте НОВУЮ пустую File-базу C:\1c-labs\OwnWorkflowDraftForms85_f956035f-bf9c-4756-b7f8-85c56562aa32\IB. Существующий каталог не очищайте и не переиспользуйте. Своя конфигурация УчебныйПланПоручений85, Windows 8.5.1.1343, РежимСовместимости=НеИспользовать. UUID в пути — маркер лаборатории, не UUID информационной базы.
В Конфигураторе Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска выберите «Управляемое приложение и обычное приложение». Это настройка редактора, не метаданные SupportedRunModes. Для первого запуска свойство ОсновнойРежимЗапуска=ОбычноеПриложение. Оба опыта выполняются толстым клиентом Windows; тонкий/веб-клиент здесь не обещаются.
Один пользователь План85Ученик со своей ролью полного доступа только к этой CF, включая Администрирование и АктивныеПользователи. Перед каждым опытом закройте Конфигуратор и остальные соединения. Код сверяет count1, текущий номер соединения и настоящий UUID пользователя. Это снимок состояния, не запрет нового подключения и не транзакционная изоляция.
Создайте метаданные строго по видимому JSON-блоку: один БП Заявка85, одна задача Поручение85, один серверный общий модуль ПланПоручений85 и четыре общие формы. Нет иных объектов, подписок, заданий, расширений, обработчиков точек, адресации и внешних действий. Задача-план не является автоматически порождённой задачей маршрута; её БизнесПроцесс и ТочкаМаршрута остаются пустыми.
У БП карта Старт → одиночное действие План85 → Финиш, без адресации/групповых точек/обработчиков. Свойство Задача=Поручение85. Карта нужна для допустимых метаданных, но в этом уроке она не запускается. Номер обоих видов — Строка9, автонумерация и контроль уникальности. Фактические номера после сохранения читает код; он не считает их заранее равными 0001/0002.
Общий модуль — СерверДа, ВызовСервераДа, КлиентОбычноеПриложениеНет, КлиентУправляемоеПриложениеНет, ВнешнееСоединениеНет, ГлобальныйНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначенийНеИспользовать. Вставьте полный COMMON. Он работает с собственными данными, не получает неизвестный пользовательский объект и не содержит UI.
В оба модуля объектов вставьте полный соответствующий ПередЗаписью. Первая запись оригинала разрешена только однократной собственной подготовкой с контекстом ДополнительныеСвойства. Существующие оригиналы не записываются; копия разрешает только первый шаг3, затем3→4→3. Оба клиентских режима проходят тот же серверный объектный контроль.
У каждого вида создайте три формы с точными именами из JSON: обычный объект РедакторОбычный85 с основным Запись85, обычный список СписокОбычный85 с основным Список85, управляемый объект РедакторУправляемый85 с основным Объект. Эти основные реквизиты создаёт мастер; не подменяйте их структурой или дополнительным реквизитом. Вставьте все полные модули своего вида, назначьте перечисленные события.
Обычная таблица Строки85 связана с Список85; все девять колонок явно добавлены и Данные каждой равны имени соответствующего поля. Поля обычного редактора и таблица только для просмотра, стандартные запись/удаление/старт/выполнение убраны. Не объявляйте видимость кнопок средством RLS или абсолютной безопасности.
Общие формы ПланБПОбычный85 и ПланЗадачиОбычный85 получают свои разные MAIN. В каждой реквизит Выбранный85 имеет ссылочный тип только соответствующего своего вида; реальное ПолеВвода Выбор85 связано с ним. Пользователь вручную вводит фактический номер своей копии из протокола и нажимает Enter. Мы проверяем уже доставленное настоящее значение, не угадываем строки выпадающего списка и не вызываем обработчик выбора вручную.
В ОБЕИХ управляемых формах объектов и управляемом пульте обязательно создайте настоящие реквизиты managedSharedScalarAttributes из JSON; затем добавьте соответствующие managedObjectScalarAttributes или managedHubScalarAttributes. Они хранят фазу, остановку, собственные refs и скалярный паспорт между клиентом и сервером. Не заменяйте их Перем: переменные модулей разных контекстов не считаются синхронизированными. Дочерняя85 — единственная client-only переменная managedhub, сервер её не читает. Служебные реквизиты не выводятся в редактируемые поля.
Создайте оба пульта по JSON и вставьте полные модули. Модуль обычного приложения получает APPLICATION_ORDINARY, модуль управляемого приложения APPLICATION_MANAGED. Нативное ПриНачалеРаботыСистемы без параметров назначается настоящему модулю приложения. Флажок согласия всюду первоначально Ложь.
F7 и обновление только своей CF; закройте Конфигуратор, запустите обычное приложение. В своём пульте установите согласие и ОДИН раз Подготовить85. Будут реально записаны два оригинала: бюджет заявки1000 и стоимость работ100. Если после первого объекта возникла ошибка, остановитесь: повтор, автоматическое удаление и завершение частичной подготовки кодом не выполняются.
Далее кнопка БП85: согласие в дочернем контроллере, Шаг85 создаёт свою новую копию1000→1500 через реальный Copy0 и записывает её формой. Закройте только просмотренный собственный редактор, выполните следующий Шаг85: открывается настоящий список с параметром текущей строки. Введите номер копии в собственном Выбор85, Enter, затем финальный Шаг85 проверяет реальную текущую GUI-строку и ссылку. Закройте собственные окна, аналогично Задача85 создаёт копию100→150. Для задачи список явно переключён на ВсеЗадачи своего единственного вида, не на чужого исполнителя.
Полностью закройте обычный клиент. Только в этой своей CF вручную измените ОсновнойРежимЗапуска на УправляемоеПриложение, обновите её, закройте Конфигуратор и запустите тот же стенд вторым толстым клиентом. Режим редактора «оба» не заменяет эту отдельную настройку/проверку реального запуска.
На новом управляемом пульте согласие и БП85. В своей дочерней форме согласие, затем четыре последовательных Шаг85: сохранить1500→2000; создать известный несохранённый буфер2500 и native Прочитать вернуть2000; сохранить2000→1500; проверить навигационную ссылку и включить собственную политику передачи. Отдельная Передать85 отправляет настоящую свою ссылку владельцу. Native РежимВыбора отключён перед явным ОповеститьОВыборе: автоматический payload при закрытии не считается гарантированно ссылкой и не должен дублировать явную передачу.
Закройте свой пульт/окна и повторно войдите только в управляемое приложение для отдельного опыта Задача85:150→200, буфер250→native read200, запись200→150, своя навигационная ссылка и передача. Новый пульт нужен потому, что он разрешает ровно одного собственного ребёнка; это не обход остановленного экземпляра после ошибки.
Полные исходные записи/refs/номера/версии/даты/маркеры проверяются отдельно от фактических GUI-данных. Бюджет и стоимость работ — разные показатели: весь БП источник2500→3000→2500, задачи250→300→250. Это ожидаемый ручной результат, не runtime-отчёт. Здесь 1С/компилятор/CF/БД/UI/маршрут/сеть не запускались; статическая проверка не подтверждает пиксели, доставку строки, атомарность или выполнение рабочего процесса.
Перем Остановка85, Этап85, До85, Редактор85, Журнал85, СвояСсылка85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Нужно обычное приложение";
КонецЕсли;
До85 = ПланПоручений85.Источник85();
Если До85.БП.Копия <> Неопределено Тогда
ВызватьИсключение "Свою копию этого вида уже создали; повтор не допускается";
КонецЕсли;
Согласие85 = Ложь;
Этап85 = 0;
Остановка85 = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Шаг85(Кнопка)
Если Остановка85 Или Не Согласие85 Или Кнопка <> ЭлементыФормы.Шаг85 Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2) Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестный шаг, нет согласия или процесс остановлен";
КонецЕсли;
Попытка
Сейчас = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьИсходные85(До85, Сейчас);
Если Этап85 = 0 Тогда
Если Сейчас.БП.Копия <> Неопределено Тогда
ВызватьИсключение "Первая копия уже существует";
КонецЕсли;
Копия = Сейчас.БП.Оригинал.Ссылка.ПолучитьОбъект().Скопировать();
Если ТипЗнч(Копия) <> Тип("БизнесПроцессОбъект.Заявка85") Или Не Копия.ЭтоНовый() Тогда
ВызватьИсключение "Фабрика не вернула свой новый объект";
КонецЕсли;
Копия.Копия85 = Истина;
Копия.Номер = "";
Копия.Оригинал85 = Сейчас.БП.Оригинал.Ссылка;
Копия.Количество85 = 3;
Копия.Сумма85 = 3 * Копия.Цена85;
ПланПоручений85.ПроверитьЗапись85(Копия, Ложь);
Редактор85 = Копия.ПолучитьФорму("РедакторОбычный85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Редактор85 = Неопределено Тогда
ВызватьИсключение "Своя форма не создана";
КонецЕсли;
Если ТипЗнч(Редактор85) <> Тип("Форма") Или Редактор85.ВладелецФормы <> ЭтаФорма Или Редактор85.Запись85 <> Копия Тогда
ВызватьИсключение "Форма не принадлежит своему экземпляру";
КонецЕсли;
Редактор85.Автонумерация = АвтонумерацияВФорме.НеИспользовать;
Редактор85.ПараметрОбъектКопирования = Копия.Оригинал85;
Редактор85.ПараметрОснование = Сейчас.Задачи.Оригинал.Ссылка;
Редактор85.Открыть();
Редактор85.ПроверитьПаспорт85(Копия, Копия.Оригинал85, Сейчас.Задачи.Оригинал.Ссылка);
ПланПоручений85.ПроверитьИсходные85(До85, ПланПоручений85.Источник85());
Если Не Редактор85.ЗаписатьВФорме() Тогда
ВызватьИсключение "Запись копии отменена; повтор запрещён";
КонецЕсли;
После = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьИсходные85(До85, После);
Если После.БП.Копия = Неопределено Тогда
ВызватьИсключение "Своя копия не появилась в реальной базе";
КонецЕсли;
Если После.БП.Копия.Ссылка <> Копия.Ссылка Или После.БП.Копия.Сумма85 <> 1500
Или После.БП.Итог <> 2500 Или Копия.ЭтоНовый() Или После.БП.Копия.Номер <> Копия.Номер Тогда
ВызватьИсключение "Запись/номер/сумма своей копии не подтверждены";
КонецЕсли;
СвояСсылка85 = Копия.Ссылка;
Протокол85 = "Своя сохранённая копия: номер " + Копия.Номер + ", сумма 1500. Закройте её редактор и выполните следующий шаг.";
Этап85 = 1;
ИначеЕсли Этап85 = 1 Тогда
Если Редактор85.Открыта() Или Сейчас.БП.Копия.Ссылка <> СвояСсылка85 Или Сейчас.БП.Копия.Сумма85 <> 1500 Тогда
ВызватьИсключение "Закройте свой редактор; данные копии должны остаться прежними";
КонецЕсли;
Журнал85 = БизнесПроцессы.Заявка85.ПолучитьФормуСписка("СписокОбычный85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Журнал85 = Неопределено Тогда
ВызватьИсключение "Свой список не создан";
КонецЕсли;
Если ТипЗнч(Журнал85) <> Тип("Форма") Или Журнал85.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Другой источник списка";
КонецЕсли;
Журнал85.ПараметрТекущаяСтрока = СвояСсылка85;
Журнал85.Открыть();
Протокол85 = "В своём поле Выбор85 введите сохранённый номер копии и нажмите Enter. Дождитесь реальной текущей строки списка, затем снова Шаг85.";
Этап85 = 2;
Иначе
Поле = Журнал85.ЭлементыФормы.Строки85;
Ввод = ЭлементыФормы.Выбор85;
Если Ввод.Данные <> "Выбранный85" Или Ввод.Значение <> Выбранный85 Или Выбранный85 <> СвояСсылка85
Или Поле.Данные <> "Список85" Или Поле.Значение <> Журнал85.Список85
Или Поле.ТекущаяСтрока <> СвояСсылка85 Тогда
ВызватьИсключение "Не доставлены настоящие свои ссылка и строка; запросом их не заменяем";
КонецЕсли;
Ячейки = Поле.ТекущиеДанные;
Если Ячейки = Неопределено Тогда
ВызватьИсключение "Текущие данные GUI ещё отсутствуют";
КонецЕсли;
Запись = Сейчас.БП.Копия;
Если Запись.Ссылка <> СвояСсылка85 Или Ячейки.Ссылка <> Запись.Ссылка Или Ячейки.Номер <> Запись.Номер
Или Ячейки.Дата <> Запись.Дата Или Ячейки.Маркер85 <> Запись.Маркер85 Или Ячейки.Копия85 <> Запись.Копия85
Или Ячейки.Оригинал85 <> Запись.Оригинал85 Или Ячейки.Количество85 <> Запись.Количество85
Или Ячейки.Цена85 <> Запись.Цена85 Или Ячейки.Сумма85 <> Запись.Сумма85 Тогда
ВызватьИсключение "Реальная текущая строка GUI отличается от своей полной записи";
КонецЕсли;
Этап85 = 3;
Протокол85 = "Выбран настоящий номер " + Ячейки.Номер + "; GUI-сумма 1500, полный источник 2500. Это план, не выполнение маршрута.";
КонецЕсли;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыОбщий серверный модуль ПланПоручений85
Общие модули → ПланПоручений85 → Модуль
Сервер собственного File-стенда; реальные чтения/подготовка/защита записей без UI, server-only commonmodule.
Функция ПроверитьСтенд85() Экспорт
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnWorkflowDraftForms85_f956035f-bf9c-4756-b7f8-85c56562aa32\IB"";" Тогда
ВызватьИсключение "Только свой новый файловый стенд 8.5.1.1343";
КонецЕсли;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
ВызватьИсключение "Нужен один реальный пользователь";
КонецЕсли;
Если Текущий.Имя <> "План85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Чужой пользователь";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и остальные соединения";
КонецЕсли;
Соединение = Соединения[0];
Если ТипЗнч(Соединение) <> Тип("СоединениеИнформационнойБазы") Тогда
ВызватьИсключение "Неизвестное описание соединения";
КонецЕсли;
Пользователь = Соединение.Пользователь;
Если ТипЗнч(Пользователь) <> Тип("ПользовательИнформационнойБазы") Тогда
ВызватьИсключение "Неизвестный пользователь соединения";
КонецЕсли;
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Чужое соединение или его пользователь";
КонецЕсли;
Если Метаданные.БизнесПроцессы.Количество() <> 1 Или Метаданные.Задачи.Количество() <> 1
Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеФормы.Количество() <> 4
Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.БизнесПроцессы.Заявка85.Задача <> Метаданные.Задачи.Поручение85
Или Метаданные.БизнесПроцессы.Заявка85.Формы.Количество() <> 3 Или Метаданные.Задачи.Поручение85.Формы.Количество() <> 3 Тогда
ВызватьИсключение "Отличается состав собственной учебной конфигурации";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения в этом стенде запрещены";
КонецЕсли;
Возврат Текущий.УникальныйИдентификатор;
КонецФункции
Функция ПрочитатьВид85(Задача)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Номер, Дата, ПометкаУдаления, Маркер85, Копия85, Оригинал85, Количество85, Цена85, Сумма85 ИЗ "
+ ?(Задача, "Задача.Поручение85", "БизнесПроцесс.Заявка85") + " УПОРЯДОЧИТЬ ПО Копия85";
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() > 2 Тогда
ВызватьИсключение "В своём виде найдены лишние записи";
КонецЕсли;
Оригинал = Неопределено;
Копия = Неопределено;
Итог = 0;
Для Индекс = 0 По Таблица.Количество() - 1 Цикл
Строка = Таблица[Индекс];
Если ТипЗнч(Строка.Ссылка) <> Тип(?(Задача, "ЗадачаСсылка.Поручение85", "БизнесПроцессСсылка.Заявка85")) Или Строка.Ссылка.Пустая() Тогда
ВызватьИсключение "Не своя настоящая ссылка";
КонецЕсли;
Объект = Строка.Ссылка.ПолучитьОбъект();
ПроверитьОбъект85(Объект, Задача);
Если Объект.Номер = "" Или Объект.ЭтоНовый() Или Объект.Ссылка <> Строка.Ссылка Тогда
ВызватьИсключение "Ожидалась реально сохранённая запись со своим номером";
КонецЕсли;
Если Строка.Номер <> Объект.Номер Или Строка.Дата <> Объект.Дата Или Строка.ПометкаУдаления <> Объект.ПометкаУдаления
Или Строка.Маркер85 <> Объект.Маркер85 Или Строка.Копия85 <> Объект.Копия85 Или Строка.Оригинал85 <> Объект.Оригинал85
Или Строка.Количество85 <> Объект.Количество85 Или Строка.Цена85 <> Объект.Цена85 Или Строка.Сумма85 <> Объект.Сумма85 Тогда
ВызватьИсключение "Два реальных чтения своей записи не совпали";
КонецЕсли;
Паспорт = Новый ФиксированнаяСтруктура("Ссылка,Номер,Дата,Маркер85,Копия85,Оригинал85,Количество85,Цена85,Сумма85,Версия85",
Объект.Ссылка, Объект.Номер, Объект.Дата, Объект.Маркер85, Объект.Копия85, Объект.Оригинал85,
Объект.Количество85, Объект.Цена85, Объект.Сумма85, Объект.ВерсияДанных);
Если Индекс = 0 Тогда
Если Объект.Копия85 Или Не Объект.Оригинал85.Пустая() Или Объект.Количество85 <> 2 Тогда
ВызватьИсключение "Первой должна быть своя неизменная исходная запись";
КонецЕсли;
Оригинал = Паспорт;
Иначе
Если Не Объект.Копия85 Или Объект.Оригинал85 <> Оригинал.Ссылка Или Объект.Ссылка = Оригинал.Ссылка
Или Объект.Номер = Оригинал.Номер Или (Объект.Количество85 <> 3 И Объект.Количество85 <> 4) Тогда
ВызватьИсключение "Не единственная собственная копия оригинала";
КонецЕсли;
Копия = Паспорт;
КонецЕсли;
Итог = Итог + Объект.Сумма85;
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура("Оригинал,Копия,Итог", Оригинал, Копия, Итог);
КонецФункции
Процедура ПроверитьОбъект85(Объект, Задача)
Если ТипЗнч(Объект) <> Тип(?(Задача, "ЗадачаОбъект.Поручение85", "БизнесПроцессОбъект.Заявка85")) Тогда
ВызватьИсключение "Не настоящий объект своего вида";
КонецЕсли;
Если Объект.Маркер85 <> "f956035f-bf9c-4756-b7f8-85c56562aa32" Или Объект.ПометкаУдаления
Или Объект.Дата <> Дата(2026, 10, 10, 12, 0, 0) Или Объект.Цена85 <> ?(Задача, 50, 500)
Или Объект.Сумма85 <> Объект.Количество85 * Объект.Цена85 Тогда
ВызватьИсключение "Изменены данные своего плана";
КонецЕсли;
Если Задача Тогда
Если Объект.Выполнена Или Не Объект.БизнесПроцесс.Пустая() Или Объект.ТочкаМаршрута <> БизнесПроцессы.Заявка85.ПустаяСсылкаНаТочкуМаршрута()
Или Объект.Наименование <> ?(Объект.Копия85, "Копия плана работ85", "Исходный план работ85") Тогда
ВызватьИсключение "Нужна отдельная невыполненная задача-план, не задача маршрута";
КонецЕсли;
Иначе
Если Объект.Стартован Или Объект.Завершен Или Не Объект.ВедущаяЗадача.Пустая() Тогда
ВызватьИсключение "Процесс не должен быть запущен или завершён";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция Источник85() Экспорт
Пользователь = ПроверитьСтенд85();
БП = ПрочитатьВид85(Ложь);
Задачи = ПрочитатьВид85(Истина);
Если БП.Оригинал = Неопределено Или Задачи.Оригинал = Неопределено Или ПроверитьСтенд85() <> Пользователь Тогда
ВызватьИсключение "Подготовьте оба своих оригинала; пользователь не должен меняться";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("БП,Задачи,Пользователь", БП, Задачи, Пользователь);
КонецФункции
Процедура ПроверитьИсходные85(До, После) Экспорт
Если До.Пользователь <> После.Пользователь
Или До.БП.Оригинал.Ссылка <> После.БП.Оригинал.Ссылка Или До.БП.Оригинал.Номер <> После.БП.Оригинал.Номер
Или До.БП.Оригинал.Версия85 <> После.БП.Оригинал.Версия85
Или До.Задачи.Оригинал.Ссылка <> После.Задачи.Оригинал.Ссылка Или До.Задачи.Оригинал.Номер <> После.Задачи.Оригинал.Номер
Или До.Задачи.Оригинал.Версия85 <> После.Задачи.Оригинал.Версия85 Тогда
ВызватьИсключение "Изменились оригиналы или реальный пользователь";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСкалярныйПаспорт85(Пользователь, БП, НомерБП, ВерсияБП, Задача, НомерЗадачи, ВерсияЗадачи, Сейчас) Экспорт
Если Пользователь <> Строка(Сейчас.Пользователь) Или БП <> Сейчас.БП.Оригинал.Ссылка Или НомерБП <> Сейчас.БП.Оригинал.Номер
Или ВерсияБП <> Сейчас.БП.Оригинал.Версия85 Или Задача <> Сейчас.Задачи.Оригинал.Ссылка
Или НомерЗадачи <> Сейчас.Задачи.Оригинал.Номер Или ВерсияЗадачи <> Сейчас.Задачи.Оригинал.Версия85 Тогда
ВызватьИсключение "Скалярный паспорт исходных записей формы изменился";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьЗапись85(Объект, Задача) Экспорт
ПроверитьСтенд85();
ПроверитьОбъект85(Объект, Задача);
Вид = ПрочитатьВид85(Задача);
Если Не Объект.Копия85 Тогда
Разрешение = Неопределено;
Если Не Объект.ЭтоНовый() Или Вид.Оригинал <> Неопределено Или Вид.Копия <> Неопределено
Или Не Объект.Оригинал85.Пустая() Или Объект.Количество85 <> 2
Или Не Объект.ДополнительныеСвойства.Свойство("Подготовка85", Разрешение)
Или Разрешение <> "f956035f-bf9c-4756-b7f8-85c56562aa32" Тогда
ВызватьИсключение "Первая запись оригинала допускается только своей подготовкой";
КонецЕсли;
Другой = ПрочитатьВид85(Не Задача);
Если (Задача И (Другой.Оригинал = Неопределено Или Другой.Копия <> Неопределено))
Или (Не Задача И Другой.Оригинал <> Неопределено) Тогда
ВызватьИсключение "Нарушен порядок единственной подготовки БП, затем задачи";
КонецЕсли;
Возврат;
КонецЕсли;
Весь = Источник85();
Если Объект.Оригинал85 <> Вид.Оригинал.Ссылка Тогда
ВызватьИсключение "Копия другого оригинала";
КонецЕсли;
Если Объект.ЭтоНовый() Тогда
Если Вид.Копия <> Неопределено Или Объект.Количество85 <> 3 Тогда
ВызватьИсключение "Разрешена одна первая копия с количеством3";
КонецЕсли;
Иначе
Если Вид.Копия = Неопределено Тогда
ВызватьИсключение "Своя копия не найдена";
КонецЕсли;
Если Вид.Копия.Ссылка <> Объект.Ссылка Или Вид.Копия.Количество85 = Объект.Количество85
Или (Объект.Количество85 <> 3 И Объект.Количество85 <> 4) Тогда
ВызватьИсключение "Можно изменить только свою сохранённую копию3→4 или4→3";
КонецЕсли;
КонецЕсли;
Если Весь.Пользователь <> ПроверитьСтенд85() Тогда
ВызватьИсключение "Пользователь изменился перед записью";
КонецЕсли;
КонецПроцедуры
Функция Подготовить85(Согласие) Экспорт
Если Согласие <> Истина Тогда
ВызватьИсключение "Подтвердите единственную подготовку своего нового стенда";
КонецЕсли;
ПроверитьСтенд85();
БП = ПрочитатьВид85(Ложь);
СостояниеЗадач = ПрочитатьВид85(Истина);
Если БП.Оригинал <> Неопределено Или СостояниеЗадач.Оригинал <> Неопределено Тогда
ВызватьИсключение "Подготовка не повторяется даже после частичного отказа";
КонецЕсли;
Процесс = БизнесПроцессы.Заявка85.СоздатьБизнесПроцесс();
Процесс.Дата = Дата(2026, 10, 10, 12, 0, 0);
Процесс.Маркер85 = "f956035f-bf9c-4756-b7f8-85c56562aa32";
Процесс.Копия85 = Ложь;
Процесс.Количество85 = 2;
Процесс.Цена85 = 500;
Процесс.Сумма85 = 1000;
Процесс.ДополнительныеСвойства.Вставить("Подготовка85", Процесс.Маркер85);
ПроверитьЗапись85(Процесс, Ложь);
Процесс.Записать();
Задача = Задачи.Поручение85.СоздатьЗадачу();
Задача.Дата = Дата(2026, 10, 10, 12, 0, 0);
Задача.Наименование = "Исходный план работ85";
Задача.Маркер85 = Процесс.Маркер85;
Задача.Копия85 = Ложь;
Задача.Количество85 = 2;
Задача.Цена85 = 50;
Задача.Сумма85 = 100;
Задача.ДополнительныеСвойства.Вставить("Подготовка85", Задача.Маркер85);
ПроверитьЗапись85(Задача, Истина);
Задача.Записать();
Возврат Источник85();
КонецФункцииОбычный пульт
Общие формы → ПультОбычный85 → Модуль
Обычный толстый клиент Windows; своя общая форма и реальные кнопки.
Перем Остановка85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
ПланПоручений85.ПроверитьСтенд85();
Остановка85 = Ложь;
Согласие85 = Ложь;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Действие85(Кнопка)
Если Остановка85 Или Не Согласие85 Или (Кнопка <> ЭлементыФормы.Подготовить85 И Кнопка <> ЭлементыФормы.БП85 И Кнопка <> ЭлементыФормы.Задача85) Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или нет согласия";
КонецЕсли;
Попытка
Если Кнопка = ЭлементыФормы.Подготовить85 Тогда
Источник = ПланПоручений85.Подготовить85(Согласие85);
Протокол85 = "Два сохранённых оригинала: бюджет1000, стоимость работ100. Их настоящие номера: "
+ Источник.БП.Оригинал.Номер + ", " + Источник.Задачи.Оригинал.Номер;
Иначе
Форма = ПолучитьОбщуюФорму(?(Кнопка = ЭлементыФормы.БП85, "ПланБПОбычный85", "ПланЗадачиОбычный85"), ЭтаФорма, Новый УникальныйИдентификатор);
Если Форма = Неопределено Тогда
ВызватьИсключение "Своя форма управления не создана";
КонецЕсли;
Если ТипЗнч(Форма) <> Тип("Форма") Или Форма.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Не своя обычная форма";
КонецЕсли;
Форма.Открыть();
КонецЕсли;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыУправляемый пульт выбора
Общие формы → ПультУправляемый85 → Модуль
Управляемый толстый клиент Windows/сервер по директивам; владелец своей действительной дочерней формы.
Перем Дочерняя85;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
До85 = ПланПоручений85.Источник85();
Если До85.БП.Копия = Неопределено Или До85.Задачи.Копия = Неопределено Тогда
ВызватьИсключение "Сначала завершите обе обычные части";
КонецЕсли;
Пользователь85 = Строка(До85.Пользователь);
ИсходнаяБП85 = До85.БП.Оригинал.Ссылка;
НомерБП85 = До85.БП.Оригинал.Номер;
ВерсияБП85 = До85.БП.Оригинал.Версия85;
ИсходнаяЗадача85 = До85.Задачи.Оригинал.Ссылка;
НомерЗадачи85 = До85.Задачи.Оригинал.Номер;
ВерсияЗадачи85 = До85.Задачи.Оригинал.Версия85;
КопияБП85 = До85.БП.Копия.Ссылка;
КопияЗадачи85 = До85.Задачи.Копия.Ссылка;
Согласие85 = Ложь;
Остановка85 = Ложь;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Открыть85(Команда)
Если Остановка85 Или Не Согласие85 Или Дочерняя85 <> Неопределено Тогда
Остановка85 = Истина;
ВызватьИсключение "Одна собственная дочерняя форма на новый пульт";
КонецЕсли;
Попытка
Задача85 = Команда.Имя = "Задача85";
Если Не Задача85 И Команда.Имя <> "БП85" Тогда
ВызватьИсключение "Неизвестная команда";
КонецЕсли;
СвояСсылка85 = ?(Задача85, КопияЗадачи85, КопияБП85);
Имя = ?(Задача85, "Задача.Поручение85.Форма.РедакторУправляемый85", "БизнесПроцесс.Заявка85.Форма.РедакторУправляемый85");
Дочерняя85 = ПолучитьФорму(Имя, Новый Структура("Ключ", СвояСсылка85), ЭтаФорма, Истина);
Если Дочерняя85 = Неопределено Тогда
ВызватьИсключение "Форма не создана";
КонецЕсли;
Если ТипЗнч(Дочерняя85) <> Тип("ФормаКлиентскогоПриложения") Или Дочерняя85.ВладелецФормы <> ЭтаФорма
Или Дочерняя85.Объект.Ссылка <> СвояСсылка85 Тогда
ВызватьИсключение "Реальный Ключ не загрузил собственную существующую копию";
КонецЕсли;
Принято85 = Ложь;
Дочерняя85.Открыть();
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПроверитьВыбор85(Ссылка)
После = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьСкалярныйПаспорт85(Пользователь85, ИсходнаяБП85, НомерБП85, ВерсияБП85, ИсходнаяЗадача85, НомерЗадачи85, ВерсияЗадачи85, После);
Запись = ?(Задача85, После.Задачи.Копия, После.БП.Копия);
Если Запись.Ссылка <> Ссылка Или Ссылка <> СвояСсылка85 Или Запись.Сумма85 <> ?(Задача85, 150, 1500) Тогда
ВызватьИсключение "Передан не свой проверенный план в конечном состоянии";
КонецЕсли;
Возврат Запись;
КонецФункции
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) <> Тип(?(Задача85, "ЗадачаСсылка.Поручение85", "БизнесПроцессСсылка.Заявка85"))
Или ТипЗнч(ИсточникВыбора) <> Тип("ФормаКлиентскогоПриложения") Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестный тип значения или источника выбора";
КонецЕсли;
Если Остановка85 Или Принято85 Или ИсточникВыбора <> Дочерняя85 Или ВыбранноеЗначение <> СвояСсылка85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестный источник, значение или повторный callback";
КонецЕсли;
Попытка
Запись = ПроверитьВыбор85(ВыбранноеЗначение);
Принято85 = Истина;
Протокол85 = "Принята своя реальная ссылка: номер " + Запись.Номер + "; сумма " + Формат(Запись.Сумма85, "ЧГ=0;ЧДЦ=0") + ". Это план, не выполненная задача или запущенный процесс.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыЗаявка85 объектный контроль записи
Бизнес-процессы → Заявка85 → Модуль объекта
Сервер/толстый клиент своего объекта, native BeforeWrite1 после начала транзакции.
Процедура ПередЗаписью(Отказ)
Попытка
ПланПоручений85.ПроверитьЗапись85(ЭтотОбъект, Ложь);
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыЗаявка85 обычный редактор копии
Бизнес-процессы → Заявка85 → Формы → РедакторОбычный85 → Модуль
Обычный толстый клиент; настоящий основной реквизит Запись85 и native FormBeforeWrite1.
Перем СвоёОснование85, СвойОригинал85, Остановка85, До85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если ТипЗнч(Запись85) <> Тип("БизнесПроцессОбъект.Заявка85") Или Не Запись85.ЭтоНовый()
Или ЭтаФорма.Автонумерация <> АвтонумерацияВФорме.НеИспользовать Тогда
ВызватьИсключение "Нужен редактор своей новой копии с указанной политикой нумерации";
КонецЕсли;
Источник = ПланПоручений85.Источник85();
До85 = Источник;
СвойОригинал85 = ЭтаФорма.ПараметрОбъектКопирования;
СвоёОснование85 = ЭтаФорма.ПараметрОснование;
Если СвойОригинал85 <> Источник.БП.Оригинал.Ссылка Или СвоёОснование85 <> Источник.Задачи.Оригинал.Ссылка
Или Запись85.Оригинал85 <> СвойОригинал85 Тогда
ВызватьИсключение "Параметры не относятся к своим исходным записям";
КонецЕсли;
Остановка85 = Ложь;
Паспорт85 = "Своя копия своего оригинала; основание проверено собственным кодом, не автоматическим заполнением платформы.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьПаспорт85(Копия, Оригинал, Основание) Экспорт
Если Остановка85 Или Запись85 <> Копия Или СвойОригинал85 <> Оригинал Или СвоёОснование85 <> Основание
Или ЭтаФорма.ПараметрОбъектКопирования <> Оригинал Или ЭтаФорма.ПараметрОснование <> Основание Тогда
Остановка85 = Истина;
ВызватьИсключение "Паспорт или собственный объект формы изменены";
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Попытка
ПроверитьПаспорт85(Запись85, СвойОригинал85, СвоёОснование85);
ПланПоручений85.ПроверитьИсходные85(До85, ПланПоручений85.Источник85());
ПланПоручений85.ПроверитьЗапись85(Запись85, Ложь);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыЗаявка85 обычный список
Бизнес-процессы → Заявка85 → Формы → СписокОбычный85 → Модуль
Обычный толстый клиент; настоящий основной Список85 и native table data binding.
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Источник = ПланПоручений85.Источник85();
Если Источник.БП.Копия = Неопределено Тогда
ВызватьИсключение "Сначала сохраните свою копию";
КонецЕсли;
Если ТипЗнч(Список85) <> Тип("БизнесПроцессСписок.Заявка85") Или ЭтаФорма.ПараметрТекущаяСтрока <> Источник.БП.Копия.Ссылка
Или ЭлементыФормы.Строки85.Данные <> "Список85" Или ЭлементыФормы.Строки85.Значение <> Список85 Тогда
ВызватьИсключение "Не свой типизированный список с настоящей привязкой таблицы";
КонецЕсли;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыЗаявка85 полный обычный MAIN этого стенда
Общие формы → ПланБПОбычный85 → Модуль
Обычный толстый клиент; полный модуль своего контроллера из отдельной карточки этого же стенда.
Перем Остановка85, Этап85, До85, Редактор85, Журнал85, СвояСсылка85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Нужно обычное приложение";
КонецЕсли;
До85 = ПланПоручений85.Источник85();
Если До85.БП.Копия <> Неопределено Тогда
ВызватьИсключение "Свою копию этого вида уже создали; повтор не допускается";
КонецЕсли;
Согласие85 = Ложь;
Этап85 = 0;
Остановка85 = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Шаг85(Кнопка)
Если Остановка85 Или Не Согласие85 Или Кнопка <> ЭлементыФормы.Шаг85 Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2) Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестный шаг, нет согласия или процесс остановлен";
КонецЕсли;
Попытка
Сейчас = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьИсходные85(До85, Сейчас);
Если Этап85 = 0 Тогда
Если Сейчас.БП.Копия <> Неопределено Тогда
ВызватьИсключение "Первая копия уже существует";
КонецЕсли;
Копия = Сейчас.БП.Оригинал.Ссылка.ПолучитьОбъект().Скопировать();
Если ТипЗнч(Копия) <> Тип("БизнесПроцессОбъект.Заявка85") Или Не Копия.ЭтоНовый() Тогда
ВызватьИсключение "Фабрика не вернула свой новый объект";
КонецЕсли;
Копия.Копия85 = Истина;
Копия.Номер = "";
Копия.Оригинал85 = Сейчас.БП.Оригинал.Ссылка;
Копия.Количество85 = 3;
Копия.Сумма85 = 3 * Копия.Цена85;
ПланПоручений85.ПроверитьЗапись85(Копия, Ложь);
Редактор85 = Копия.ПолучитьФорму("РедакторОбычный85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Редактор85 = Неопределено Тогда
ВызватьИсключение "Своя форма не создана";
КонецЕсли;
Если ТипЗнч(Редактор85) <> Тип("Форма") Или Редактор85.ВладелецФормы <> ЭтаФорма Или Редактор85.Запись85 <> Копия Тогда
ВызватьИсключение "Форма не принадлежит своему экземпляру";
КонецЕсли;
Редактор85.Автонумерация = АвтонумерацияВФорме.НеИспользовать;
Редактор85.ПараметрОбъектКопирования = Копия.Оригинал85;
Редактор85.ПараметрОснование = Сейчас.Задачи.Оригинал.Ссылка;
Редактор85.Открыть();
Редактор85.ПроверитьПаспорт85(Копия, Копия.Оригинал85, Сейчас.Задачи.Оригинал.Ссылка);
ПланПоручений85.ПроверитьИсходные85(До85, ПланПоручений85.Источник85());
Если Не Редактор85.ЗаписатьВФорме() Тогда
ВызватьИсключение "Запись копии отменена; повтор запрещён";
КонецЕсли;
После = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьИсходные85(До85, После);
Если После.БП.Копия = Неопределено Тогда
ВызватьИсключение "Своя копия не появилась в реальной базе";
КонецЕсли;
Если После.БП.Копия.Ссылка <> Копия.Ссылка Или После.БП.Копия.Сумма85 <> 1500
Или После.БП.Итог <> 2500 Или Копия.ЭтоНовый() Или После.БП.Копия.Номер <> Копия.Номер Тогда
ВызватьИсключение "Запись/номер/сумма своей копии не подтверждены";
КонецЕсли;
СвояСсылка85 = Копия.Ссылка;
Протокол85 = "Своя сохранённая копия: номер " + Копия.Номер + ", сумма 1500. Закройте её редактор и выполните следующий шаг.";
Этап85 = 1;
ИначеЕсли Этап85 = 1 Тогда
Если Редактор85.Открыта() Или Сейчас.БП.Копия.Ссылка <> СвояСсылка85 Или Сейчас.БП.Копия.Сумма85 <> 1500 Тогда
ВызватьИсключение "Закройте свой редактор; данные копии должны остаться прежними";
КонецЕсли;
Журнал85 = БизнесПроцессы.Заявка85.ПолучитьФормуСписка("СписокОбычный85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Журнал85 = Неопределено Тогда
ВызватьИсключение "Свой список не создан";
КонецЕсли;
Если ТипЗнч(Журнал85) <> Тип("Форма") Или Журнал85.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Другой источник списка";
КонецЕсли;
Журнал85.ПараметрТекущаяСтрока = СвояСсылка85;
Журнал85.Открыть();
Протокол85 = "В своём поле Выбор85 введите сохранённый номер копии и нажмите Enter. Дождитесь реальной текущей строки списка, затем снова Шаг85.";
Этап85 = 2;
Иначе
Поле = Журнал85.ЭлементыФормы.Строки85;
Ввод = ЭлементыФормы.Выбор85;
Если Ввод.Данные <> "Выбранный85" Или Ввод.Значение <> Выбранный85 Или Выбранный85 <> СвояСсылка85
Или Поле.Данные <> "Список85" Или Поле.Значение <> Журнал85.Список85
Или Поле.ТекущаяСтрока <> СвояСсылка85 Тогда
ВызватьИсключение "Не доставлены настоящие свои ссылка и строка; запросом их не заменяем";
КонецЕсли;
Ячейки = Поле.ТекущиеДанные;
Если Ячейки = Неопределено Тогда
ВызватьИсключение "Текущие данные GUI ещё отсутствуют";
КонецЕсли;
Запись = Сейчас.БП.Копия;
Если Запись.Ссылка <> СвояСсылка85 Или Ячейки.Ссылка <> Запись.Ссылка Или Ячейки.Номер <> Запись.Номер
Или Ячейки.Дата <> Запись.Дата Или Ячейки.Маркер85 <> Запись.Маркер85 Или Ячейки.Копия85 <> Запись.Копия85
Или Ячейки.Оригинал85 <> Запись.Оригинал85 Или Ячейки.Количество85 <> Запись.Количество85
Или Ячейки.Цена85 <> Запись.Цена85 Или Ячейки.Сумма85 <> Запись.Сумма85 Тогда
ВызватьИсключение "Реальная текущая строка GUI отличается от своей полной записи";
КонецЕсли;
Этап85 = 3;
Протокол85 = "Выбран настоящий номер " + Ячейки.Номер + "; GUI-сумма 1500, полный источник 2500. Это план, не выполнение маршрута.";
КонецЕсли;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыЗаявка85 полный управляемый MAIN этого стенда
Бизнес-процессы → Заявка85 → Формы → РедакторУправляемый85 → Модуль
Управляемый толстый клиент/сервер по директивам; полный модуль своего объекта из отдельной карточки этого же стенда.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
До85 = ПланПоручений85.Источник85();
Если До85.БП.Копия = Неопределено Тогда
ВызватьИсключение "Сначала создайте свою копию в обычном приложении";
КонецЕсли;
Пользователь85 = Строка(До85.Пользователь);
ИсходнаяБП85 = До85.БП.Оригинал.Ссылка;
НомерБП85 = До85.БП.Оригинал.Номер;
ВерсияБП85 = До85.БП.Оригинал.Версия85;
ИсходнаяЗадача85 = До85.Задачи.Оригинал.Ссылка;
НомерЗадачи85 = До85.Задачи.Оригинал.Номер;
ВерсияЗадачи85 = До85.Задачи.Оригинал.Версия85;
СвояСсылка85 = До85.БП.Копия.Ссылка;
Если Параметры.Ключ <> СвояСсылка85 Или Объект.Ссылка <> СвояСсылка85 Или Объект.Сумма85 <> 1500 Тогда
ВызватьИсключение "Форма должна загрузить свою существующую копию по правильному Ключ";
КонецЕсли;
Согласие85 = Ложь;
Этап85 = 0;
Остановка85 = Ложь;
Передано85 = Ложь;
ЭтаФорма.ПараметрыВыбора = Новый ФиксированнаяСтруктура(Новый Структура("Маркер85,Копия85", "f956035f-bf9c-4756-b7f8-85c56562aa32", Истина));
ЭтаФорма.ВыборДоступен = Ложь;
ЭтаФорма.РежимВыбора = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПроверитьНаСервере85(Сумма)
Если Остановка85 Тогда
ВызватьИсключение "Свой процесс уже остановлен";
КонецЕсли;
Сейчас = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьСкалярныйПаспорт85(Пользователь85, ИсходнаяБП85, НомерБП85, ВерсияБП85, ИсходнаяЗадача85, НомерЗадачи85, ВерсияЗадачи85, Сейчас);
Если Сейчас.БП.Копия = Неопределено Тогда
ВызватьИсключение "Своя копия исчезла";
КонецЕсли;
Запись = Сейчас.БП.Копия;
Если Запись.Ссылка <> СвояСсылка85 Или Объект.Ссылка <> СвояСсылка85 Или Запись.Сумма85 <> Сумма Тогда
ВызватьИсключение "Не своё ожидаемое сохранённое состояние";
КонецЕсли;
Возврат Запись;
КонецФункции
&НаКлиенте
Процедура Шаг85(Команда)
Если Остановка85 Или Не Согласие85 Или Команда.Имя <> "Шаг85" Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2 И Этап85 <> 3) Тогда
Остановка85 = Истина;
ВызватьИсключение "Нужно согласие и известный следующий шаг";
КонецЕсли;
Попытка
Если Этап85 = 0 Или Этап85 = 2 Тогда
Запись = ПроверитьНаСервере85(?(Этап85 = 0, 1500, 2000));
ПроверитьДанные85(Запись);
Объект.Количество85 = ?(Этап85 = 0, 4, 3);
Объект.Сумма85 = Объект.Количество85 * Объект.Цена85;
Если Не ЭтаФорма.Записать(Новый Структура("Старт,Маркер85", Ложь, Объект.Маркер85)) Тогда
ВызватьИсключение "Запись отменена; повтор и откат не выполняются";
КонецЕсли;
Запись = ПроверитьНаСервере85(?(Этап85 = 0, 2000, 1500));
ПроверитьДанные85(Запись);
Этап85 = Этап85 + 1;
ИначеЕсли Этап85 = 1 Тогда
Запись = ПроверитьНаСервере85(2000);
ПроверитьДанные85(Запись);
Объект.Количество85 = 5;
Объект.Сумма85 = 5 * Объект.Цена85;
Если Объект.Ссылка <> СвояСсылка85 Или Объект.Количество85 <> 5 Или Объект.Сумма85 <> 2500 Тогда
ВызватьИсключение "Не известный собственный несохранённый буфер";
КонецЕсли;
ЭтаФорма.Прочитать();
Запись = ПроверитьНаСервере85(2000);
ПроверитьДанные85(Запись);
Этап85 = 2;
Иначе
Запись = ПроверитьНаСервере85(1500);
ПроверитьДанные85(Запись);
Ссылка85 = ЭтаФорма.ПолучитьНавигационнуюСсылкуОбъекта();
Если ТипЗнч(Ссылка85) <> Тип("Строка") Или Ссылка85 = "" Или Ссылка85 <> ПолучитьНавигационнуюСсылку(СвояСсылка85) Тогда
ВызватьИсключение "Не навигационная ссылка своей настоящей записи";
КонецЕсли;
Если ЭтаФорма.ПараметрыВыбора.Маркер85 <> Объект.Маркер85 Или ЭтаФорма.ПараметрыВыбора.Копия85 <> Объект.Копия85 Тогда
ВызватьИсключение "Изменена собственная политика передачи плана";
КонецЕсли;
ЭтаФорма.ВыборДоступен = Объект.Сумма85 = 1500;
ЭтаФорма.РежимВыбора = Истина;
Если Не ЭтаФорма.ВыборДоступен Или Не ЭтаФорма.РежимВыбора Тогда
ВызватьИсключение "Передача плана не разрешена своим проверенным состоянием";
КонецЕсли;
Этап85 = 4;
Протокол85 = "Бюфер перечитан, копия восстановлена в 1500. Ссылка: " + Ссылка85 + ". Теперь отдельная команда Передать85.";
КонецЕсли;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьДанные85(Запись)
Если Объект.Ссылка <> Запись.Ссылка Или Объект.Номер <> Запись.Номер Или Объект.Дата <> Запись.Дата
Или Объект.Маркер85 <> Запись.Маркер85 Или Объект.Копия85 <> Запись.Копия85 Или Объект.Оригинал85 <> Запись.Оригинал85
Или Объект.Количество85 <> Запись.Количество85 Или Объект.Цена85 <> Запись.Цена85 Или Объект.Сумма85 <> Запись.Сумма85 Тогда
ВызватьИсключение "Реальные данные основной формы отличаются от своей записи";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Попытка
Если Остановка85 Или Не Согласие85 Или (Этап85 <> 0 И Этап85 <> 2) Или Объект.Ссылка <> СвояСсылка85
Или ПараметрыЗаписи.Старт <> Ложь Или ПараметрыЗаписи.Маркер85 <> Объект.Маркер85 Тогда
ВызватьИсключение "Клиентская запись не соответствует своему известному шагу";
КонецЕсли;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Попытка
Если Остановка85 Или Не Согласие85 Или (Этап85 <> 0 И Этап85 <> 2)
Или ТекущийОбъект.Ссылка <> СвояСсылка85 Или ПараметрыЗаписи.Старт <> Ложь
Или ПараметрыЗаписи.Маркер85 <> ТекущийОбъект.Маркер85 Или ТекущийОбъект.Количество85 <> ?(Этап85 = 0, 4, 3) Тогда
ВызватьИсключение "Чужой объект, остановленный шаг или попытка запуска/выполнения";
КонецЕсли;
ПланПоручений85.ПроверитьСкалярныйПаспорт85(Пользователь85, ИсходнаяБП85, НомерБП85, ВерсияБП85, ИсходнаяЗадача85, НомерЗадачи85, ВерсияЗадачи85, ПланПоручений85.Источник85());
ПланПоручений85.ПроверитьЗапись85(ТекущийОбъект, Ложь);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Передать85(Команда)
Если Остановка85 Или Не Согласие85 Или Команда.Имя <> "Передать85" Или Этап85 <> 4 Или Передано85 Или Не ЭтаФорма.РежимВыбора Или Не ЭтаФорма.ВыборДоступен Тогда
Остановка85 = Истина;
ВызватьИсключение "Передача допускается один раз после полной проверки своего плана";
КонецЕсли;
Попытка
Запись = ПроверитьНаСервере85(1500);
ПроверитьДанные85(Запись);
Если ЭтаФорма.ПараметрыВыбора.Маркер85 <> Запись.Маркер85 Или ЭтаФорма.ПараметрыВыбора.Копия85 <> Истина Тогда
ВызватьИсключение "Чужие параметры выбора";
КонецЕсли;
ЭтаФорма.РежимВыбора = Ложь;
Если ЭтаФорма.РежимВыбора Тогда
ВызватьИсключение "Автоматическая передача при закрытии не отключена";
КонецЕсли;
Передано85 = Истина;
ОповеститьОВыборе(СвояСсылка85);
Протокол85 = "Собственному владельцу передана настоящая ссылка; закрытие не должно автоматически передавать второй результат.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВыборЗначения(СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Остановка85 = Истина;
ВызватьИсключение "Стандартный выбор при закрытии не используется; примените собственную проверенную передачу";
КонецПроцедурыПоручение85 объектный контроль записи
Задачи → Поручение85 → Модуль объекта
Сервер/толстый клиент своего объекта, native BeforeWrite1 после начала транзакции.
Процедура ПередЗаписью(Отказ)
Попытка
ПланПоручений85.ПроверитьЗапись85(ЭтотОбъект, Истина);
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПоручение85 обычный редактор копии
Задачи → Поручение85 → Формы → РедакторОбычный85 → Модуль
Обычный толстый клиент; настоящий основной реквизит Запись85 и native FormBeforeWrite1.
Перем СвоёОснование85, СвойОригинал85, Остановка85, До85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если ТипЗнч(Запись85) <> Тип("ЗадачаОбъект.Поручение85") Или Не Запись85.ЭтоНовый()
Или ЭтаФорма.Автонумерация <> АвтонумерацияВФорме.НеИспользовать Тогда
ВызватьИсключение "Нужен редактор своей новой копии с указанной политикой нумерации";
КонецЕсли;
Источник = ПланПоручений85.Источник85();
До85 = Источник;
СвойОригинал85 = ЭтаФорма.ПараметрОбъектКопирования;
СвоёОснование85 = ЭтаФорма.ПараметрОснование;
Если СвойОригинал85 <> Источник.Задачи.Оригинал.Ссылка Или СвоёОснование85 <> Источник.БП.Оригинал.Ссылка
Или Запись85.Оригинал85 <> СвойОригинал85 Тогда
ВызватьИсключение "Параметры не относятся к своим исходным записям";
КонецЕсли;
Остановка85 = Ложь;
Паспорт85 = "Своя копия своего оригинала; основание проверено собственным кодом, не автоматическим заполнением платформы.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьПаспорт85(Копия, Оригинал, Основание) Экспорт
Если Остановка85 Или Запись85 <> Копия Или СвойОригинал85 <> Оригинал Или СвоёОснование85 <> Основание
Или ЭтаФорма.ПараметрОбъектКопирования <> Оригинал Или ЭтаФорма.ПараметрОснование <> Основание Тогда
Остановка85 = Истина;
ВызватьИсключение "Паспорт или собственный объект формы изменены";
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Попытка
ПроверитьПаспорт85(Запись85, СвойОригинал85, СвоёОснование85);
ПланПоручений85.ПроверитьИсходные85(До85, ПланПоручений85.Источник85());
ПланПоручений85.ПроверитьЗапись85(Запись85, Истина);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПоручение85 обычный список
Задачи → Поручение85 → Формы → СписокОбычный85 → Модуль
Обычный толстый клиент; настоящий основной Список85 и native table data binding.
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Источник = ПланПоручений85.Источник85();
Если Источник.Задачи.Копия = Неопределено Тогда
ВызватьИсключение "Сначала сохраните свою копию";
КонецЕсли;
Если ТипЗнч(Список85) <> Тип("ЗадачаСписок.Поручение85") Или ЭтаФорма.ПараметрТекущаяСтрока <> Источник.Задачи.Копия.Ссылка
Или ЭлементыФормы.Строки85.Данные <> "Список85" Или ЭлементыФормы.Строки85.Значение <> Список85 Тогда
ВызватьИсключение "Не свой типизированный список с настоящей привязкой таблицы";
КонецЕсли;
ЭлементыФормы.Строки85.ОтображениеЗадач = РежимСпискаЗадач.ВсеЗадачи;
Если ЭлементыФормы.Строки85.ОтображениеЗадач <> РежимСпискаЗадач.ВсеЗадачи Тогда
ВызватьИсключение "Свой список не переключён на все собственные задачи";
КонецЕсли;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПоручение85 полный обычный MAIN этого стенда
Общие формы → ПланЗадачиОбычный85 → Модуль
Обычный толстый клиент; полный модуль своего контроллера из отдельной карточки этого же стенда.
Перем Остановка85, Этап85, До85, Редактор85, Журнал85, СвояСсылка85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Нужно обычное приложение";
КонецЕсли;
До85 = ПланПоручений85.Источник85();
Если До85.Задачи.Копия <> Неопределено Тогда
ВызватьИсключение "Свою копию этого вида уже создали; повтор не допускается";
КонецЕсли;
Согласие85 = Ложь;
Этап85 = 0;
Остановка85 = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Шаг85(Кнопка)
Если Остановка85 Или Не Согласие85 Или Кнопка <> ЭлементыФормы.Шаг85 Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2) Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестный шаг, нет согласия или процесс остановлен";
КонецЕсли;
Попытка
Сейчас = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьИсходные85(До85, Сейчас);
Если Этап85 = 0 Тогда
Если Сейчас.Задачи.Копия <> Неопределено Тогда
ВызватьИсключение "Первая копия уже существует";
КонецЕсли;
Менеджеры = Задачи;
Если ТипЗнч(Менеджеры) <> Тип("ЗадачиМенеджер") Или Не Менеджеры.ТипВсеСсылки().СодержитТип(ТипЗнч(Сейчас.Задачи.Оригинал.Ссылка)) Тогда
ВызватьИсключение "Ссылка не входит в настоящие типы задач своего стенда";
КонецЕсли;
Копия = Сейчас.Задачи.Оригинал.Ссылка.ПолучитьОбъект().Скопировать();
Если ТипЗнч(Копия) <> Тип("ЗадачаОбъект.Поручение85") Или Не Копия.ЭтоНовый() Тогда
ВызватьИсключение "Фабрика не вернула свой новый объект";
КонецЕсли;
Копия.Копия85 = Истина;
Копия.Номер = "";
Копия.Оригинал85 = Сейчас.Задачи.Оригинал.Ссылка;
Копия.Количество85 = 3;
Копия.Сумма85 = 3 * Копия.Цена85;
Копия.Наименование = "Копия плана работ85";
ПланПоручений85.ПроверитьЗапись85(Копия, Истина);
Редактор85 = Копия.ПолучитьФорму("РедакторОбычный85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Редактор85 = Неопределено Тогда
ВызватьИсключение "Своя форма не создана";
КонецЕсли;
Если ТипЗнч(Редактор85) <> Тип("Форма") Или Редактор85.ВладелецФормы <> ЭтаФорма Или Редактор85.Запись85 <> Копия Тогда
ВызватьИсключение "Форма не принадлежит своему экземпляру";
КонецЕсли;
Редактор85.Автонумерация = АвтонумерацияВФорме.НеИспользовать;
Редактор85.ПараметрОбъектКопирования = Копия.Оригинал85;
Редактор85.ПараметрОснование = Сейчас.БП.Оригинал.Ссылка;
Редактор85.Открыть();
Редактор85.ПроверитьПаспорт85(Копия, Копия.Оригинал85, Сейчас.БП.Оригинал.Ссылка);
ПланПоручений85.ПроверитьИсходные85(До85, ПланПоручений85.Источник85());
Если Не Редактор85.ЗаписатьВФорме() Тогда
ВызватьИсключение "Запись копии отменена; повтор запрещён";
КонецЕсли;
После = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьИсходные85(До85, После);
Если После.Задачи.Копия = Неопределено Тогда
ВызватьИсключение "Своя копия не появилась в реальной базе";
КонецЕсли;
Если После.Задачи.Копия.Ссылка <> Копия.Ссылка Или После.Задачи.Копия.Сумма85 <> 150
Или После.Задачи.Итог <> 250 Или Копия.ЭтоНовый() Или После.Задачи.Копия.Номер <> Копия.Номер Тогда
ВызватьИсключение "Запись/номер/сумма своей копии не подтверждены";
КонецЕсли;
СвояСсылка85 = Копия.Ссылка;
Протокол85 = "Своя сохранённая копия: номер " + Копия.Номер + ", сумма 150. Закройте её редактор и выполните следующий шаг.";
Этап85 = 1;
ИначеЕсли Этап85 = 1 Тогда
Если Редактор85.Открыта() Или Сейчас.Задачи.Копия.Ссылка <> СвояСсылка85 Или Сейчас.Задачи.Копия.Сумма85 <> 150 Тогда
ВызватьИсключение "Закройте свой редактор; данные копии должны остаться прежними";
КонецЕсли;
Журнал85 = Задачи.Поручение85.ПолучитьФормуСписка("СписокОбычный85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Журнал85 = Неопределено Тогда
ВызватьИсключение "Свой список не создан";
КонецЕсли;
Если ТипЗнч(Журнал85) <> Тип("Форма") Или Журнал85.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Другой источник списка";
КонецЕсли;
Журнал85.ПараметрТекущаяСтрока = СвояСсылка85;
Журнал85.Открыть();
Протокол85 = "В своём поле Выбор85 введите сохранённый номер копии и нажмите Enter. Дождитесь реальной текущей строки списка, затем снова Шаг85.";
Этап85 = 2;
Иначе
Поле = Журнал85.ЭлементыФормы.Строки85;
Ввод = ЭлементыФормы.Выбор85;
Если Ввод.Данные <> "Выбранный85" Или Ввод.Значение <> Выбранный85 Или Выбранный85 <> СвояСсылка85
Или Поле.Данные <> "Список85" Или Поле.Значение <> Журнал85.Список85
Или Поле.ТекущаяСтрока <> СвояСсылка85 Тогда
ВызватьИсключение "Не доставлены настоящие свои ссылка и строка; запросом их не заменяем";
КонецЕсли;
Если Не Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Ввод.Значение)) Тогда
ВызватьИсключение "Введено значение не из доступных типов задач";
КонецЕсли;
Ячейки = Поле.ТекущиеДанные;
Если Ячейки = Неопределено Тогда
ВызватьИсключение "Текущие данные GUI ещё отсутствуют";
КонецЕсли;
Запись = Сейчас.Задачи.Копия;
Если Запись.Ссылка <> СвояСсылка85 Или Ячейки.Ссылка <> Запись.Ссылка Или Ячейки.Номер <> Запись.Номер
Или Ячейки.Дата <> Запись.Дата Или Ячейки.Маркер85 <> Запись.Маркер85 Или Ячейки.Копия85 <> Запись.Копия85
Или Ячейки.Оригинал85 <> Запись.Оригинал85 Или Ячейки.Количество85 <> Запись.Количество85
Или Ячейки.Цена85 <> Запись.Цена85 Или Ячейки.Сумма85 <> Запись.Сумма85 Тогда
ВызватьИсключение "Реальная текущая строка GUI отличается от своей полной записи";
КонецЕсли;
Этап85 = 3;
Протокол85 = "Выбран настоящий номер " + Ячейки.Номер + "; GUI-сумма 150, полный источник 250. Это план, не выполнение маршрута.";
КонецЕсли;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПоручение85 полный управляемый MAIN этого стенда
Задачи → Поручение85 → Формы → РедакторУправляемый85 → Модуль
Управляемый толстый клиент/сервер по директивам; полный модуль своего объекта из отдельной карточки этого же стенда.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
До85 = ПланПоручений85.Источник85();
Если До85.Задачи.Копия = Неопределено Тогда
ВызватьИсключение "Сначала создайте свою копию в обычном приложении";
КонецЕсли;
Пользователь85 = Строка(До85.Пользователь);
ИсходнаяБП85 = До85.БП.Оригинал.Ссылка;
НомерБП85 = До85.БП.Оригинал.Номер;
ВерсияБП85 = До85.БП.Оригинал.Версия85;
ИсходнаяЗадача85 = До85.Задачи.Оригинал.Ссылка;
НомерЗадачи85 = До85.Задачи.Оригинал.Номер;
ВерсияЗадачи85 = До85.Задачи.Оригинал.Версия85;
СвояСсылка85 = До85.Задачи.Копия.Ссылка;
Если Параметры.Ключ <> СвояСсылка85 Или Объект.Ссылка <> СвояСсылка85 Или Объект.Сумма85 <> 150 Тогда
ВызватьИсключение "Форма должна загрузить свою существующую копию по правильному Ключ";
КонецЕсли;
Согласие85 = Ложь;
Этап85 = 0;
Остановка85 = Ложь;
Передано85 = Ложь;
ЭтаФорма.ПараметрыВыбора = Новый ФиксированнаяСтруктура(Новый Структура("Маркер85,Копия85", "f956035f-bf9c-4756-b7f8-85c56562aa32", Истина));
ЭтаФорма.ВыборДоступен = Ложь;
ЭтаФорма.РежимВыбора = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПроверитьНаСервере85(Сумма)
Если Остановка85 Тогда
ВызватьИсключение "Свой процесс уже остановлен";
КонецЕсли;
Сейчас = ПланПоручений85.Источник85();
ПланПоручений85.ПроверитьСкалярныйПаспорт85(Пользователь85, ИсходнаяБП85, НомерБП85, ВерсияБП85, ИсходнаяЗадача85, НомерЗадачи85, ВерсияЗадачи85, Сейчас);
Если Сейчас.Задачи.Копия = Неопределено Тогда
ВызватьИсключение "Своя копия исчезла";
КонецЕсли;
Запись = Сейчас.Задачи.Копия;
Если Запись.Ссылка <> СвояСсылка85 Или Объект.Ссылка <> СвояСсылка85 Или Запись.Сумма85 <> Сумма Тогда
ВызватьИсключение "Не своё ожидаемое сохранённое состояние";
КонецЕсли;
Возврат Запись;
КонецФункции
&НаКлиенте
Процедура Шаг85(Команда)
Если Остановка85 Или Не Согласие85 Или Команда.Имя <> "Шаг85" Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2 И Этап85 <> 3) Тогда
Остановка85 = Истина;
ВызватьИсключение "Нужно согласие и известный следующий шаг";
КонецЕсли;
Попытка
Если Этап85 = 0 Или Этап85 = 2 Тогда
Запись = ПроверитьНаСервере85(?(Этап85 = 0, 150, 200));
ПроверитьДанные85(Запись);
Объект.Количество85 = ?(Этап85 = 0, 4, 3);
Объект.Сумма85 = Объект.Количество85 * Объект.Цена85;
Если Не ЭтаФорма.Записать(Новый Структура("ВыполнитьЗадачу,Маркер85", Ложь, Объект.Маркер85)) Тогда
ВызватьИсключение "Запись отменена; повтор и откат не выполняются";
КонецЕсли;
Запись = ПроверитьНаСервере85(?(Этап85 = 0, 200, 150));
ПроверитьДанные85(Запись);
Этап85 = Этап85 + 1;
ИначеЕсли Этап85 = 1 Тогда
Запись = ПроверитьНаСервере85(200);
ПроверитьДанные85(Запись);
Объект.Количество85 = 5;
Объект.Сумма85 = 5 * Объект.Цена85;
Если Объект.Ссылка <> СвояСсылка85 Или Объект.Количество85 <> 5 Или Объект.Сумма85 <> 250 Тогда
ВызватьИсключение "Не известный собственный несохранённый буфер";
КонецЕсли;
ЭтаФорма.Прочитать();
Запись = ПроверитьНаСервере85(200);
ПроверитьДанные85(Запись);
Этап85 = 2;
Иначе
Запись = ПроверитьНаСервере85(150);
ПроверитьДанные85(Запись);
Ссылка85 = ЭтаФорма.ПолучитьНавигационнуюСсылкуОбъекта();
Если ТипЗнч(Ссылка85) <> Тип("Строка") Или Ссылка85 = "" Или Ссылка85 <> ПолучитьНавигационнуюСсылку(СвояСсылка85) Тогда
ВызватьИсключение "Не навигационная ссылка своей настоящей записи";
КонецЕсли;
Если ЭтаФорма.ПараметрыВыбора.Маркер85 <> Объект.Маркер85 Или ЭтаФорма.ПараметрыВыбора.Копия85 <> Объект.Копия85 Тогда
ВызватьИсключение "Изменена собственная политика передачи плана";
КонецЕсли;
ЭтаФорма.ВыборДоступен = Объект.Сумма85 = 150;
ЭтаФорма.РежимВыбора = Истина;
Если Не ЭтаФорма.ВыборДоступен Или Не ЭтаФорма.РежимВыбора Тогда
ВызватьИсключение "Передача плана не разрешена своим проверенным состоянием";
КонецЕсли;
Этап85 = 4;
Протокол85 = "Бюфер перечитан, копия восстановлена в 150. Ссылка: " + Ссылка85 + ". Теперь отдельная команда Передать85.";
КонецЕсли;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьДанные85(Запись)
Если Объект.Ссылка <> Запись.Ссылка Или Объект.Номер <> Запись.Номер Или Объект.Дата <> Запись.Дата
Или Объект.Маркер85 <> Запись.Маркер85 Или Объект.Копия85 <> Запись.Копия85 Или Объект.Оригинал85 <> Запись.Оригинал85
Или Объект.Количество85 <> Запись.Количество85 Или Объект.Цена85 <> Запись.Цена85 Или Объект.Сумма85 <> Запись.Сумма85 Тогда
ВызватьИсключение "Реальные данные основной формы отличаются от своей записи";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Попытка
Если Остановка85 Или Не Согласие85 Или (Этап85 <> 0 И Этап85 <> 2) Или Объект.Ссылка <> СвояСсылка85
Или ПараметрыЗаписи.ВыполнитьЗадачу <> Ложь Или ПараметрыЗаписи.Маркер85 <> Объект.Маркер85 Тогда
ВызватьИсключение "Клиентская запись не соответствует своему известному шагу";
КонецЕсли;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Попытка
Если Остановка85 Или Не Согласие85 Или (Этап85 <> 0 И Этап85 <> 2)
Или ТекущийОбъект.Ссылка <> СвояСсылка85 Или ПараметрыЗаписи.ВыполнитьЗадачу <> Ложь
Или ПараметрыЗаписи.Маркер85 <> ТекущийОбъект.Маркер85 Или ТекущийОбъект.Количество85 <> ?(Этап85 = 0, 4, 3) Тогда
ВызватьИсключение "Чужой объект, остановленный шаг или попытка запуска/выполнения";
КонецЕсли;
ПланПоручений85.ПроверитьСкалярныйПаспорт85(Пользователь85, ИсходнаяБП85, НомерБП85, ВерсияБП85, ИсходнаяЗадача85, НомерЗадачи85, ВерсияЗадачи85, ПланПоручений85.Источник85());
ПланПоручений85.ПроверитьЗапись85(ТекущийОбъект, Истина);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Передать85(Команда)
Если Остановка85 Или Не Согласие85 Или Команда.Имя <> "Передать85" Или Этап85 <> 4 Или Передано85 Или Не ЭтаФорма.РежимВыбора Или Не ЭтаФорма.ВыборДоступен Тогда
Остановка85 = Истина;
ВызватьИсключение "Передача допускается один раз после полной проверки своего плана";
КонецЕсли;
Попытка
Запись = ПроверитьНаСервере85(150);
ПроверитьДанные85(Запись);
Если ЭтаФорма.ПараметрыВыбора.Маркер85 <> Запись.Маркер85 Или ЭтаФорма.ПараметрыВыбора.Копия85 <> Истина Тогда
ВызватьИсключение "Чужие параметры выбора";
КонецЕсли;
ЭтаФорма.РежимВыбора = Ложь;
Если ЭтаФорма.РежимВыбора Тогда
ВызватьИсключение "Автоматическая передача при закрытии не отключена";
КонецЕсли;
Передано85 = Истина;
ОповеститьОВыборе(СвояСсылка85);
Протокол85 = "Собственному владельцу передана настоящая ссылка; закрытие не должно автоматически передавать второй результат.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВыборЗначения(СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Остановка85 = Истина;
ВызватьИсключение "Стандартный выбор при закрытии не используется; примените собственную проверенную передачу";
КонецПроцедурыМодуль обычного приложения
Модуль обычного приложения
Обычный толстый клиент, реальное событие приложения OnStart0.
Процедура ПриНачалеРаботыСистемы()
ПланПоручений85.ПроверитьСтенд85();
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Нужно обычное приложение";
КонецЕсли;
Форма = ПолучитьОбщуюФорму("ПультОбычный85", , Новый УникальныйИдентификатор);
Если Форма = Неопределено Тогда
ВызватьИсключение "Свой пульт не создан";
КонецЕсли;
Форма.Открыть();
КонецПроцедурыМодуль управляемого приложения
Модуль управляемого приложения
Управляемый толстый клиент, реальное событие приложения OnStart0.
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
ПланПоручений85.ПроверитьСтенд85();
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Тогда
ВызватьИсключение "Нужно управляемое приложение";
КонецЕсли;
Форма = ПолучитьФорму("ОбщаяФорма.ПультУправляемый85", , , Истина);
Если Форма = Неопределено Тогда
ВызватьИсключение "Свой управляемый пульт не создан";
КонецЕсли;
Форма.Открыть();
КонецПроцедурыПолная ручная спецификация собственного стенда
Конфигуратор собственной новой пустой CF
Копируемый видимый JSON для ручного создания метаданных; не готовая выгрузка CF и не выполненное provisioning.
{
"configuration": "УчебныйПланПоручений85",
"CompatibilityMode": "НеИспользовать",
"editorRunMode": "Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска = Управляемое приложение и обычное приложение; это не свойство метаданных",
"DefaultRunMode": "первый запуск ОбычноеПриложение; перед вторым ручным запуском в своей CF УправляемоеПриложение",
"managedSharedScalarAttributes": {"Остановка85": "Булево", "Пользователь85": "Строка36, текст настоящего UUID пользователя ИБ", "ИсходнаяБП85": "БизнесПроцессСсылка.Заявка85", "НомерБП85": "Строка9", "ВерсияБП85": "Строка неограниченная", "ИсходнаяЗадача85": "ЗадачаСсылка.Поручение85", "НомерЗадачи85": "Строка9", "ВерсияЗадачи85": "Строка неограниченная", "СвояСсылка85": "в object-form ссылочный тип её своего вида; в managedhub составной БизнесПроцессСсылка.Заявка85 + ЗадачаСсылка.Поручение85"},
"managedObjectScalarAttributes": {"Этап85": "Число2,0", "Передано85": "Булево"},
"managedHubScalarAttributes": {"Задача85": "Булево", "Принято85": "Булево", "КопияБП85": "БизнесПроцессСсылка.Заявка85", "КопияЗадачи85": "ЗадачаСсылка.Поручение85"},
"commonModule": {"name": "ПланПоручений85", "Server": true, "ServerCall": true, "ClientOrdinaryApplication": false, "ClientManagedApplication": false, "ExternalConnection": false, "Global": false, "Privileged": false, "ReturnValuesReuse": "НеИспользовать"},
"objects": {"БизнесПроцесс.Заявка85": {"Task": "Поручение85", "Route": ["Старт", "План85: одиночное действие без адресации", "Финиш"], "routeHandlers": [], "Number": "Строка9, автонумерация и контроль уникальности", "attributes": {"Маркер85": "Строка36", "Копия85": "Булево", "Оригинал85": "БизнесПроцессСсылка.Заявка85", "Количество85": "Число10,0", "Цена85": "Число15,2", "Сумма85": "Число15,2"}}, "Задача.Поручение85": {"Number": "Строка9, автонумерация и контроль уникальности", "Name": "Строка100", "Addressing": "нет", "attributes": {"Маркер85": "Строка36", "Копия85": "Булево", "Оригинал85": "ЗадачаСсылка.Поручение85", "Количество85": "Число10,0", "Цена85": "Число15,2", "Сумма85": "Число15,2"}}},
"ordinaryControllerForms": {"ПланБПОбычный85": {"Selected85": "Выбранный85: БизнесПроцессСсылка.Заявка85"}, "ПланЗадачиОбычный85": {"Selected85": "Выбранный85: ЗадачаСсылка.Поручение85"}, "shared": {"mainAttribute": "нет", "attributes": {"Согласие85": "Булево, defaultFalse", "Протокол85": "Строка неограниченная, только просмотр"}, "controls": {"Согласие85": "Флажок, Данные=Согласие85", "Выбор85": "ПолеВвода, Данные=Выбранный85, реальный ссылочный тип своего вида", "Протокол85": "ПолеВвода только просмотр, Данные=Протокол85", "Шаг85": "Кнопка, Нажатие=Шаг85"}, "events": {"ПередОткрытием": "ПередОткрытием"}}},
"formsOfEachObject": {"РедакторОбычный85": {"kind": "обычная форма объекта", "mainAttribute": "Запись85: реальный объект соответствующего своего вида, основной реквизит", "controls": "Номер/Дата/Маркер85/Копия85/Оригинал85/Количество85/Цена85/Сумма85 и Паспорт85 Строка неограниченная; все только просмотр", "commands": "удалить стандартные запись/старт/выполнение/удаление; программа пишет своим WriteInForm", "events": {"ПередОткрытием": "ПередОткрытием", "ПередЗаписью": "ПередЗаписью"}}, "СписокОбычный85": {"kind": "обычная форма списка", "mainAttribute": "Список85: БизнесПроцессСписок.Заявка85 или ЗадачаСписок.Поручение85; основной реквизит мастера", "controls": {"Строки85": "ТабличноеПоле, Данные=Список85, ТолькоПросмотр=Истина"}, "columns": ["Ссылка", "Номер", "Дата", "Маркер85", "Копия85", "Оригинал85", "Количество85", "Цена85", "Сумма85"], "eachColumnData": "точно имя поля, без псевдонима", "commands": "не создавать запись, не удалять, не стартовать и не выполнять", "events": {"ПередОткрытием": "ПередОткрытием"}}, "РедакторУправляемый85": {"kind": "управляемая форма объекта", "mainAttribute": "Объект: свой БизнесПроцессОбъект.Заявка85 или ЗадачаОбъект.Поручение85, основной; платформа предоставляет ДанныеФормыСтруктура", "attributes": {"Согласие85": "Булево defaultFalse", "Протокол85": "Строка неограниченная"}, "controls": "поля Объект.Номер/Дата/Маркер85/Копия85/Оригинал85/Количество85/Цена85/Сумма85 только просмотр; флажок Согласие85 и Протокол85", "commands": {"Шаг85": "Действие=Шаг85", "Передать85": "Действие=Передать85"}, "events": {"ПриСозданииНаСервере": "ПриСозданииНаСервере", "ПередЗаписью": "ПередЗаписью", "ПередЗаписьюНаСервере": "ПередЗаписьюНаСервере", "ВыборЗначения": "ВыборЗначения"}, "standardCommands": "удалить запись/старт/выполнение/удаление/выбор; оставить собственные команды"}},
"hubs": {"ПультОбычный85": {"kind": "обычная общая форма", "attributes": "Согласие85 Булево defaultFalse; Протокол85 Строка неограниченная", "buttons": ["Подготовить85", "БП85", "Задача85"], "eachClick": "Действие85", "events": "ПередОткрытием=ПередОткрытием"}, "ПультУправляемый85": {"kind": "управляемая общая форма", "attributes": "Согласие85 Булево defaultFalse; Протокол85 Строка неограниченная", "commands": {"БП85": "Открыть85", "Задача85": "Открыть85"}, "events": {"ПриСозданииНаСервере": "ПриСозданииНаСервере", "ОбработкаВыбора": "ОбработкаВыбора"}}},
"objectEvents": "оба модуля объектов: только приведённый ПередЗаписью(Отказ), без других подписок/обработчиков",
"originals": {"BP": {"quantity": 2, "price": 500, "amount": 1000}, "Task": {"quantity": 2, "price": 50, "amount": 100}, "date": "2026-10-10T12:00:00", "numbers": "реально выделяются платформой при записи; фиксированное значение не угадывается"},
"runtimeVerified": false
}Разбор по шагам
Подготовьте именно свою полную CF и два собственных оригинала; прочитайте все supporting modules/JSON до запуска.
В правильном реальном клиентском режиме подтвердите согласие и выполните последовательные свои шаги. Собственная копия и оригинал — разные настоящие ссылки; реальные номера не угадываются.
Сверьте числовое значение основной формы/GUI с полным свежим источником. Query readback не считается доказательством доставки GUI строки.
При False/Unknown/исключении экземпляр останавливается: без слепого отката, автоматического повтора, удаления и выполнения маршрута.
Как проверить результат
Оригиналы и их реальные версии/номера/refs остаются неизменными, native Started/Completed/Executed не присваиваются.
Основные реквизиты/владельцы/ключи/список/привязки контролов проверяются по настоящим собственным объектам, не по совпадению имени переменной.
managed ClientBeforeWrite2 не содержит серверных вызовов; full fresh guard выполняется native ServerBeforeWrite3 и ObjectBeforeWrite1.
Выбор передаёт явно свою verified ссылку, настоящий owner callback2 и exactSource; неизвестный payload/источник не принимается.
Runtime0: все результаты — ожидания будущего ручного опыта.
Ожидаемый результат
Ожидаемый ручной результат: заявка original1000, copy1500; управляемое изменение1500→2000→1500, весь источник2500→3000→2500. Ни одна задача не выполнена и ни один процесс не стартован.
На что обратить внимание
Обычная Форма и ФормаКлиентскогоПриложения имеют разные расширения/события; extension не конструируется и короткий registry owner не передаётся в Type/New.
АвтонумерацияВФорме.НеИспользовать не выключает выдачу номера при записи: native прямо говорит «номер формируется при записи». Читается действительный номер; UI-поиск использует его.
CopyingObject/Basis использует наш подготовленный обычный редактор; это не доказательство автоматического заполнения платформой.
ПараметрыВыбора/ВыборДоступен участвуют в явно написанной собственной политике передачи; getter/setter не доказывает универсальный фильтр, RLS или пиксели.
Native managed BeforeWrite2 запрещает серверные методы формы с &НаСервере. Не переносите туда свежий серверный guard.
Read0 может отбросить несохранённый буфер: применяется только к известному собственному состоянию. Не означает атомарный rollback.
Проверка соединения — не блокировка других подключений. При частичной первой подготовке ничего не очищается и не повторяется.
Нет запуска маршрута, адресации, внешней почты/сети/печати; разными суммами бюджета и трудозатрат не подменяется учёт исполненного рабочего процесса.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.