Как передать значение переменной из формы документа в форму справочника при открытии в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке функционала в 1С часто возникает задача передать значение из формы документа (например, код карты лояльности, артикул, произвольную строку или ссылку) в форму справочника при её открытии. Это позволяет избежать ручного ввода данных и автоматизировать работу пользователя.

Разберем, почему возникает ошибка при неверном открытии формы, и подробно рассмотрим правильные варианты передачи параметров как для управляемых форм (1С 8.3), так и для обычных форм или предыдущих версий платформы.

Анализ типичной ошибки при передаче параметров

Посмотрим на частую ошибку, когда разработчик пытается получить форму через функцию ПолучитьФорму(), присвоить значение свойству формы, а затем открывает форму через ОткрытьФорму():


// Некорректная логика:
Форма = ПолучитьФорму("Справочник.КартыЛояльности.Форма.СчитываниеКартыЛояльности");
Форма.параметр.КодКарты = КодКартыЛояльности;
Форма = ОткрытьФорму("Справочник.КартыЛояльности.Форма.СчитываниеКартыЛояльности",
    ПараметрыОткрытия,
    ЭтаФорма,
    ЭтаФорма.УникальныйИдентификатор);

Проанализируем причину, по которой поле остается пустым:

  1. Метод ПолучитьФорму() создает один экземпляр формы в памяти, а последующий вызов функции ОткрытьФорму() с передачей имени формы создает и открывает совершенно другой, новый экземпляр.
  2. Прямое обращение вида Форма.параметр.КодКарты не поддерживается механизмом управляемых форм. Параметры должны передаваться строго в момент инициализации формы в виде структуры.
  3. Если переданное значение не связано с реквизитом формы в обработчике инициализации, платформа не сможет автоматически определить, в какой элемент формы поместить эти данные.

Решение 1: Передача структуры параметров в управляемых формах (1С 8.3)

Рассмотрим стандартный и наиболее корректный подход для управляемого интерфейса. Процесс состоит из двух шагов: формирование параметров в форме-источнике (в документе) и их обработка в открываемой форме справочника.

Шаг 1. Формирование структуры и вызов открытия формы в документе:


&НаКлиенте
Процедура ОткрытьФормуСправочника()
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("КодКарты", КодКартыЛояльности);
    
    ОткрытьФорму("Справочник.КартыЛояльности.Форма.СчитываниеКартыЛояльности", 
        ПараметрыФормы, 
        ЭтаФорма);

КонецПроцедуры

Шаг 2. Прием параметра в модуле открываемой формы справочника:

В открываемой форме справочника напишем обработчик события ПриСозданииНаСервере, где проверим наличие переданного параметра и присвоим его значение соответствующему реквизиту формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("КодКарты") Тогда
        РеквизитКодКарты = Параметры.КодКарты; // Переносим значение в реквизит формы
    КонецЕсли;

КонецПроцедуры

Решение 2: Передача данных через механизм «ЗначенияЗаполнения»

Если требуется открыть форму создания нового элемента справочника и сразу заполнить один или несколько реквизитов объекта, воспользуемся стандартным параметром платформы ЗначенияЗаполнения.

Разберем пример кода для формы документа:


&НаКлиенте
Процедура СоздатьНовыйЭлементСправочника()
    
    ЗначенияЗаполнения = Новый Структура;
    ЗначенияЗаполнения.Вставить("ИмяРеквизитаСправочника", РеквизитДокумента);
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
    
    ОткрытьФорму("Справочник.ИмяСправочника.Форма.ФормаОбъекта", ПараметрыОткрытия);

КонецПроцедуры

Важно: У реквизита справочника в конфигураторе должно быть включено свойство «Заполнять из данных заполнения», либо заполнение должно обрабатываться в модуле объекта в событии ОбработкаЗаполнения.

Решение 3: Явное открытие полученного экземпляра формы

Если по логике работы необходимо сначала скомпоновать форму через ПолучитьФорму(), следует передавать структуру параметров непосредственно при вызове этой функции, а затем вызывать метод Открыть() у созданного объекта формы:


&НаКлиенте
Процедура ОткрытьПодготовленнуюФорму()
    
    ПараметрыФормы = Новый Структура("КодКарты", КодКартыЛояльности);
    Форма = ПолучитьФорму("Справочник.КартыЛояльности.Форма.СчитываниеКартыЛояльности", 
        ПараметрыФормы, 
        ЭтаФорма);
        
    Форма.Открыть();

КонецПроцедуры

Решение 4: Передача контекста или параметров в 1С 7.7 и обычных формах

Посмотрим, как аналогичная задача решается в обычных формах или версиях 1С 7.7. В данном контексте второй параметр функции ОткрытьФорму() передается в открываемую форму в качестве свойства Форма.Параметр.

В форме документа:


ЗначениеПередаваемое = "33";
ОткрытьФорму("Справочник.ТМЦ", ЗначениеПередаваемое);

В форме справочника:


Процедура ПриОткрытии()
    
    // В переменной Форма.Параметр содержится переданное значение ("33")
    Сообщить(Форма.Параметр);
    РеквизитПолеВвода = Форма.Параметр;

КонецПроцедуры

Таким образом, выбор конкретного способа зависит от используемой платформы (управляемые или обычные формы) и задачи: автозаполнение нового объекта или передача произвольных параметров для логики интерфейса.

← На главную