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

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

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

Стандартный механизм: свойство реквизита «Заполнять из данных заполнения»

В большинстве случаев писать программный код не требуется — платформа 1С:Предприятие умеет передавать значения отбора во ввод нового объекта автоматически. Для этого используется встроенное свойство реквизита метаданных.

Рассмотрим порядок настройки этого механизма:

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

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

Ограничения и особенности работы стандартного механизма

Проанализируем ситуации, при которых стандартное заполнение может не сработать:

  1. Вид сравнения в отборе: Автоматическая передача данных из динамического списка работает только при виде сравнения «Равно». Если пользователь установил вид сравнения «В списке», «Содержит» или «Больше», платформа не сможет подставить значение автоматически.
  2. Активность отбора: Отбор должен быть обязательно включен (свойство Использование = Истина). Если флажок отбора в пользовательских настройках снят, значение передано не будет.
  3. Точное совпадение имен: Имя поля в отборе динамического списка должно строго совпадать с именем реквизита объекта метаданных. Если отбор установлен по составному полю (например, Договор.Владелец), платформа не сможет сопоставить его с реквизитом Организация без дополнительного кода.
  4. Группировка условий: Если элемент отбора помещен внутри сложной группы условий (например, «Группа ИЛИ»), платформа проигнорирует такое условие при автоматическом формировании данных заполнения.
  5. Приоритет значений: Если у реквизита задано статическое Значение заполнения в метаданных и при этом установлен флажок Заполнять из данных заполнения, то активный отбор из динамического списка будет иметь высший приоритет и перекроет статическое значение.

Альтернативные и программные способы заполнения

Если стандартного механизма недостаточно (например, при использовании вида сравнения «В списке» или при отборе по составным полям), разберем программные способы решения задачи.

1. Передача структуры через параметр «ЗначенияЗаполнения»

При открытии формы нового объекта из кода можно сформировать структуру со значениями и передать её в параметрах открытия формы:


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

ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыОткрытия);

2. Программный разбор отбора динамического списка

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


Для Каждого Элемент Из Список.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") И Элемент.Использование Тогда
        Если Строка(Элемент.ЛевоеЗначение) = "Организация" И Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда
            ЗначениеОрганизации = Элемент.ПравоеЗначение;
        КонецЕсли;
    КонецЕсли;
КонецЦикл;

3. Обработка в модуле объекта

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


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        Если ДанныеЗаполнения.Свойство("Организация") Тогда
            ЭтотОбъект.Организация = ДанныеЗаполнения.Организация;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Помните: если внутри процедуры ОбработкаЗаполнения установить значение СтандартнаяОбработка = Ложь, то автоматическое заполнение реквизитов платформой будет полностью отключено, и все необходимые значения разработчик должен будет присвоить вручную.

← На главную