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

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

Как вызвать обработку заполнения документа в 1С

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

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

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

Как работает механизм заполнения в 1С

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

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

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

Как вызвать заполнение из интерфейса пользователя

Самый простой способ — кнопка «Заполнить» в форме документа. В типовых конфигурациях она находится в командной панели формы или в подменю «Ещё». Рядом с табличными частями («Товары», «Услуги») часто есть свои команды: «Заполнить по остаткам», «Заполнить по заказу», «Подобрать товары». Эти команды вызывают серверные процедуры, которые пересчитывают табличную часть по данным информационной базы.

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

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

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

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

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

НовыйДок.Дата = ТекущаяДатаСеанса();

НовыйДок.Заполнить(ОснованиеСсылка); // вызовет ОбработкаЗаполнения

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

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

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

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

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

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

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

bsl
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
		Организация = ДанныеЗаполнения.Организация;
		Контрагент = ДанныеЗаполнения.Контрагент;
		Для Каждого СтрокаТовара Из ДанныеЗаполнения.Товары Цикл
			НоваяСтрока = Товары.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовара);
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Как доработать процедуру ОбработкаЗаполнения в модуле объекта

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

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

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

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

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

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

Как подключить внешнюю обработку заполнения
  1. 1
    Создайте внешнюю обработку с функцией СведенияОВнешнейОбработке и видом ЗаполнениеОбъекта
  2. 2
    Укажите в Назначении массив видов документов, для которых она работает
  3. 3
    Включите в базе использование дополнительных отчетов и обработок (Администрирование)
  4. 4
    Загрузите файл обработки в справочник Дополнительные отчеты и обработки
  5. 5
    Откройте форму документа и проверьте появление команды в меню Заполнить

Проверка результата и типичные ошибки

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

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

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

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

Выбор подхода под задачу

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

Как выбрать способ вызова

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

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

FAQ

Почему при нажатии «Создать» документ заполняется не полностью?

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

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

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

Как передать несколько параметров в ОбработкаЗаполнения?

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

Заполнение работает у администратора, но не у менеджера — в чём дело?

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

Чем отличается ОбработкаЗаполнения от ПриКопировании?

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

Можно ли запретить автоматическое заполнение для отдельных пользователей?

Штатной настройки «отключить заполнение по роли» нет. Реализуется доработкой: в начале ОбработкаЗаполнения проверяйте текущего пользователя или его роль и при совпадении устанавливайте СтандартнаяОбработка = Ложь или пропускайте свою ветку заполнения.

Итог

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

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