Расширение предоставляет возможность автоматического поиска и подбора бизнес-процесса в элементе управления ПолеВвода по введенному тексту. По умолчанию поиск осуществляется по полю "Номер".
Полное описание, параметры и ограничения
Расширение поля ввода ссылки бизнес-процесса (Business process reference text box extension)
Расширение поля ввода ссылки бизнес-процесса (Business process reference text box extension)
Доступен, начиная с версии 8.0.
Описание:
Расширение предоставляет возможность автоматического поиска и подбора бизнес-процесса в элементе управления ПолеВвода по введенному тексту. По умолчанию поиск осуществляется по полю "Номер".
Доступность:
Толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Собственная копия заявки: обычный редактор и проверка реальных данных
Часть одного собственного учебного плана без исполнения маршрута. Реальные фабрики/сохранение/чтение/выбор, отдельные числовые результаты и понятный протокол новичку.
Где и как запускать
Платформа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.
Проверка соединения — не блокировка других подключений. При частичной первой подготовке ничего не очищается и не повторяется.
Нет запуска маршрута, адресации, внешней почты/сети/печати; разными суммами бюджета и трудозатрат не подменяется учёт исполненного рабочего процесса.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.