Сравнить четыре способа получения форм бизнес-процесса без записи

Учебные задачи

Собственные обычные формы списка, выбора и нового объекта получают разные ключи; модальный результат просмотра не выдаётся за выбор ссылки или выполнение маршрута.

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

Полный модуль обычной формы ЗапускФорм85, обычный толстый клиент Windows, собственный стенд УчебныеФормыМенеджера85.

Подготовка

  1. Новая пустая конфигурация УчебныеФормыМенеджера85 на платформе8.5.1.1343. Основной режим запуска Обычное приложение; толстый клиент Windows, не управляемое приложение.

  2. Задачи → УчебнаяЗадача85: строковый номер9 с автонумерацией, Наименование100. Бизнес-процессы → УчебныйПроцесс85: строковый номер9, автонумерация, Задача=УчебнаяЗадача85.

  3. Карта процесса Старт → одиночное действие Опыт85 → Финиш, без адресации и обработчиков. Этот урок не запускает маршрут.

  4. У обоих объектов отдельный полный модуль ПередЗаписью из дополнительных блоков: любой вызов записи запрещён. Других обработчиков и подписок нет.

  5. Бизнес-процессы → УчебныйПроцесс85 → Формы: мастером добавьте обычную форму списка Список85, обычную форму выбора Выбор85 и обычную форму объекта Новая85. Не создавайте произвольную общую форму вместо метаданных этого вида.

  6. У Новая85 основной реквизит, созданный мастером, переименуйте в Черновик85, не добавляйте второй реквизит и не снимайте признак основного. Его точный тип БизнесПроцессОбъект.УчебныйПроцесс85; остальные поля формы только для просмотра.

  7. В Список85 и Выбор85 используйте собственный основной список этого вида. Поле списка только для просмотра; отключите стандартные панели, контекстные команды, редактирование и действия двойного щелчка. Стенд пустой, выбираемой записи нет.

  8. Во всех трёх формах уберите команды записи, создания, удаления, выполнения задачи и старта процесса. Оставьте одну обычную кнопку ЗакончитьПросмотр85: Нажатие=ЗакончитьПросмотр85.

  9. В Список85 и Выбор85 вставьте отдельный полный модуль Просмотр списка. В Новая85 вставьте отдельный полный модуль Проверка нового черновика. Во всех назначьте ПередЗакрытием из своего модуля.

  10. Для необязательных имён настройте основные формы списка, выбора и объекта соответственно Список85, Выбор85, Новая85; код всё равно передаёт точные имена явно.

  11. Обработки → ЗапускФорм85 → обычная форма Форма. Реквизиты ПодтверждаюПустойСтенд85 и Занято85 Булево исходно Ложь; Итог85 Строка неограниченной длины только для просмотра.

  12. Вставьте весь основной модуль одного урока. Обычная кнопка СравнитьСвоиФормы85: Нажатие=СравнитьСвоиФормы85, параметр Кнопка; никаких клиент-серверных директив.

  13. F7 и обновление только своего стенда. runtimeVerifiedScenarios=0: 1С, получение/показ/закрытие окон и попытки записи здесь не выполнялись.

  14. После согласия последовательно просмотрите четыре модальных окна. Список через общий метод и специализированный метод — одна метаданная форма, но разные экземпляры по ключу.

  15. ЗакончитьПросмотр85 возвращает строку из списка/выбора, а из редактора — структуру с фактическими проверками нового объекта. Крестик возвращает Неопределено и не засчитывает подтверждённый просмотр.

  16. Не переносите код в рабочие формы. Здесь нет транзакции, DB-записи, выбора существующей ссылки, удаления, файлов, архива или новой резервной копии.

Процедура СравнитьСвоиФормы85(Кнопка)
    Если Не ПодтверждаюПустойСтенд85 Тогда
        ВызватьИсключение "Только новый пустой стенд УчебныеФормыМенеджера85 с согласием";
    КонецЕсли;
    Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
        ВызватьИсключение "Нужен обычный толстый клиент Windows";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Платформа8.5.1.1343 и отсутствие транзакции обязательны для просмотра";
    КонецЕсли;
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь завершения своего просмотра";
    КонецЕсли;
    ВыборкаДо = БизнесПроцессы.УчебныйПроцесс85.Выбрать();
    Если ВыборкаДо.Следующий() Тогда
        ВызватьИсключение "Исследуемый собственный вид должен быть пустым";
    КонецЕсли;
    Занято85 = Истина;
    ОткрытыеФормы = Новый Массив;
    ОшибкаОпыта = "";
    ОшибкаЗакрытия = "";
    Просмотров = 0;
    ЗакрытийБезПодтверждения = 0;
    Попытка
        Маркер = Строка(Новый УникальныйИдентификатор);
        Для НомерОпыта = 1 По 4 Цикл
            Ключ = Маркер + "-" + Строка(НомерОпыта);
            Если НомерОпыта = 1 Тогда
                Форма = БизнесПроцессы.УчебныйПроцесс85.ПолучитьФорму("Список85", , Ключ);
                НазваниеОпыта = "Именованная форма списка через общий метод менеджера";
            ИначеЕсли НомерОпыта = 2 Тогда
                Форма = БизнесПроцессы.УчебныйПроцесс85.ПолучитьФормуСписка("Список85", , Ключ);
                НазваниеОпыта = "Та же собственная форма списка через специализированный метод";
            ИначеЕсли НомерОпыта = 3 Тогда
                Форма = БизнесПроцессы.УчебныйПроцесс85.ПолучитьФормуВыбора("Выбор85", , Ключ);
                НазваниеОпыта = "Форма выбора: просмотр пустого списка, не выбор ссылки";
            Иначе
                Форма = БизнесПроцессы.УчебныйПроцесс85.ПолучитьФормуНовогоБизнесПроцесса("Новая85", , Ключ);
                НазваниеОпыта = "Редактор реального нового незаписываемого объекта";
            КонецЕсли;
            Если Форма = Неопределено Тогда
                ВызватьИсключение "Собственная форма не создана";
            КонецЕсли;
            ОткрытыеФормы.Добавить(Форма);
            Если Форма.КлючУникальности <> Ключ Тогда
                ВызватьИсключение "Получен не отдельный собственный экземпляр формы";
            КонецЕсли;
            Форма.АвтоЗаголовок = Ложь;
            Форма.Заголовок = НазваниеОпыта;
            Результат = Форма.ОткрытьМодально();
            Если Результат = Неопределено Тогда
                ЗакрытийБезПодтверждения = ЗакрытийБезПодтверждения + 1;
            ИначеЕсли НомерОпыта < 4 Тогда
                Если Результат <> "Просмотрено" Тогда
                    ВызватьИсключение "Неожиданный результат своего просмотра списка";
                КонецЕсли;
                Просмотров = Просмотров + 1;
            Иначе
                Если ТипЗнч(Результат) <> Тип("Структура") Тогда
                    ВызватьИсключение "Редактор должен вернуть свой проверенный паспорт, не ссылку";
                КонецЕсли;
                Просмотрено = Неопределено;
                НовыйЧерновик = Неопределено;
                ПустаяСсылка = Неопределено;
                Если Не Результат.Свойство("Просмотрено", Просмотрено)
                    Или Не Результат.Свойство("Новый", НовыйЧерновик)
                    Или Не Результат.Свойство("ПустаяСсылка", ПустаяСсылка) Тогда
                    ВызватьИсключение "В паспорте нет всех собственных проверок";
                КонецЕсли;
                Если Просмотрено <> Истина Или НовыйЧерновик <> Истина Или ПустаяСсылка <> Истина Тогда
                    ВызватьИсключение "Собственный черновик не остался новым незаписанным объектом";
                КонецЕсли;
                Просмотров = Просмотров + 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.Стартован Или Черновик85.Завершен Тогда
        ВызватьИсключение "Требуется новый незаписанный и неисполненный черновик";
    КонецЕсли;
    Паспорт = Новый Структура("Просмотрено,Новый,ПустаяСсылка", Истина, Черновик85.ЭтоНовый(), Черновик85.Ссылка.Пустая());
    Закрыть(Паспорт);
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

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

  1. Проверяется свой пустой стенд, согласие, версия, обычный режим, отсутствие транзакции и занятость формы запуска.

  2. Для четырёх опытов создаются отдельные ключи. ПолучитьФорму получает точно Список85; ПолучитьФормуСписка получает ту же метаданную форму специализированным методом.

  3. ПолучитьФормуВыбора создаёт настоящий выборный список, но в пустом стенде выбор ссылки не имитируется. Дополнительная кнопка подтверждает только просмотр.

  4. ПолучитьФормуНовогоБизнесПроцесса создаёт настоящую форму нового объекта. Основной Черновик85 заполняется платформой, а не произвольной структурой или неизвестным объектом.

  5. До обращения к форме проверяется Неопределено и реальный КлючУникальности. АвтоЗаголовок отключён, диагностический заголовок показывает назначение окна.

  6. Модальный результат анализируется отдельно: отсутствие подтверждения, строка просмотра или реальный паспорт нового объекта из собственного обработчика.

  7. ПередЗакрытием отключает стандартную обработку; запись дополнительно запрещена модулем объекта. Пустая выборка после просмотра проверяет отсутствие созданных записей.

  8. При ошибке закрываются только полученные собственные формы, ошибки закрытия не теряются; Занято85 снимается и не объявляется ложный успех.

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

  1. Каждое из четырёх окон имеет своё назначение и свой проверенный ключ.

  2. При нажатии всех собственных кнопок итог показывает4 подтверждённых просмотра и0 закрытий без подтверждения.

  3. Крестик одного окна даёт3 подтверждения и1 закрытие; Неопределено не является выбранной ссылкой.

  4. Черновик85 имеет точный собственный объектный тип, ЭтоНовый=Истина и пустую ссылку; флаги исполнения только читаются.

  5. Выборка до и после просмотра пуста, не было Записать/Старт/выполнения или удаления.

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

При будущем ручном запуске видны отличия трёх назначений форм и общего/специализированного получения; собственный редактор не создаёт запись базы.

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

  1. Это менеджерские методы: они получают формы метаданного вида, не редактируют заданную существующую ссылку. Для конкретного экземпляра семантика объектного ПолучитьФорму другая.

  2. У общего ПолучитьФорму имя обязательно; у трёх специализированных методов необязательно. В коде все имена переданы явно, поэтому не нужно угадывать основную форму.

  3. Одинаковое имя Список85 в двух вызовах не означает одинаковый экземпляр окна: разные ключи участвуют в поиске открытой формы. UUID ключа не является ссылкой базы.

  4. Форма выбора здесь настоящая, но пустая. Строка Просмотрено от собственной кнопки — не выбранная задача/процесс; не используйте её как бизнес-ссылку.

  5. При реальном выборе ОткрытьМодально может вернуть значение/массив, а без выбора Неопределено. Этот урок специально не содержит выбора реальных записей.

  6. Менеджер нового объекта создаёт объект основного реквизита формы. Не заменяйте Черновик85 самостоятельно созданной структурой и не добавляйте его как второй неосновной реквизит.

  7. ПередЗакрытием обычной формы имеет2 параметра; отказ от стандартной обработки не отменяет само закрытие. В рабочем редакторе такой подход может терять изменения.

  8. ПередЗаписью объекта всегда запрещает запись; удалены и интерактивные команды. Не копируйте этот запрет в урок данных выбора, где нужны собственные записи в транзакции.

  9. ОткрытьМодально останавливает вызывающий код до закрытия. В тонком/веб-клиенте это не универсальная замена управляемому ОткрытьФорму.

  10. Просмотр формы нового объекта не означает сохранение, выполнение задачи, старт или завершение процесса. Эти флаги не присваиваются для имитации.

  11. При аварии клиента закрытие произвольного GUI не гарантируется. Код собирает ошибки только своих полученных форм и не закрывает чужие окна.

  12. Статическая сверка справки не доказывает реальное окно и сохранение отказа. runtimeVerifiedScenarios=0, 1С и GUI не запускались.

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

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

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

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

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