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

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

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

Способ 1. Использование свойства «Заполнять из данных заполнения»

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

Проанализируем, что для этого нужно сделать:

  1. Откроем конфигуратор и найдем нужный документ.
  2. Перейдем на вкладку Данные и откроем свойства конкретного реквизита (например, Организация).
  3. Установим флаг Заполнять из данных заполнения.

Теперь, если в форме списка пользователь установил отбор Организация Равно "Наша компания", при создании нового документа поле Организация будет заполнено автоматически. Важно помнить, что этот механизм работает только для простых видов сравнения, таких как Равно. Если в отборе используется условие В списке, система не сможет определить, какое именно значение выбрать, и поле останется пустым.

Способ 2. Программная установка свойства «ЗначенияЗаполнения» динамического списка

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

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


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

После выполнения этого кода стандартная кнопка Создать будет автоматически подхватывать данные из этой структуры. Эти значения попадут в модуль объекта нового документа в процедуру ОбработкаЗаполнения в качестве параметра ДанныеЗаполнения.

Способ 3. Переопределение события «ПередНачаломДобавления»

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

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


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

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

Способ 4. Использование хранилища общих настроек (подход из УТ 11)

В некоторых типовых конфигурациях (например, Управление торговлей 11) используется механизм сохранения последних выбранных значений. Проанализируем пример кода, предложенный в обсуждении:


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

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

Этот способ позволяет «запоминать» выбор пользователя даже после закрытия программы. Однако стоит быть осторожным: если пользователь создает документ не из формы списка, а, например, из обработки, в документ все равно может подставиться «старая» касса из хранилища. Поэтому такой метод лучше комбинировать с проверкой ТипЗнч(ДанныеЗаполнения).

Способ 5. Передача сложных данных через Временное хранилище

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

Правильный алгоритм действий в таком случае будет следующим:

  1. В форме списка помещаем данные во Временное хранилище и получаем уникальный Адрес.
  2. Передаем этот Адрес как параметр при открытии формы документа.
  3. В форме документа в событии ПриСозданииНаСервере извлекаем данные по адресу и заполняем объект.

Пример реализации передачи адреса:


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

Резюме и рекомендации

Выбор метода зависит от сложности вашей задачи:

Соблюдение этих стандартов разработки обеспечит корректную работу механизмов 1С и упростит дальнейшую поддержку кода другими программистами.

← На главную