Два реальных новых объекта только в памяти: свои обработчики активации создают паспорта, ПолучитьФорму создаёт настоящие обычные формы, результат кнопки просмотра отличается от простого закрытия окна.
Где и как запускать
Полный модуль обычной формы ЗапускПросмотра85 в толстом клиенте Windows, режим ОбычноеПриложение, новый стенд УчебныеОбычныеФормы85.
Подготовка
Создайте новую пустую конфигурацию УчебныеОбычныеФормы85 на платформе 8.5.1.1343. Рабочие конфигурации, расширения и существующие задачи не используются.
Основной режим запуска конфигурации — Обычное приложение. Запускайте толстый клиент Windows именно в ОбычноеПриложение, не УправляемоеПриложение; код также проверяет реальный ТекущийРежимЗапуска.
Задачи → УчебнаяЗадача85: номер Строка9 с автонумерацией, Наименование100, Маркер85 Строка36. Бизнес-процессы → УчебныйПроцесс85: номер Строка9, автонумерация, Маркер85 Строка36, Задача=УчебнаяЗадача85.
Карта процесса: Старт → одиночное действие Опыт85 → Финиш, без адресации, групповых/вложенных точек и обработчиков. В этом уроке процесс не стартует, задача не относится к маршруту.
В каждый из двух модулей объектов отдельно вставьте полный модуль с ОбработкаИнтерактивнойАктивации и ПередЗаписью. Последний запрещает любые попытки записи этого учебного черновика; других обработчиков, подписок и внешних действий нет.
У каждого объекта добавьте обычную, не управляемую форму объекта Просмотр85 с основным реквизитом именно этого объекта. Стандартный генератор формы может показать поля Дата, Наименование задачи и Маркер85.
Все поля обеих форм просмотра сделайте только для просмотра. Уберите стандартную командную панель и команды Записать, ЗаписатьИЗакрыть, выполнения задачи и старта процесса; никакие кнопки не должны записывать объект.
В каждой форме Просмотр85 добавьте одну обычную кнопку ЗакончитьПросмотр85 и назначьте её Нажатие=ЗакончитьПросмотр85. Вставьте полный отдельный модуль и назначьте событие ПередЗакрытием; стандартная обработка закрытия отключается, черновик не сохраняется.
Обработки → ЗапускПросмотра85 → обычная форма Форма. Весь основной код вставляется в её модуль без клиент-серверных директив; не используйте управляемую форму из предыдущих уроков.
Реквизиты формы запуска: ПодтверждаюПустойСтенд85 и Занято85 типа Булево, Итог85 типа Строка неограниченной длины. Флажки исходно Ложь, занятость и итог только для просмотра.
Обычная кнопка ОткрытьСвоиЧерновики85: Нажатие=ОткрытьСвоиЧерновики85. Это обработчик обычной кнопки с параметром Кнопка, не команда управляемой формы.
Нажмите F7 и обновите только собственный стенд. runtimeVerifiedScenarios=0: 1С, окна, активация, кнопки и закрытие здесь не запускались; данные не записывались.
Подтвердите свой стенд и вручную выполните кнопку. Первая модальная форма — задача, вторая — процесс; закройте каждую собственной кнопкой ЗакончитьПросмотр85 для подтверждённого просмотра.
Во втором отдельном ручном опыте закройте одно окно крестиком. Результат Неопределено означает отсутствие подтверждения просмотра, а не ошибку активации и не успешное выполнение задачи.
Маркер и отдельные ключи уникальности форм создаёт сам код. ПолучитьФорму вызывается на реальных своих объектах, без рабочей ссылки, пользовательского UUID или неизвестного ИсходныйОбъект.
Для этого урока не нужны общий серверный модуль, транзакция, история, обмен, печать, файл или сеть. Черновики остаются новыми экземплярами в памяти и больше не переиспользуются после опыта.
Процедура ОткрытьСвоиЧерновики85(Кнопка)
Если Не ПодтверждаюПустойСтенд85 Тогда
ВызватьИсключение "Только собственный пустой стенд УчебныеОбычныеФормы85 с согласием";
КонецЕсли;
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Нужно ОбычноеПриложение: управляемый режим не вызывает эти события";
КонецЕсли;
Если Занято85 Тогда
ВызватьИсключение "Дождитесь завершения своего просмотра";
КонецЕсли;
Занято85 = Истина;
ФормаЗадачи = Неопределено;
ФормаПроцесса = Неопределено;
ОшибкаОпыта = "";
ОшибкаЗакрытия = "";
РезультатЗадачи = Неопределено;
РезультатПроцесса = Неопределено;
Попытка
Маркер = Строка(Новый УникальныйИдентификатор);
Задача = Задачи.УчебнаяЗадача85.СоздатьЗадачу();
Задача.Дата = ТекущаяДата();
Задача.Наименование = "Просмотр своего черновика";
Задача.Маркер85 = Маркер;
Задача.ДополнительныеСвойства.Вставить("МаркерОпыта85", Маркер);
Задача.ДополнительныеСвойства.Вставить("Активаций85", 0);
Процесс = БизнесПроцессы.УчебныйПроцесс85.СоздатьБизнесПроцесс();
Процесс.Дата = ТекущаяДата();
Процесс.Маркер85 = Маркер;
Процесс.ДополнительныеСвойства.Вставить("МаркерОпыта85", Маркер);
Процесс.ДополнительныеСвойства.Вставить("Активаций85", 0);
Задача.АктивироватьИнтерактивно();
ПаспортЗадачи = ПроверитьСвойПаспорт85(Задача.ДополнительныеСвойства, Маркер);
Процесс.АктивироватьИнтерактивно();
ПаспортПроцесса = ПроверитьСвойПаспорт85(Процесс.ДополнительныеСвойства, Маркер);
ФормаЗадачи = Задача.ПолучитьФорму("Просмотр85", , Маркер + "-task");
Если ФормаЗадачи = Неопределено Тогда
ВызватьИсключение "Собственная обычная форма задачи не создана";
КонецЕсли;
ФормаЗадачи.АвтоЗаголовок = Ложь;
ФормаЗадачи.Заголовок = ПаспортЗадачи;
РезультатЗадачи = ФормаЗадачи.ОткрытьМодально();
ФормаПроцесса = Процесс.ПолучитьФорму("Просмотр85", , Маркер + "-process");
Если ФормаПроцесса = Неопределено Тогда
ВызватьИсключение "Собственная обычная форма процесса не создана";
КонецЕсли;
ФормаПроцесса.АвтоЗаголовок = Ложь;
ФормаПроцесса.Заголовок = ПаспортПроцесса;
РезультатПроцесса = ФормаПроцесса.ОткрытьМодально();
Если Не Задача.ЭтоНовый() Или Не Процесс.ЭтоНовый()
Или Не Задача.Ссылка.Пустая() Или Не Процесс.Ссылка.Пустая() Тогда
ВызватьИсключение "Просмотр не должен записывать собственные черновики";
КонецЕсли;
Если Задача.Выполнена Или Процесс.Стартован Или Процесс.Завершен Тогда
ВызватьИсключение "Просмотр не должен выполнять задачу или продвигать маршрут";
КонецЕсли;
Исключение
ОшибкаОпыта = ОписаниеОшибки();
Если ФормаЗадачи <> Неопределено Тогда
Попытка
ФормаЗадачи.Закрыть();
Исключение
ОшибкаЗакрытия = ОшибкаЗакрытия + " " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ФормаПроцесса <> Неопределено Тогда
Попытка
ФормаПроцесса.Закрыть();
Исключение
ОшибкаЗакрытия = ОшибкаЗакрытия + " " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецПопытки;
Занято85 = Ложь;
Если ОшибкаОпыта <> "" Или ОшибкаЗакрытия <> "" Тогда
Итог85 = ОшибкаОпыта + " " + ОшибкаЗакрытия;
ВызватьИсключение Итог85;
КонецЕсли;
Итог85 = "Оба собственных обработчика активации вызваны по одному разу. Задача: "
+ ПредставитьСвойПросмотр85(РезультатЗадачи) + "; процесс: "
+ ПредставитьСвойПросмотр85(РезультатПроцесса) + ". Черновики не записаны, маршрут не запускался.";
КонецПроцедуры
Функция ПроверитьСвойПаспорт85(ДополнительныеСвойства, Маркер)
Счетчик = Неопределено;
Паспорт = Неопределено;
Если Не ДополнительныеСвойства.Свойство("Активаций85", Счетчик)
Или Не ДополнительныеСвойства.Свойство("ПаспортАктивации85", Паспорт) Тогда
ВызватьИсключение "Собственный обработчик активации не подтвердился";
КонецЕсли;
Если Счетчик <> 1 Или Паспорт <> "Просмотр собственного черновика " + Маркер Тогда
ВызватьИсключение "Обработчик не создал ожидаемый собственный паспорт ровно один раз";
КонецЕсли;
Возврат Паспорт;
КонецФункции
Функция ПредставитьСвойПросмотр85(Результат)
Если Результат = "Просмотрено" Тогда
Возврат "подтверждён отдельной кнопкой просмотра";
ИначеЕсли Результат = Неопределено Тогда
Возврат "окно закрыто без подтверждения просмотра";
КонецЕсли;
ВызватьИсключение "Неожиданный результат собственной модальной формы";
КонецФункцииАктивация УчебнаяЗадача85
УчебныеОбычныеФормы85 → Задачи → УчебнаяЗадача85 → Модуль объекта
Полный модуль собственного объекта; обработчик активации обычного приложения и однопараметровый запрет записи.
Процедура ОбработкаИнтерактивнойАктивации(СтандартнаяОбработка)
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Только собственный стенд УчебныеОбычныеФормы85 в обычном приложении";
КонецЕсли;
Маркер = Неопределено;
Счетчик = Неопределено;
Если Не ЭтотОбъект.ДополнительныеСвойства.Свойство("МаркерОпыта85", Маркер)
Или Не ЭтотОбъект.ДополнительныеСвойства.Свойство("Активаций85", Счетчик) Тогда
ВызватьИсключение "Нет собственного контекста этого черновика";
КонецЕсли;
Если Маркер <> ЭтотОбъект.Маркер85 Или ТипЗнч(Счетчик) <> Тип("Число") Тогда
ВызватьИсключение "Контекст активации не относится к своему черновику";
КонецЕсли;
СтандартнаяОбработка = Ложь;
ЭтотОбъект.ДополнительныеСвойства.Вставить("Активаций85", Счетчик + 1);
ЭтотОбъект.ДополнительныеСвойства.Вставить("ПаспортАктивации85", "Просмотр собственного черновика " + Маркер);
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Отказ = Истина;
КонецПроцедурыАктивация УчебныйПроцесс85
УчебныеОбычныеФормы85 → Бизнес-процессы → УчебныйПроцесс85 → Модуль объекта
Полный модуль собственного объекта; обработчик активации обычного приложения и однопараметровый запрет записи.
Процедура ОбработкаИнтерактивнойАктивации(СтандартнаяОбработка)
Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
ВызватьИсключение "Только собственный стенд УчебныеОбычныеФормы85 в обычном приложении";
КонецЕсли;
Маркер = Неопределено;
Счетчик = Неопределено;
Если Не ЭтотОбъект.ДополнительныеСвойства.Свойство("МаркерОпыта85", Маркер)
Или Не ЭтотОбъект.ДополнительныеСвойства.Свойство("Активаций85", Счетчик) Тогда
ВызватьИсключение "Нет собственного контекста этого черновика";
КонецЕсли;
Если Маркер <> ЭтотОбъект.Маркер85 Или ТипЗнч(Счетчик) <> Тип("Число") Тогда
ВызватьИсключение "Контекст активации не относится к своему черновику";
КонецЕсли;
СтандартнаяОбработка = Ложь;
ЭтотОбъект.ДополнительныеСвойства.Вставить("Активаций85", Счетчик + 1);
ЭтотОбъект.ДополнительныеСвойства.Вставить("ПаспортАктивации85", "Просмотр собственного черновика " + Маркер);
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Отказ = Истина;
КонецПроцедурыПросмотр85 УчебнаяЗадача85
УчебныеОбычныеФормы85 → Задачи → УчебнаяЗадача85 → Формы → Просмотр85 → Модуль
Полный модуль собственной обычной формы объекта; подтверждение просмотра и двухпараметровое ПередЗакрытием без стандартного сохранения.
Процедура ЗакончитьПросмотр85(Кнопка)
Закрыть("Просмотрено");
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедурыПросмотр85 УчебныйПроцесс85
УчебныеОбычныеФормы85 → Бизнес-процессы → УчебныйПроцесс85 → Формы → Просмотр85 → Модуль
Полный модуль собственной обычной формы объекта; подтверждение просмотра и двухпараметровое ПередЗакрытием без стандартного сохранения.
Процедура ЗакончитьПросмотр85(Кнопка)
Закрыть("Просмотрено");
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедурыРазбор по шагам
Проверка конфигурации, согласия, версии и реального обычного режима выполняется до действий. Занято85 не допускает второго просмотра из той же формы.
Менеджеры создают настоящие новые задачу и процесс. У них общий собственный маркер и два отдельные контекста ДополнительныеСвойства со счётчиком0; записи в базе пока нет.
АктивироватьИнтерактивно вызывает собственный однопараметровый обработчик каждого объекта. СтандартнаяОбработка=Ложь намеренно заменяет стандартный обход маршрута собственным паспортом черновика.
Обработчик проверяет принадлежность контекста, повышает свой счётчик до1 и создаёт строку паспорта. Основной модуль проверяет реальный результат через ДополнительныеСвойства, а не просто объявляет, что callback вызван.
ПолучитьФорму получает точное имя обычной формы Просмотр85 и отдельный ключ уникальности. Неопределено обработан до обращения к свойствам формы.
АвтоЗаголовок=Ложь включает собственный Заголовок из паспорта. ОткрытьМодально возвращает значение закрытия: специальная кнопка передаёт Просмотрено, крестик оставляет Неопределено.
Оба результата описываются отдельно. Подтверждённый просмотр не равен выполнению задачи; экземпляры должны остаться новыми, с пустыми ссылками и неизменёнными флагами маршрута.
Ошибки основной операции и закрытия своих форм объединяются. Занятость снимается до итогового исключения; неудачная активация, создание окна или закрытие не маскируются успехом.
Как проверить результат
При правильном обычном режиме каждый из двух реальных обработчиков повышает свой счётчик ровно0→1. При управляемом режиме опыт отклонён заранее.
В заголовках обеих настоящих форм виден собственный паспорт и маркер; формы принадлежат своим новым объектам, а не произвольной записи.
Кнопка ЗакончитьПросмотр85 возвращает Просмотрено; крестик окна приводит к сообщению «без подтверждения», а не к ложному подтверждённому просмотру.
Оба объекта после просмотра ЭтоНовый, ссылки пустые; задача не выполнена, процесс не стартован и не завершён.
В коде нет Записать, Старт, ВыполнитьЗадачуИнтерактивно или удаления. Ошибки закрытия тоже попадают в итог.
Ожидаемый результат
При будущем собственном ручном запуске подтверждены два собственных события активации и реальные обычные формы; результаты закрытия различаются, черновики не записаны и маршрут не запущен.
На что обратить внимание
ОбработкаИнтерактивнойАктивации задачи и процесса не вызывается в УправляемоеПриложение. «Толстый клиент» сам по себе недостаточен: нужен ещё правильный режим, проверяемый ТекущийРежимЗапуска.
Свой обработчик здесь сознательно отключает стандартную обработку и выполняет реальную задачу просмотра паспорта. Это не пример стандартного запуска всех задач текущего исполнителя, для которого нужны адресация и параметр сеанса.
АктивироватьИнтерактивно не означает Старт или ВыполнитьЗадачуИнтерактивно. Новые черновики и их флаги не записываются и не присваиваются для имитации выполнения.
ДополнительныеСвойства используется как собственный контекст объекта в памяти. Это не реквизиты базы и не доказательство, что сохранённая задача существует.
ПолучитьФорму вызывается на объекте, поэтому форма содержит этот конкретный экземпляр. Получение по ссылке имеет другую семантику и не заменяет здесь создание нового черновика.
Ключ уникальности задаётся отдельно для задачи и процесса. Он участвует в выборе экземпляра формы, но сам не является ссылкой на данные и не доказывает открытое окно.
Модальная форма блокирует дальнейшее выполнение обработчика до закрытия. Для тонкого, веб-клиента и нового интерфейса это не универсальный UI-подход; урок специально относится к обычному толстому клиенту.
Обычная ПередЗакрытием имеет два параметра и отключает стандартную обработку, не отменяя закрытие. Это применяется только к своему незаписываемому черновику; в рабочем редакторе так можно потерять изменения.
Неопределено от ПолучитьФорму и Неопределено после закрытия модального окна — разные случаи. Первое не позволяет обращаться к форме, второе нормально означает неподтверждённый просмотр.
АвтоЗаголовок=Истина может добавить данные основного реквизита. Здесь установлен Ложь, чтобы видеть именно паспорт; это не изменение наименования объекта.
Обычная ПриЗакрытии имеет ноль параметров и не позволяет отменить закрытие. В этом уроке такой обработчик не нужен; не копируйте сюда сигнатуру ПередЗакрытием управляемой формы.
Стандартные кнопки записи и выполнения в редакторе формы должны быть убраны. Дополнительно ПередЗаписью объекта всегда устанавливает Отказ=Истина, что по справке запрещает запись и вызывает исключение; запрет не проверяется здесь реальным вызовом Записать.
В собственных модулях объекта допускаются только приведённые обработчики. Произвольный рабочий обработчик может делать внешние действия; этот пример не отменяет их автоматически.
Если закрытие окна вызывает исключение, результат не объявляется успешным. При аварийном завершении клиента восстановление произвольных окон не гарантируется.
1С и GUI здесь не запускались. Статическая проверка точных API/сигнатур не является подтверждением работы реального окна; runtimeVerifiedScenarios=0.
Файлы, архивы, новые резервные копии, запись/удаление базы, печать и внешняя сеть в этом уроке отсутствуют.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.