Как передать данные из документа в форму создания нового элемента справочника?

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача: при создании нового элемента справочника из формы документа необходимо автоматически заполнить некоторые реквизиты этого справочника данными из самого документа. Например, если мы создаем «Контактное лицо» прямо из формы «Заказа клиента», логично, что поле «Владелец» или «Контрагент» в справочнике должно заполниться автоматически. Рассмотрим несколько эффективных способов решения этой задачи, начиная от простых настроек в конфигураторе и заканчивая программным управлением параметрами форм.

Способ 1. Использование события «Создание» у элемента формы

Разберем ситуацию, когда пользователь нажимает кнопку создания нового элемента в поле выбора справочника. Для того чтобы вмешаться в процесс открытия формы создания, мы можем использовать специализированное событие элемента формы документа. Проанализируем, как это реализовать по шагам.

Во-первых, выберем на форме документа реквизит, ссылающийся на справочник. В свойствах этого элемента (в палитре свойств) найдем событие Создание (или ОбработкаСоздания). После нажатия на лупу платформа создаст клиентский обработчик.

Во-вторых, в этом обработчике мы сформируем структуру параметров, которые хотим передать в новую форму. Рассмотрим пример кода:


&НаКлиенте
Процедура КонтактноеЛицоСоздание(Элемент, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие, чтобы вызвать форму программно с нашими параметрами
    СтандартнаяОбработка = Ложь;
    
    ПараметрыЗаполнения = Новый Структура;
    ПараметрыЗаполнения.Вставить("Организация", Объект.Организация);
    ПараметрыЗаполнения.Вставить("ОсновнойМенеджер", Объект.Менеджер);
    
    // Формируем общую структуру параметров формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
    
    // Открываем форму создания нового элемента
    ОткрытьФорму("Справочник.КонтактныеЛица.ФормаОбъекта", ПараметрыФормы, Элемент);
    
КонецПроцедуры

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

Способ 2. Механизм «Связи параметров выбора» (ChoiceParameterLinks)

Существует еще более простой способ, который часто называют «бескодовым». Если нам нужно передать данные, которые уже есть в реквизитах документа, мы можем настроить их связь в конфигураторе. Проанализируем, как это работает.

  1. Откроем конфигуратор и найдем документ, из которого вызывается справочник.
  2. Перейдем к нужному реквизиту (например, КонтактноеЛицо).
  3. В свойствах реквизита найдем пункт Связи параметров выбора.
  4. Нажмем кнопку выбора и добавим новую связь. Например, укажем, что реквизит справочника Владелец должен быть связан с реквизитом документа Контрагент.

Преимущество этого метода: он работает автоматически. Когда пользователь нажмет «Создать» в поле выбора, платформа сама передаст текущее значение контрагента из документа в новую форму справочника. Это наиболее предпочтительный метод для простых связей.

Способ 3. Получение данных через Владельца формы (на стороне клиента)

Рассмотрим ситуацию, когда форма справочника уже открыта. В 1С каждая форма имеет свойство ВладелецФормы. Если справочник был открыт из документа, то владельцем будет форма этого документа. Мы можем обратиться к данным документа напрямую через это свойство.

Однако важно помнить: ВладелецФормы — это именно объект формы. Чтобы получить данные, нам нужно обратиться к основному реквизиту этой формы (обычно это Объект). Посмотрим на пример кода в форме справочника:


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

Этот способ позволяет получить доступ даже к тем данным, которые пользователь только что ввел на форме документа, но еще не успел нажать кнопку Записать.

Способ 4. Модуль объекта: ОбработкаЗаполнения

Если логика заполнения сложная (например, нужно выполнить запрос к базе данных на основании переданной ссылки), лучше всего использовать серверное событие ОбработкаЗаполнения, которое находится в модуле объекта справочника. Выясним причину, почему это удобно: это событие срабатывает всегда при создании нового объекта, независимо от того, из какой формы он создается.

Рассмотрим пример кода в модуле объекта справочника:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
        // Если нам передали ссылку на документ
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ Организация, Склад ИЗ Документ.ЗаказКлиента ГДЕ Ссылка = &Ссылка";
        Запрос.УстановитьПараметр("Ссылка", ДанныеЗаполнения);
        // ... выполняем запрос и заполняем реквизиты справочника
        
    ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        // Если нам передали структуру (как в Способе 1)
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
    КонецЕсли;
    
КонецПроцедуры

В этом случае в методе ОткрытьФорму в документе нам достаточно передать ссылку на сам документ: ПараметрыФормы.Вставить("ЗначенияЗаполнения", Объект.Ссылка);.

Способ 5. Использование параметров формы и ПриСозданииНаСервере

Если нам нужно передать специфические данные, которые не являются реквизитами справочника (например, какой-то флаг или режим работы), мы можем использовать произвольные ключи в структуре параметров. Проанализируем этот путь.

В документе:


ПараметрыФормы = Новый Структура("МойСпециальныйФлаг", Истина);
ОткрытьФорму("Справочник.КонтактныеЛица.ФормаОбъекта", ПараметрыФормы);

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("МойСпециальныйФлаг") Тогда
        Если Параметры.МойСпециальныйФлаг Тогда
            // Устанавливаем видимость каких-то элементов или меняем логику
            Элементы.ГруппаДополнительно.Видимость = Ложь;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Резюме

Мы рассмотрели различные подходы к интеграции данных документа и справочника. Подведем итог выбора метода:

Правильное использование этих механизмов делает интерфейс программы отзывчивым, а работу пользователя — более комфортной, исключая необходимость двойного ввода одних и тех же данных.

← На главную