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

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

ОбработкаЗаполнения в 1С: когда вызывается и как правильно использовать

Разбираем, когда вызывается обработчик ОбработкаЗаполнения в 1С: при вводе на основании, копировании, создании нового объекта. Примеры кода и типичные ошибки разработчиков.

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

Событие предназначено для автоматического заполнения реквизитов нового объекта: документа, справочника, задачи, бизнес-процесса. Оно вызывается до открытия формы объекта, поэтому пользователь сразу видит подготовленные данные и может их отредактировать до записи.

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

Когда именно вызывается событие ОбработкаЗаполнения

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

  • создание нового объекта через команду интерфейса («Создать» в списке документов или справочника) — если у объекта определён обработчик и заданы параметры заполнения по умолчанию;
  • ввод на основании — пользователь нажимает «Создать на основании» в исходном документе, и в параметр ДанныеЗаполнения передаётся ссылка на объект-основание;
  • копирование объекта — в ДанныеЗаполнения передаётся ссылка на копируемый объект;
  • программное создание через методы Документы.ИмяДокумента.СоздатьДокумент() с последующим явным вызовом Заполнить(ДанныеЗаполнения);
  • интерактивное создание объекта, у которого в палитре свойств задано «Значение заполнения» для реквизитов.

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

Когда обработчик НЕ вызывается

Не менее важно знать ситуации, в которых рассчитывать на событие нельзя. Это частая причина ошибок в логике обменов и фоновых процедур.

  • При записи уже существующего объекта — событие предназначено только для новых объектов.
  • При загрузке данных через обмен данными, если в плане обмена не предусмотрено иное — объект создаётся внутри механизма обмена без вызова обработчика.
  • При вызове СоздатьДокумент() без последующего Заполнить() — объект остаётся с пустыми реквизитами.
  • При установке свойства УстановитьСсылкуНового() и записи — заполнение не выполняется автоматически.

Параметры события и структура обработчика

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

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

// логика заполнения

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

Назначение параметров:

  • ДанныеЗаполнения — произвольное значение, переданное как источник заполнения. Чаще всего это ссылка на документ-основание или структура;
  • ТекстЗаполнения — строка, передаваемая при вводе по строке в поле ввода (для справочников);
  • СтандартнаяОбработка — булево. Если установить Ложь, платформа не выполнит стандартное заполнение (например, автоматическое копирование реквизитов при вводе на основании).

Правильная практика — проверять тип данных заполнения перед обращением к реквизитам:

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

Контрагент = ДанныеЗаполнения.Контрагент;

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

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

ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);

КонецЕсли;

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

Ввод на основании: особенности и настройка

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

  1. У объекта-основания в палитре свойств на закладке «Ввод на основании» указать, какие объекты могут создаваться на его основе (поле «Является основанием для»).
  2. У создаваемого объекта в поле «Вводится на основании» отметить допустимые основания.

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

При копировании в ДанныеЗаполнения также передаётся ссылка — на копируемый объект. Чтобы отличить копирование от ввода на основании, проверяйте тип ссылки или анализируйте контекст. В типовых конфигурациях часто используют функцию ЭтоКопирование по типу переданной ссылки.

Маршрут решения

Как выбрать действие

ДанныеЗаполнения — ссылка на документ-основаниеЗаполните реквизиты запросом к основанию, включая табличные части
ДанныеЗаполнения — структураИспользуйте ЗаполнитьЗначенияСвойств и проверьте наличие обязательных ключей
ДанныеЗаполнения не определены (пустое создание)Установите значения по умолчанию: организацию, ответственного, валюту
Нужно полностью своя логикаУстановите СтандартнаяОбработка = Ложь в начале обработчика

Заполнение значений по умолчанию при простом создании

Частая задача — подставить организацию, ответственного или склад при создании документа кнопкой «Создать», когда никакого основания нет. Здесь есть два подхода.

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

Если НЕ ЗначениеЗаполнено(ДанныеЗаполнения) Тогда

Ответственный = Пользователи.ТекущийПользователь();

Организация = Справочники.Организации.ОрганизацияПоУмолчанию();

КонецЕсли;

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

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

Типичные ошибки при работе с обработчиком

Первая ошибка — обращение к реквизитам ДанныеЗаполнения без проверки типа. Если пользователь создаст документ кнопкой «Создать», параметр будет неопределён, и обращение ДанныеЗаполнения.Контрагент вызовет исключение. Всегда начинайте с ТипЗнч().

Вторая ошибка — размещение в обработчике бизнес-проверок и пересчётов, которые должны работать при каждой записи. ОбработкаЗаполнения срабатывает один раз при создании; при дальнейших редактированиях документа эта логика не выполнится.

Третья ошибка — заполнение табличных частей через обращение к реквизитам основания напрямую, без запроса. Конструкция вида ДанныеЗаполнения.Товары.Выгрузить() работает, но при больших основаниях и частом вводе на основании запрос с явным перечнем полей надёжнее и быстрее.

Четвёртая ошибка — игнорирование параметра СтандартнаяОбработка. Если вы написали полностью свою логику, но не сбросили флаг, платформа дополнительно выполнит стандартное заполнение, и реквизиты могут быть перезаписаны.

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

Как проверить, что обработчик работает правильно

Самый быстрый способ — отладчик: установите точку останова в первой строке обработчика и выполните каждый сценарий создания объекта: кнопка «Создать», ввод на основании, копирование, программный вызов Заполнить(). В каждом случае проверьте, что приходит в ДанныеЗаполнения.

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

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

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

Создание кнопкой «Создать»
Норма

Обработчик вызывается, ДанныеЗаполнения пусты, подставляются значения по умолчанию

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

Исключение при обращении к реквизитам ДанныеЗаполнения

Ввод на основании
Норма

В ДанныеЗаполнения ссылка на основание, реквизиты перенесены корректно

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

Реквизиты пустые или заполнены дважды

Копирование
Норма

Обработчик вызывается, можно отличить копирование по типу ссылки

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

Логика ввода на основании срабатывает ошибочно

Запись существующего объекта
Норма

Обработчик не вызывается, данные не перезаписываются

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

Введённые пользователем значения затираются

Часто задаваемые вопросы

Вызывается ли ОбработкаЗаполнения при записи документа?

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

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

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

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

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

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

Нет, при загрузке объектов механизмами обмена ОбработкаЗаполнения не вызывается. Если нужны значения по умолчанию при обмене, реализуйте их в правилах конвертации или в подписке на событие записи.

Как отличить копирование от ввода на основании в обработчике?

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

Где лучше задавать значения по умолчанию: в обработчике или в свойствах реквизита?

Константные значения удобнее задавать через свойство «Значение заполнения» в конфигураторе — это не требует кода. Вычисляемые значения (текущий пользователь, основная организация) размещайте в обработчике.

Итог

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

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