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