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