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

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

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

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

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

Главная сложность в том, что событие срабатывает не всегда: многое зависит от способа создания объекта (интерактивно или программно), от настроек подсистемы в БСП и от того, как заполнены параметры команды ввода на основании. Из-за этого у начинающих разработчиков часто возникает вопрос, почему обработчик «не вызывается», хотя код написан правильно.

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

Что представляет собой событие ОбработкаЗаполнения

Событие объявляется в модуле объекта и имеет фиксированную сигнатуру. В типовых конфигурациях на базе БСП процедура обычно выглядит так:

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

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

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

Параметр ДанныеЗаполнения — это произвольное значение, с которым инициировано заполнение: ссылка на объект-основание, структура с параметрами или Неопределено. Параметр ТекстЗаполнения используется справочниками при автоподборе по вводу строки: платформа передаёт туда введённый текст, чтобы заполнить, например, наименование. СтандартнаяОбработка позволяет отключить встроенное заполнение платформы, установив значение Ложь.

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

Интерактивное создание нового объекта

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

Если список открыт с отбором, значения отбора обычно попадают в данные заполнения — так новый документ сразу получает организацию, склад или контрагента из текущего контекста. Это удобно, но требует аккуратной обработки: не все ключи структуры гарантированно присутствуют, поэтому перед обращением к ним нужно проверять наличие через Свойство().

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

Программное создание: когда обработчик вызывается, а когда нет

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

Чтобы логика обработки заполнения отработала и при программном создании, в типовых конфигурациях предусмотрен метод Заполнить() (в БСП это вызов процедуры заполнения с передачей данных). Типовой приём выглядит так:

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДокумент.Заполнить(ДокументОснование);

НовыйДокумент.Записать();

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

Ввод на основании

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

Внутри обработчика типовой код проверяет тип основания и заполняет реквизиты соответствующим образом:

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

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

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

// заполнение табличной части по данным заказа

КонецЕсли;

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

Копирование объекта и связанные события

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

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

Сравнение сценариев создания

Создать вручную

Обработка заполнения вызывается всегда, ДанныеЗаполнения — Неопределено или структура отборов.

Ввод на основании

Обработчик вызывается, в ДанныеЗаполнения — ссылка на основание; требуется проверка типа.

Копирование

Обработчик вызывается поверх скопированных значений; дополнительно срабатывает ПриКопировании.

Программно СоздатьДокумент()

Обработчик не вызывается, пока явно не выполнен метод Заполнить().

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

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

Дополнительно полезно вывести в журнал регистрации или в сообщение тип данных заполнения:

Сообщить("Тип данных заполнения: " + ТипЗнч(ДанныеЗаполнения));

Это сразу показывает, что именно передала платформа: Неопределено, структуру или ссылку. После отладки отладочные сообщения следует удалить, чтобы не засорять работу пользователей.

Порядок действий при диагностике
  1. 1
    Определите, как создаётся объект: вручную, на основании, копированием или из кода
  2. 2
    Поставьте точку останова в ОбработкаЗаполнения и воспроизведите сценарий
  3. 3
    Проверьте тип и содержимое параметра ДанныеЗаполнения
  4. 4
    Если создание программное — убедитесь, что вызывается метод Заполнить()
  5. 5
    Проверьте, что реквизиты заполнены до записи объекта и не перезаписаны позже

Типичные ошибки при работе с обработкой заполнения

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

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

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

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

Ограничения и рекомендации по архитектуре

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

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

Итог

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

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

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

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

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

Чем отличаются параметры ДанныеЗаполнения и ТекстЗаполнения?

ДанныеЗаполнения — произвольное значение (ссылка-основание, структура отборов или Неопределено), с которым инициировано создание объекта. ТекстЗаполнения — строка, введённая пользователем в поле ввода при создании элемента справочника «на лету»; вне этого сценария параметр обычно пуст.

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

Нет. Событие предназначено только для новых, ещё не записанных объектов. Для существующих объектов используются события формы (ПриСозданииНаСервере, ПриОткрытии) и события записи объекта.

Что делает параметр СтандартнаяОбработка и когда его отключать?

Если установить СтандартнаяОбработка = Ложь, платформа не будет выполнять своё встроенное заполнение (например, подстановку текста в наименование справочника). Отключать её стоит только когда вы полностью реализуете заполнение самостоятельно; в типовых конфигурациях необдуманное отключение может нарушить работу механизмов БСП.

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

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

Можно ли вызвать обработку заполнения повторно для уже заполненного объекта?

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