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