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

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

При работе с управляемыми формами в 1С:Предприятие 8 часто возникает необходимость передать дополнительные данные из формы документа в форму создаваемого справочника (например, при вызове кнопки «+ Создать» из выпадающего списка поля ввода). Разберем, как устроена платформа «под капотом» и какими способами можно отловить или переопределить передаваемые параметры.

Принцип работы платформы при нажатии ссылки «Создать»

Выясним причину, почему не удается отловить серверные процедуры документа в момент нажатия на кнопку создания нового элемента. Когда пользователь вводит текст в поле ввода и нажимает «Создать», платформа 1С выполнят передачу данных во внутреннем клиент-серверном коде, не вызывая промежуточных серверных процедур в форме документа-источника.

В этот момент автоматически происходят следующие действия:

  1. Введенный пользователем текст помещается платформой в параметр ЗначениеЗаполнения (который в дальнейшем подставляется в наименование или код создаваемого объекта).
  2. Настройки поля ввода, заданные в свойствах ПараметрыВыбора и СвязиПараметровВыбора, автоматически преобразуются в параметры открываемой формы:
    • Элементы с префиксом Отбор. формируют отбор в новом объекте.
    • Элементы с префиксом Дополнительно. передаются в структуру ДополнительныеПараметры.

Способ 1. Прием параметров в открываемом элементе справочника

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

Во-первых, до вызова формы в модуле объекта справочника срабатывает событие ОбработкаЗаполнения, куда в параметр ДанныеЗаполнения передается структура с автоматически сформированными данными.

Во-вторых, в форме самого справочника в процедуре ПриСозданииНаСервере все данные доступны через свойство Параметры.

Рассмотрим пример получения параметров в форме справочника:


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

    // Проверяем дополнительные параметры выбора
    Если Параметры.Свойство("Отбор") Тогда
        // Обработка переданных отборов
    КонецЕсли;

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

Способ 2. Полный перехват события «Создание» в форме документа

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

Разберем алгоритм по шагам:

  1. В форме документа для поля ввода создадим обработчик события Создание.
  2. Установим флаг СтандартнаяОбработка = Ложь, чтобы отменить стандартное открытие формы платформой.
  3. Сформируем собственную структуру параметров.
  4. Вызовем метод ОткрытьФорму, передав в качестве владельца сам элемент поля ввода.

Важно: Третий параметр функции ОткрытьФорму (владелец) обязательно должен содержать элемент формы (поле ввода), а в структуре параметров необходимо передать РежимВыбора = Истина. Это гарантирует, что после нажатия кнопки «Записать и закрыть» созданный элемент автоматически подставится в поле документа.

Посмотрим на пример кода в форме документа:


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

Способ 3. Динамическое дополнение параметров выбора

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

Проанализируем следующий пример:


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

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

← На главную