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

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

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

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

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

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

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

Автоматический вызов происходит в четырёх типовых ситуациях. Первая — пользователь нажимает кнопку «Создать» в списке документов или справочника: платформа создаёт новый объект и перед открытием формы вызывает ОбработкаЗаполнения. Вторая — копирование существующего объекта: в данные заполнения передаётся ссылка на копируемый объект. Третья — ввод на основании: в данные заполнения попадает ссылка на объект-основание. Четвёртая — программное создание через методы менеджера с последующим вызовом Заполнить().

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

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

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

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

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

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

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

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

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

Для Каждого СтрокаТовара Из ДанныеЗаполнения.Товары Цикл

НоваяСтрока = Товары.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовара);

КонецЦикла;

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

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

КонецЕсли;

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

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

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

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

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

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

ПараметрыЗаполнения.Вставить("Организация", ОрганизацияПоУмолчанию);

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

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

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

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

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

Порядок программного создания с заполнением
  1. 1
    Создайте объект методом СоздатьДокумент() или СоздатьЭлемент()
  2. 2
    Подготовьте структуру данных заполнения или возьмите ссылку на основание
  3. 3
    Вызовите метод Заполнить(ДанныеЗаполнения)
  4. 4
    Проверьте, что обязательные реквизиты заполнены
  5. 5
    Выполните Записать() и при необходимости обработайте исключения

Вызов через команду интерфейса и ввод на основании

Если заполнение должно запускаться пользователем из интерфейса, настройте ввод на основании в конфигураторе. Откройте объект-основание, перейдите на закладку «Ввод на основании» и отметьте объекты, которые могут создаваться на его основе. Платформа автоматически добавит в форму списка и форму объекта кнопку «Создать на основании», а в обработчик заполнения будет передана ссылка на основание.

Для нестандартных сценариев создаётся собственная команда объекта. В модуле команды через ОткрытьФорму() передаются параметры: например, Новый Структура("Основание", СсылкаНаДокумент). Платформа распознаёт параметр «Основание» и при создании объекта передаст его значение в данные заполнения. Это позволяет запускать заполнение из любых форм, включая внешние обработки.

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

Стандартная обработка и значения по умолчанию

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

Разумная практика — не отключать стандартную обработку без необходимости. Если нужно только дополнить типовое поведение, оставьте параметр равным Истина и добавьте свои действия после. Если стандартная обработка мешает (например, подставляет нежелательные значения), отключите её, но явно заполните все обязательные реквизиты, иначе документ не запишется из-за проверки заполнения.

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

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

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

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

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

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

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

Вызов события
Норма

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

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

При программном создании обработчик не вызывается — забыли метод Заполнить()

Данные заполнения
Норма

ТипЗнч(ДанныеЗаполнения) соответствует ожидаемой ветке обработчика

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

Приходит Неопределено или неожиданный тип — обработчик молча ничего не заполняет

Обязательные реквизиты
Норма

После Записать() все ключевые поля и табличные части заполнены

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

Документ записан пустым или запись падает с ошибкой контроля заполнения

Ограничения и альтернативные подходы

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

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

Итог

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

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

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

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

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

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

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

Чем отличается ввод на основании от передачи структуры?

При вводе на основании в ДанныеЗаполнения приходит ссылка на объект-источник, и обработчик сам читает его реквизиты. Структура содержит готовые значения и не требует обращения к базе, но её состав нужно формировать в месте вызова.

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

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

Работает ли обработка заполнения для регистров сведений?

Да, но обработчик размещается в модуле менеджера записи (для независимых регистров) и вызывается при создании новой записи. Для подчинённых регистратору регистров заполнение обычно выполняется в обработке проведения документа-регистратора.

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

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