Разработка и Конфигурация · 13 мин
Обработка заполнения в 1С: когда вызывается и как настроить
Разбираем, когда 1С вызывает обработчики ОбработкаЗаполнения и ПриЗаписи, как работает заполнение документов и справочников, типичные ошибки разработчиков.
Обработчик ОбработкаЗаполнения — один из ключевых событийных механизмов 1С:Предприятия, который срабатывает при создании новых объектов. Разработчики часто сталкиваются с ситуацией, когда процедура в модуле объекта написана, но не выполняется, либо наоборот — срабатывает в неожиданных местах. Причина почти всегда в непонимании точных условий вызова этого события.
Обработка заполнения вызывается платформой не при каждом открытии формы и не при каждой записи объекта. Она срабатывает только при программном или интерактивном создании нового объекта с заполнением — когда система понимает, что объект нужно предзаполнить данными на основании чего-либо или значениями по умолчанию.
Ниже разберём все сценарии вызова, параметры события, типичные ошибки и способы отладки, чтобы обработчик работал предсказуемо и в типовых, и в самописных конфигурациях.
Что такое обработка заполнения и где она объявляется
ОбработкаЗаполнения — это предопределённая процедура модуля объекта (документа, справочника, задачи и других объектов метаданных). Платформа вызывает её автоматически, когда новый объект создаётся с инициализацией данных. Внутри обработчика разработчик описывает, какими значениями заполнить реквизиты шапки и табличные части.
Сигнатура процедуры выглядит так:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// логика заполнения
КонецПроцедуры
Параметр ДанныеЗаполнения содержит источник данных для заполнения — это может быть ссылка на объект-основание, структура с произвольными значениями или другой тип, зависящий от способа вызова. Параметр СтандартнаяОбработка позволяет отключить типовое заполнение, если установить его в Ложь.
Важно понимать: обработчик объявляется в модуле объекта, а не в модуле формы. Если процедуру разместить в модуле формы, платформа её не вызовет — это одна из самых частых причин «неработающей» обработки заполнения.
Когда платформа вызывает обработку заполнения
Событие срабатывает строго в перечисленных ниже сценариях. Если ваш случай не входит в список — обработчик вызван не будет, и это нормальное поведение платформы.
Ввод на основании
Самый частый сценарий. Пользователь в списке документов нажимает «Создать на основании» или разработчик программно создаёт объект на основании другого. В параметр ДанныеЗаполнения передаётся ссылка на объект-основание. Для работы ввода на основании у объекта-основания должна быть настроена связь: в свойствах объекта указано, на основании чего он вводится и что может вводиться на его основании.
Программный вызов метода Заполнить()
Если в коде после создания объекта вызвать метод Заполнить(ДанныеЗаполнения), платформа явно запустит обработчик. Это стандартный способ повторного заполнения объекта из кода, например при пересоздании документа по изменённым данным.
Создание объекта с параметром заполнения
При открытии формы нового объекта можно передать структуру с ключом Основание или значения заполнения через параметры формы. Платформа интерпретирует это как создание с заполнением и вызывает обработчик. Аналогично работает программное создание через Документы.ИмяДокумента.СоздатьДокумент() с последующим вызовом Заполнить().
Копирование объекта
При интерактивном копировании (кнопка «Скопировать») платформа создаёт новый объект и передаёт в обработчик ссылку на копируемый объект в качестве данных заполнения. Если в обработчике нет ветки для типа ссылки того же вида, заполнение может не выполниться так, как ожидается.
В ДанныеЗаполнения передаётся ссылка на основание
Объект уже заполнен, событие не нужно
За запись отвечают ПередЗаписью и ПриЗаписи
Явный программный запуск обработчика
В ДанныеЗаполнения — ссылка на копируемый объект
Когда обработка заполнения НЕ вызывается
Понимание «отрицательных» сценариев не менее важно. Обработчик не срабатывает при открытии формы существующего объекта — данные уже хранятся в базе, и заполнять их заново не требуется. Также событие не вызывается при записи: для логики, связанной с записью, существуют обработчики ПередЗаписью, ПриЗаписи и ОбработкаПроведения.
Ещё одна ситуация — создание нового объекта без указания данных заполнения и без настроенных значений заполнения по умолчанию. Например, если пользователь просто нажимает «Создать» в списке документов, у которого не заданы значения заполнения в свойствах реквизитов, обработчик может быть вызван с пустым ДанныеЗаполнения (значение Неопределено), а в некоторых сценариях типовые конфигурации перехватывают создание своими механизмами.
В управляемых формах типовых конфигураций (БСП) создание объекта часто идёт через общие команды и переопределяемые модули. Там стандартное событие может быть обёрнуто в механизмы библиотеки, и логику заполнения следует размещать в переопределяемых процедурах, а не только в модуле объекта.
Как работать с параметром ДанныеЗаполнения
Тип значения в ДанныеЗаполнения зависит от способа вызова, поэтому первым шагом в обработчике всегда определяйте тип входящих данных. Пропуск этой проверки — источник ошибок «Поле объекта не обнаружено» при копировании или программном создании.
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
Организация = ДанныеЗаполнения.Организация;
Контрагент = ДанныеЗаполнения.Контрагент;
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
КонецПроцедуры
При работе со структурой удобен метод ЗаполнитьЗначенияСвойств() — он переносит значения по совпадающим именам реквизитов. Но помните: метод не заполняет табличные части, их нужно обходить отдельно.
Если конфигурация типовая и в ней используется стандартный обработчик, установка СтандартнаяОбработка = Ложь отключит типовое заполнение. Делайте это осознанно: после отключения вся ответственность за заполнение обязательных реквизитов ложится на ваш код, и при пустых обязательных полях документ не запишется.
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ЗаполнитьПоРеализации(ДанныеЗаполнения);
ИначеЕсли ДанныеЗаполнения = Неопределено Тогда
// создание без основания — заполняем значениями по умолчанию
Ответственный = Пользователи.ТекущийПользователь();
КонецЕсли;Отладка и проверка вызова обработчика
Если обработчик «не работает», сначала проверьте сам факт вызова. Поставьте точку останова на первой строке процедуры в модуле объекта и воспроизведите сценарий: создание на основании, копирование, программное создание. Если точка не срабатывает — событие не вызывается, и проблема в способе создания объекта, а не в коде обработчика.
Убедитесь, что процедура находится именно в модуле объекта: в дереве конфигурации выберите объект, откройте контекстное меню и проверьте раздел модуля объекта. Процедура в модуле формы или в общем модуле с тем же именем не будет вызвана платформой как обработчик события.
Для диагностики содержимого ДанныеЗаполнения временно добавьте вывод типа в журнал регистрации или в сообщение. Это покажет, что именно передаёт платформа в вашем сценарии, и поможет правильно построить ветвление по типам.
- 1Убедитесь, что процедура объявлена в модуле объекта, а не в модуле формы
- 2Поставьте точку останова в первой строке ОбработкаЗаполнения
- 3Воспроизведите создание объекта: на основании, копированием или через Заполнить()
- 4Проверьте тип и содержимое параметра ДанныеЗаполнения в отладчике
- 5Убедитесь, что ветка кода для этого типа данных существует и выполняется
- 6Проверьте, что СтандартнаяОбработка не отключает нужное типовое заполнение
Типичные ошибки разработчиков
Первая ошибка — ожидание вызова обработчика при открытии формы существующего документа. Для инициализации формы при открытии используются события формы ПриСозданииНаСервере и ПриЧтенииНаСервере, а не обработка заполнения объекта.
Вторая ошибка — отсутствие ветки для типа «Структура» или для копирования. Обработчик, рассчитанный только на ввод на основании конкретного документа, молча ничего не делает в остальных сценариях, и пользователи получают пустой документ.
Третья ошибка — обращение к данным объекта-основания без проверки заполненности. Если основание создано программно и часть реквизитов пуста, прямое обращение к полям запросом или через точку может дать пустые значения там, где ожидались данные. Добавляйте проверки и значения по умолчанию.
Альтернативные и дополняющие механизмы
Не всю инициализацию нужно помещать в ОбработкаЗаполнения. Значения по умолчанию для простых случаев задаются прямо в свойствах реквизита (поле «Значение заполнения») — тогда платформа заполнит их без единой строки кода. Это предпочтительный способ для константных значений вроде способа оплаты или вида операции.
Для подстановки текущего пользователя, организации по умолчанию и подобных данных в типовых конфигурациях используются механизмы БСП: переопределяемые процедуры заполнения и подписки на события. Подписка на событие ОбработкаЗаполнения позволяет добавить свою логику, не меняя модуль объекта типового документа, что упрощает обновление конфигурации.
Если заполнение должно происходить по действию пользователя уже после создания объекта, реализуйте команду формы «Заполнить» с вызовом серверной процедуры — это прозрачнее, чем скрытая автоматика, и даёт пользователю контроль над результатом.
Способы заполнения нового объекта
Подходит для константных значений без логики; не работает с вычисляемыми данными
Универсальный способ для любой логики; требует проверки типа ДанныеЗаполнения
Для доработки типовых объектов без изменения их модулей; чуть сложнее в отладке
Заполнение по требованию пользователя; не срабатывает автоматически при создании
Проверка результата после внедрения
После написания или изменения обработчика пройдите все сценарии создания объекта, а не только основной. Минимальный набор: ввод на основании каждого поддерживаемого вида, копирование, простое создание из списка, программное создание из внешних обработок или обменов, если они есть.
Для каждого сценария проверьте, что заполнены обязательные реквизиты, табличные части перенесены корректно, а документ записывается и проводится без ошибок. Особое внимание уделите сценарию копирования — о нём чаще всего забывают.
Как проверить результат
Реквизиты и табличные части перенесены из основания
Поля пустые или перенесены не все строки
Новый объект заполнен по копируемому
Обработчик отработал как при вводе на основании или не отработал
Подставлены значения по умолчанию
Обязательные поля пусты, документ не записывается
Объект записывается без ошибок
Ошибки незаполненных реквизитов после заполнения
Часто задаваемые вопросы
Почему ОбработкаЗаполнения не вызывается при открытии документа?
Потому что событие предназначено только для создания новых объектов с заполнением. При открытии существующего документа данные читаются из базы, и для инициализации формы нужно использовать события ПриСозданииНаСервере или ПриЧтенииНаСервере модуля формы.
Чем отличается ОбработкаЗаполнения от ПриЗаписи?
ОбработкаЗаполнения вызывается один раз при создании объекта, до его первой записи, и отвечает за начальные значения реквизитов. ПриЗаписи срабатывает при каждой записи уже в транзакции и используется для логики, связанной с сохранением: проверок, записи связанных данных, движений.
Что передаётся в ДанныеЗаполнения при копировании документа?
При интерактивном копировании платформа передаёт ссылку на копируемый объект. Если в обработчике нет ветки, обрабатывающей ссылку того же вида, что и сам объект, заполнение по копируемому документу не выполнится — добавьте соответствующую проверку типа.
Можно ли вызвать обработку заполнения принудительно из кода?
Да. Создайте объект методом СоздатьДокумент() или СоздатьЭлемент() и вызовите у него метод Заполнить(ДанныеЗаполнения), передав ссылку на основание или структуру. Платформа выполнит обработчик так же, как при интерактивном создании.
Как добавить заполнение в типовой документ без изменения его модуля?
Создайте подписку на событие ОбработкаЗаполнения для нужного вида объектов и разместите логику в обработчике подписки в общем модуле. Это сохранит совместимость с обновлениями типовой конфигурации.
Почему после установки СтандартнаяОбработка = Ложь документ перестал записываться?
Отключение стандартной обработки означает, что типовое заполнение больше не выполняется, и все обязательные реквизиты должен заполнить ваш код. Проверьте, что в обработчике присваиваются значения всем полям, отмеченным как обязательные, либо не отключайте стандартную обработку полностью.
Что важно запомнить
ОбработкаЗаполнения вызывается только при создании нового объекта с заполнением: на основании, копированием или через метод Заполнить(). Процедура размещается в модуле объекта, первым шагом определяет тип ДанныеЗаполнения и не должна содержать записи других объектов. Для существующих объектов и записи используются другие события.