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