Расширение формы списка задач

Типы · Task list form extension

Дополнительные свойства объекта Форма в том случае, если основным реквизитом формы является список задач.

Полное описание, параметры и ограничения

Расширение формы списка задач (Task list form extension)

Расширение формы списка задач (Task list form extension)

Доступен, начиная с версии 8.0.

Свойства:
ПараметрТекущаяСтрока (CurrentLineParameter)

Описание:

Дополнительные свойства объекта Форма в том случае, если основным реквизитом формы является список задач.

Доступность:

Толстый клиент.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Собственная копия задачи-плана: обычный редактор и проверка реальных данных

Часть одного собственного учебного плана без исполнения маршрута. Реальные фабрики/сохранение/чтение/выбор, отдельные числовые результаты и понятный протокол новичку.

Где и как запускать

Платформа8.5.1.1343, Windows толстый клиент, ОбычноеПриложение; собственная общая форма-контроллер.

Подготовка

  1. Задача урока — подготовить копию заявки и отдельного плана работ, сравнить обычные и управляемые редакторы и передать проверенную ссылку своему пульту. Это не исполнение бизнес-процесса: Старт, Выполнить и продвижение карты не вызываются; все флаги исполнения только читаются.

  2. Вручную создайте НОВУЮ пустую File-базу C:\1c-labs\OwnWorkflowDraftForms85_f956035f-bf9c-4756-b7f8-85c56562aa32\IB. Существующий каталог не очищайте и не переиспользуйте. Своя конфигурация УчебныйПланПоручений85, Windows 8.5.1.1343, РежимСовместимости=НеИспользовать. UUID в пути — маркер лаборатории, не UUID информационной базы.

  3. В Конфигураторе Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска выберите «Управляемое приложение и обычное приложение». Это настройка редактора, не метаданные SupportedRunModes. Для первого запуска свойство ОсновнойРежимЗапуска=ОбычноеПриложение. Оба опыта выполняются толстым клиентом Windows; тонкий/веб-клиент здесь не обещаются.

  4. Один пользователь План85Ученик со своей ролью полного доступа только к этой CF, включая Администрирование и АктивныеПользователи. Перед каждым опытом закройте Конфигуратор и остальные соединения. Код сверяет count1, текущий номер соединения и настоящий UUID пользователя. Это снимок состояния, не запрет нового подключения и не транзакционная изоляция.

  5. Создайте метаданные строго по видимому JSON-блоку: один БП Заявка85, одна задача Поручение85, один серверный общий модуль ПланПоручений85 и четыре общие формы. Нет иных объектов, подписок, заданий, расширений, обработчиков точек, адресации и внешних действий. Задача-план не является автоматически порождённой задачей маршрута; её БизнесПроцесс и ТочкаМаршрута остаются пустыми.

  6. У БП карта Старт → одиночное действие План85 → Финиш, без адресации/групповых точек/обработчиков. Свойство Задача=Поручение85. Карта нужна для допустимых метаданных, но в этом уроке она не запускается. Номер обоих видов — Строка9, автонумерация и контроль уникальности. Фактические номера после сохранения читает код; он не считает их заранее равными 0001/0002.

  7. Общий модуль — СерверДа, ВызовСервераДа, КлиентОбычноеПриложениеНет, КлиентУправляемоеПриложениеНет, ВнешнееСоединениеНет, ГлобальныйНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначенийНеИспользовать. Вставьте полный COMMON. Он работает с собственными данными, не получает неизвестный пользовательский объект и не содержит UI.

  8. В оба модуля объектов вставьте полный соответствующий ПередЗаписью. Первая запись оригинала разрешена только однократной собственной подготовкой с контекстом ДополнительныеСвойства. Существующие оригиналы не записываются; копия разрешает только первый шаг3, затем3→4→3. Оба клиентских режима проходят тот же серверный объектный контроль.

  9. У каждого вида создайте три формы с точными именами из JSON: обычный объект РедакторОбычный85 с основным Запись85, обычный список СписокОбычный85 с основным Список85, управляемый объект РедакторУправляемый85 с основным Объект. Эти основные реквизиты создаёт мастер; не подменяйте их структурой или дополнительным реквизитом. Вставьте все полные модули своего вида, назначьте перечисленные события.

  10. Обычная таблица Строки85 связана с Список85; все девять колонок явно добавлены и Данные каждой равны имени соответствующего поля. Поля обычного редактора и таблица только для просмотра, стандартные запись/удаление/старт/выполнение убраны. Не объявляйте видимость кнопок средством RLS или абсолютной безопасности.

  11. Общие формы ПланБПОбычный85 и ПланЗадачиОбычный85 получают свои разные MAIN. В каждой реквизит Выбранный85 имеет ссылочный тип только соответствующего своего вида; реальное ПолеВвода Выбор85 связано с ним. Пользователь вручную вводит фактический номер своей копии из протокола и нажимает Enter. Мы проверяем уже доставленное настоящее значение, не угадываем строки выпадающего списка и не вызываем обработчик выбора вручную.

  12. В ОБЕИХ управляемых формах объектов и управляемом пульте обязательно создайте настоящие реквизиты managedSharedScalarAttributes из JSON; затем добавьте соответствующие managedObjectScalarAttributes или managedHubScalarAttributes. Они хранят фазу, остановку, собственные refs и скалярный паспорт между клиентом и сервером. Не заменяйте их Перем: переменные модулей разных контекстов не считаются синхронизированными. Дочерняя85 — единственная client-only переменная managedhub, сервер её не читает. Служебные реквизиты не выводятся в редактируемые поля.

  13. Создайте оба пульта по JSON и вставьте полные модули. Модуль обычного приложения получает APPLICATION_ORDINARY, модуль управляемого приложения APPLICATION_MANAGED. Нативное ПриНачалеРаботыСистемы без параметров назначается настоящему модулю приложения. Флажок согласия всюду первоначально Ложь.

  14. F7 и обновление только своей CF; закройте Конфигуратор, запустите обычное приложение. В своём пульте установите согласие и ОДИН раз Подготовить85. Будут реально записаны два оригинала: бюджет заявки1000 и стоимость работ100. Если после первого объекта возникла ошибка, остановитесь: повтор, автоматическое удаление и завершение частичной подготовки кодом не выполняются.

  15. Далее кнопка БП85: согласие в дочернем контроллере, Шаг85 создаёт свою новую копию1000→1500 через реальный Copy0 и записывает её формой. Закройте только просмотренный собственный редактор, выполните следующий Шаг85: открывается настоящий список с параметром текущей строки. Введите номер копии в собственном Выбор85, Enter, затем финальный Шаг85 проверяет реальную текущую GUI-строку и ссылку. Закройте собственные окна, аналогично Задача85 создаёт копию100→150. Для задачи список явно переключён на ВсеЗадачи своего единственного вида, не на чужого исполнителя.

  16. Полностью закройте обычный клиент. Только в этой своей CF вручную измените ОсновнойРежимЗапуска на УправляемоеПриложение, обновите её, закройте Конфигуратор и запустите тот же стенд вторым толстым клиентом. Режим редактора «оба» не заменяет эту отдельную настройку/проверку реального запуска.

  17. На новом управляемом пульте согласие и БП85. В своей дочерней форме согласие, затем четыре последовательных Шаг85: сохранить1500→2000; создать известный несохранённый буфер2500 и native Прочитать вернуть2000; сохранить2000→1500; проверить навигационную ссылку и включить собственную политику передачи. Отдельная Передать85 отправляет настоящую свою ссылку владельцу. Native РежимВыбора отключён перед явным ОповеститьОВыборе: автоматический payload при закрытии не считается гарантированно ссылкой и не должен дублировать явную передачу.

  18. Закройте свой пульт/окна и повторно войдите только в управляемое приложение для отдельного опыта Задача85:150→200, буфер250→native read200, запись200→150, своя навигационная ссылка и передача. Новый пульт нужен потому, что он разрешает ровно одного собственного ребёнка; это не обход остановленного экземпляра после ошибки.

  19. Полные исходные записи/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, После);
            Если После.Задачи.Копия = Неопределено Тогда
                ВызватьИсключение "Своя копия не появилась в реальной базе";
            КонецЕсли;
            Если После.Задачи.Копия.Ссылка <> Копия.Ссылка Или После.Задачи.Копия.Сумма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

Общие модули → ПланПоручений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
}

Разбор по шагам

  1. Подготовьте именно свою полную CF и два собственных оригинала; прочитайте все supporting modules/JSON до запуска.

  2. В правильном реальном клиентском режиме подтвердите согласие и выполните последовательные свои шаги. Собственная копия и оригинал — разные настоящие ссылки; реальные номера не угадываются.

  3. Сверьте числовое значение основной формы/GUI с полным свежим источником. Query readback не считается доказательством доставки GUI строки.

  4. При False/Unknown/исключении экземпляр останавливается: без слепого отката, автоматического повтора, удаления и выполнения маршрута.

Как проверить результат

  1. Оригиналы и их реальные версии/номера/refs остаются неизменными, native Started/Completed/Executed не присваиваются.

  2. Основные реквизиты/владельцы/ключи/список/привязки контролов проверяются по настоящим собственным объектам, не по совпадению имени переменной.

  3. managed ClientBeforeWrite2 не содержит серверных вызовов; full fresh guard выполняется native ServerBeforeWrite3 и ObjectBeforeWrite1.

  4. Выбор передаёт явно свою verified ссылку, настоящий owner callback2 и exactSource; неизвестный payload/источник не принимается.

  5. Runtime0: все результаты — ожидания будущего ручного опыта.

Ожидаемый результат

Ожидаемый ручной результат: задача-план original100, copy150; управляемое изменение150→200→150, весь источник250→300→250. Ни одна задача не выполнена и ни один процесс не стартован.

На что обратить внимание

  1. Обычная Форма и ФормаКлиентскогоПриложения имеют разные расширения/события; extension не конструируется и короткий registry owner не передаётся в Type/New.

  2. АвтонумерацияВФорме.НеИспользовать не выключает выдачу номера при записи: native прямо говорит «номер формируется при записи». Читается действительный номер; UI-поиск использует его.

  3. CopyingObject/Basis использует наш подготовленный обычный редактор; это не доказательство автоматического заполнения платформой.

  4. ПараметрыВыбора/ВыборДоступен участвуют в явно написанной собственной политике передачи; getter/setter не доказывает универсальный фильтр, RLS или пиксели.

  5. Native managed BeforeWrite2 запрещает серверные методы формы с &НаСервере. Не переносите туда свежий серверный guard.

  6. Read0 может отбросить несохранённый буфер: применяется только к известному собственному состоянию. Не означает атомарный rollback.

  7. Проверка соединения — не блокировка других подключений. При частичной первой подготовке ничего не очищается и не повторяется.

  8. Нет запуска маршрута, адресации, внешней почты/сети/печати; разными суммами бюджета и трудозатрат не подменяется учёт исполненного рабочего процесса.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.