Часто в процессе разработки на платформе 1С возникает необходимость открывать пользователям разные формы одного и того же объекта в зависимости от определенных условий. Например, руководителю нужно показывать полную форму документа со всеми реквизитами, а менеджеру — урезанную версию. Рассмотрим подробнее, как программно переназначить форму документа, проанализируем частые ошибки (такие как unknown form id) и разберем по шагам правильный алгоритм решения этой задачи.
Для программной подмены формы в 1С существует специальное событие — ОбработкаПолученияФормы. Обычно разработчики пытаются написать код, проверяющий вид открываемой формы, и переопределяющий возвращаемую форму. Однако на этом этапе часто возникают две классические проблемы:
Неопределено (Undefined), если попытаться использовать функцию ПолучитьФорму.Давайте выясним причину такого поведения системы и посмотрим, как правильно работать с параметрами этого обработчика.
В попытках получить нужную форму разработчики иногда пишут следующий код:
ВыбраннаяФорма = ПолучитьФорму("Документ.Лид.Форма.ФормаДокументаДляМенеджера");
Если проанализировать эту ситуацию в отладчике, мы увидим, что переменной ВыбраннаяФорма присваивается Неопределено. Разберем, почему так происходит.
Процедура ОбработкаПолученияФормы вызывается платформой на сервере строго до того, как форма фактически создана. В этом контексте система еще только решает, по какому шаблону (метаданным) ей строить будущий интерфейс. Метод ПолучитьФорму предназначен для инициализации уже готового объекта формы, а внутри обработчика получения формы мы должны лишь указать системе путь к нужному объекту конфигурации. Поэтому использование методов получения или создания формы здесь некорректно и приведет к ошибкам.
Если мы передаем путь к форме в виде строки, но система выдает ошибку unknown form id, причина практически всегда кроется в банальной опечатке. Платформа 1С строго валидирует строку, передаваемую в параметр ВыбраннаяФорма.
Ошибки могут быть следующими:
Документ.ИмяДокумента.Форма.ИмяФормы).Если вы столкнулись с такой ошибкой, тщательно проверьте каждую букву в строке пути. Назначать нужно именно путь к форме в виде строки, либо сам объект метаданных.
Рассмотрим эталонный пример кода, который решает задачу переназначения формы. Крайне важно не забыть установить параметр СтандартнаяОбработка в значение Ложь. Без этого система проигнорирует наши настройки и откроет форму, назначенную в конфигураторе по умолчанию.
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
// Проверяем, что запрашивается именно форма самого объекта (документа)
Если ВидФормы = "ФормаОбъекта" Тогда
// Обязательно отключаем стандартную обработку
СтандартнаяОбработка = Ложь;
// Указываем точный путь к новой форме в дереве метаданных
ВыбраннаяФорма = "Документ.Лид.Форма.ФормаДокументаДляМенеджера";
КонецЕсли;
КонецПроцедуры
В параметр ВыбраннаяФорма можно передать и объект метаданных: Метаданные.Документы.Лид.Формы.ФормаДокументаДляМенеджера. Оба варианта отработают корректно, если путь указан без ошибок.
Часто форму нужно переназначать не всегда, а в зависимости от того, создается ли новый документ или открывается уже существующий (например, если документ уже проведен, нужно открыть специальную форму только для чтения).
Посмотрим на параметр Параметры. Это структура, которая передается в процедуру при открытии.
Параметры.Ключ.Ключ будет пустым (или отсутствовать).Разберем пример кода, который учитывает этот нюанс:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы = "ФормаОбъекта" Тогда
// Проверяем, существует ли документ в базе
Если Параметры.Свойство("Ключ") И ЗначениеЗаполнено(Параметры.Ключ) Тогда
// Если документ проведен, откроем специальную форму
Если Параметры.Ключ.Проведен Тогда
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "Документ.Лид.Форма.ФормаПросмотра";
КонецЕсли;
Иначе
// Если это новый документ, можно проанализировать параметры заполнения
// и открыть, например, упрощенную форму создания
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "Документ.Лид.Форма.ФормаБыстрогоСоздания";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разработчики часто пишут подобный код непосредственно в модуле менеджера объекта. Однако, если вы дорабатываете типовую конфигурацию (например, 1С:ERP или 1С:Управление торговлей), прямое изменение модуля менеджера потребует снятия объекта с поддержки, что усложнит дальнейшие обновления.
Современный подход заключается в использовании механизма Подписок на события. Платформа 1С позволяет создать подписку на событие ОбработкаПолученияФормы. Вы можете вынести логику определения формы в отдельный общий модуль. Это позволит легко управлять подменой форм из одного места, не затрагивая код оригинальных объектов типовой конфигурации.
Кроме того, если вы реализуете этот функционал через Расширения конфигурации, помните о безопасном режиме. Платформа автоматически применяет безопасный режим на время исполнения обработчиков событий в расширениях, что может ограничить доступ к некоторым внешним ресурсам или привилегированным функциям. Учитывайте это при построении сложной логики проверки условий открытия форм.