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