К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как передать значения заполнения в форму

Как передать значения заполнения в форму 1С через структуру параметров, обработчик ОбработкаЗаполнения и ПриСозданииНаСервере. Примеры кода, ошибки и проверка результата.

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

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

Что такое значения заполнения и когда они применяются

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

Типичные сценарии использования: создание документа из обработки с предопределённой организацией, открытие формы нового элемента справочника с заполненным владельцем, формирование заказа с заранее выбранным складом. Во всех случаях цель одна — объект появляется уже частично заполненным.

Передача через ОткрытьФорму

Самый распространённый способ — сформировать структуру параметров и передать её в метод ОткрытьФорму. Имя формы указывается полностью, например «Документ.РеализацияТоваровУслуг.ФормаОбъекта».

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);

ЗначенияЗаполнения.Вставить("Контрагент", ВыбранныйКонтрагент);

ПараметрыФормы = Новый Структура;

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

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

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

Если форму нужно открыть модально или получить результат выбора, используются дополнительные параметры ОткрытьФорму: владелец формы, уникальность, окно и описание оповещения о закрытии. На передачу значений заполнения это не влияет — структура передаётся тем же ключом.

Порядок действий
  1. 1
    Создайте структуру значений заполнения и добавьте в неё пары «имя реквизита — значение»
  2. 2
    Вложите эту структуру в структуру параметров формы с ключом «ЗначенияЗаполнения»
  3. 3
    Вызовите ОткрытьФорму с именем формы объекта и подготовленными параметрами
  4. 4
    Откройте форму и проверьте, что реквизиты заполнены переданными значениями

Обработка на стороне объекта: ОбработкаЗаполнения

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда

Если ДанныеЗаполнения.Свойство("Организация") Тогда

Организация = ДанныеЗаполнения.Организация;

КонецЕсли;

КонецЕсли;

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

Важно понимать порядок: сначала платформа выполняет стандартную обработку (подставляет значения из структуры в одноимённые реквизиты), затем вызывается код обработчика. Если в обработчике установить СтандартнаяОбработка = Ложь, автоматическое заполнение отменяется, и ответственность за заполнение полностью ложится на разработчика.

Доступ к значениям в форме: ПриСозданииНаСервере

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("ЗначенияЗаполнения") Тогда

ЗначенияЗаполнения = Параметры.ЗначенияЗаполнения;

Если ЗначенияЗаполнения.Свойство("Склад") Тогда

Элементы.ГруппаСклад.Видимость = Истина;

КонецЕсли;

КонецЕсли;

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

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

Ввод на основании через параметр Основание

Когда новый документ создаётся на основании другого, вместо структуры используется параметр «Основание». Платформа передаёт ссылку на документ-основание в ОбработкаЗаполнения, где типовой код обычно вызывает процедуру заполнения по основанию.

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Основание", СсылкаНаЗаказ);

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

В обработчике ОбработкаЗаполнения тип ДанныеЗаполнения в этом случае будет не «Структура», а ссылка на документ-основание. Поэтому в типовых конфигурациях обработчик начинается с анализа типа: если передана структура — работает одна ветка, если ссылка — вызывается заполнение по основанию. При доработке не удаляйте эту проверку, иначе сломается стандартный ввод на основании.

Сравнение вариантов

ЗначенияЗаполнения (структура)

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

Параметр Основание

Подходит для ввода документа на основании другого. Требует реализации заполнения по основанию в модуле объекта.

Собственные параметры формы

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

Частые ошибки и их последствия

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

Вторая ошибка — передача несериализуемых значений. Структура параметров формы передаётся между клиентом и сервером, поэтому в ней нельзя размещать объекты типа «Запрос», «ТабличныйДокумент» или COM-объекты. Используйте ссылки, примитивные типы, структуры и массивы из допустимых значений.

Третья ошибка — ожидание, что значения заполнения сработают в форме списка или форме выбора. Эти формы не создают объект, поэтому параметр для них бессмысленен. Значения заполнения передаются только в форму объекта (документа, справочника, задачи и т. п.).

Типичные ошибки
01
Опечатка в имени ключа структуры — реквизит молча не заполняется, ошибка не выводится
02
Обращение к Параметры.ЗначенияЗаполнения без проверки Свойство() — исключение при открытии формы из списка
03
Передача значений вместе с ключом существующего объекта — заполнение игнорируется
04
Установка СтандартнаяОбработка = Ложь в ОбработкаЗаполнения без собственного кода заполнения — объект остаётся пустым

Проверка результата и отладка

Чтобы убедиться, что значения дошли до объекта, поставьте точку останова в обработчике ОбработкаЗаполнения модуля объекта и посмотрите содержимое параметра ДанныеЗаполнения. Если там пусто — проблема на стороне вызывающего кода: проверьте имя формы, ключ структуры и то, что открывается именно форма нового объекта.

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

Контрольные точки

Как проверить результат

Содержимое ДанныеЗаполнения в ОбработкаЗаполнения
Норма

Структура содержит переданные ключи и значения

Тревожный признак

Параметр пуст или имеет другой тип — ошибка в вызывающем коде

Реквизиты объекта в открывшейся форме
Норма

Поля заполнены переданными значениями

Тревожный признак

Поля пустые или содержат значения по умолчанию — ищите код, перезаписывающий их

Повторное открытие формы из списка без параметров
Норма

Форма открывается без ошибок

Тревожный признак

Исключение при обращении к параметрам — нет проверки Свойство()

Итог

Что важно запомнить

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

Частые вопросы

Можно ли передать значения заполнения в табличную часть документа?

Напрямую стандартный механизм заполняет только реквизиты шапки. Для табличной части передайте данные в структуре (например, массив структур) и в обработчике ОбработкаЗаполнения вручную добавьте строки в табличную часть, перебрав этот массив.

Почему значения заполнения не срабатывают при копировании документа?

При копировании платформа передаёт параметр «ЗначениеКопирования», а не значения заполнения. ОбработкаЗаполнения при этом тоже вызывается, но ДанныеЗаполнения содержит ссылку на копируемый объект. Если нужно изменить поведение при копировании, анализируйте тип ДанныеЗаполнения в обработчике.

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

Если объект создаётся кодом через СоздатьДокумент() или СоздатьЭлемент(), форма не участвует, и параметр не нужен. Вызовите метод Заполнить(ДанныеЗаполнения) у нового объекта — он выполнит тот же обработчик ОбработкаЗаполнения, что и при открытии формы.

Работает ли механизм в управляемых и обычных формах одинаково?

Общий принцип совпадает: структура с ключом «ЗначенияЗаполнения» передаётся в параметрах формы. Различия касаются деталей передачи параметров и работы обработчиков, но для типовых задач код вызова ОткрытьФорму выглядит одинаково.

Можно ли запретить пользователю изменять заполненные таким способом реквизиты?

Да, но это делается отдельно: в ПриСозданииНаСервере формы проверьте наличие значения в Параметры.ЗначенияЗаполнения и установите для соответствующего элемента свойство ТолькоПросмотр = Истина. Сам механизм значений заполнения редактирование не блокирует.