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

В этой статье мы разберём все возможные сценарии вызова обработки заполнения — от стандартных действий пользователя до программных триггеров. Вы узнаете, как отличается поведение обработчика в разных версиях платформы 1С 8.3, какие события его запускают, а какие — нет. Особое внимание уделим типичным ошибкам, которые приводят к"непредсказуемому" поведению обработки, и покажем, как их избежать.

Материал будет полезен как начинающим программистам , так и опытным специалистам, которые хотят систематизировать знания о механизмах заполнения данных. Все примеры приведены с учётом актуальных версий платформы и типовых конфигураций (Бухгалтерия 3.0, Управление торговлей 11, Зарплата и управление персоналом 3.1).

1. Что такое обработка заполнения в 1С?

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

  • 📝 Стандартной — встроенной в типовую конфигурацию (например, заполнение табличной части документа РеализацияТоваровУслуг на основе данных справочника Номенклатура)
  • 🛠️ Кастомизированной — написанной разработчиком под специфические бизнес-процессы компании
  • 🔄 Динамической — изменяющей своё поведение в зависимости от условий (например, разных видов операций)

Главная особенность обработки заполнения — она не является событием платформы 1С. Это просто метод объекта, который можно вызвать как вручную (через интерфейс), так и программно. Именно поэтому многие путают её с событиями вроде ПриЗаписи или ПередЗаписью.

В типовой конфигурации обработка заполнения чаще всего используется для:

  • 📦 Автоматического подстановки номенклатуры в документы на основе предыдущих заказов
  • 💰 Расчёта цен и скидок по правилам ценовой политики
  • 📊 Заполнения аналитических разрезов (статьи затрат, проекты, подразделения)
  • 🔄 Переноса данных между связанными документами (например, из Заказ клиента в Реализация)
⚠️ Внимание: В конфигурациях на базе БСП (Библиотека стандартных подсистем) логика обработки заполнения может отличаться от"чистой" платформы. Например, в УТ 11 и ERP 2 используется механизм ПомощникЗаполнения, который расширяет стандартные возможности.

2. Стандартные события, вызывающие обработку заполнения

В большинстве случаев обработка заполнения запускается при выполнении определённых действий пользователя в интерфейсе. Рассмотрим основные сценарии:

2.1. Кнопка"Заполнить" в форме документа

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

Пример пути к кнопке в типовой Бухгалтерии 3.0:

Документ.ПоступлениеТоваровУслуг.Форма.КоманднаяПанель.Заполнить

2.2. Создание документа на основе другого

Когда пользователь создаёт документ на основе существующего (например, Реализация из Заказ клиента), платформа автоматически вызывает обработку заполнения для переноса данных. Это работает через механизм СоздатьНаОсновании.

Важно: в этом случае обработка заполнения может вызываться дважды:

  1. При создании нового документа (заполнение шапки)
  2. При заполнении табличных частей (если это предусмотрено логикой)

2.3. Автоматическое заполнение при открытии формы

В некоторых конфигурациях (например, ЗУП 3.1) обработка заполнения может срабатывать при открытии формы документа, если это задано в модуле формы. Например, для автоматического подстановки:

  • 👤 Сотрудника по умолчанию (из данных пользователя)
  • 📅 Даты документа (текущая дата или дата начала периода)
  • 🏢 Подразделения (по умолчанию для текущего пользователя)
📊 Как часто вы используете обработку заполнения в 1С?
Ежедневно
Несколько раз в неделю
Редко, только для специфических задач
Никогда не использую

2.4. Программный вызов из других процедур

Обработка заполнения может вызываться не только из интерфейса, но и программно. Типичные примеры:

// Пример 1: Вызов для документа

Док.ОбработкаЗаполнения;

// Пример 2: Вызов для справочника

Справочник.Элемент.ОбработкаЗаполнения;

// Пример 3: Вызов с параметрами

Док.ОбработкаЗаполнения(Истина, Ложь); // Первый параметр - заполнять реквизиты, второй - табличные части

⚠️ Внимание: При программном вызове обработки заполнения не происходит автоматическая транзакция. Если внутри обработчика изменяются данные, которые должны сохраняться атомарно, транзакцию нужно открывать явно:

НачатьТранзакцию;

Попытка

Док.ОбработкаЗаполнения;

ЗафиксироватьТранзакцию;

Исключение

ОтменитьТранзакцию;

ВызватьИсключение;

КонецПопытки;

3. Когда обработка заполнения НЕ вызывается?

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

3.1. При ручном вводе данных в табличную часть

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

3.2. При копировании документа

Операция копирования документа (через Скопировать или Ctrl+C/Ctrl+V) не вызывает обработку заполнения. Данные копируются"как есть", без дополнительной обработки. Это часто становится причиной ошибок, когда пользователи ожидают автоматического пересчёта цен или подстановки актуальных остатков.

3.3. При загрузке данных из внешних источников

Импорт данных через ЗагрузкаДанныхXML, ОбменДанными или другие механизмы интеграции не инициирует обработку заполнения. Разработчику нужно явно вызывать её в коде обработки загрузки, если это необходимо.

Пример типичной ошибки:

// Некорректный код - обработка заполнения не вызовется

Загрузка = Новый ЗагрузкаДанныхXML;

Загрузка.Загрузить(ИмяФайла);

// Корректный код - с явным вызовом

Загрузка = Новый ЗагрузкаДанныхXML;

Док = Загрузка.Загрузить(ИмяФайла);

Док.ОбработкаЗаполнения;

3.4. При изменении данных через прямой доступ

Если данные меняются напрямую через запросы или объекты типа ДвиженияДокумента, РегистрНакопления и т.п., обработка заполнения не срабатывает. Это логично, так как она привязана к объекту документа, а не к его движениям.

Процедура ОбработкаЗаполнения(ЗаполнятьРеквизиты, ЗаполнятьТабличныеЧасти) Экспорт

ЗаписьЖурналаРегистрации("ОбработкаЗаполнения", УровеньЖурналаРегистрации.Информация,,,

"Вызов обработки заполнения для" + Вид +"" + Ссылка.УникальныйИдентификатор);

// Основная логика

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

Это поможет отладить проблемы с неожиданными (или наоборот, отсутствующими) вызовами.-->

4. Особенности обработки заполнения в разных объектах 1С

Логика вызова обработки заполнения может отличаться в зависимости от типа объекта. Рассмотрим ключевые различия:

Тип объекта Когда вызывается обработка заполнения? Особенности
Документ При нажатии"Заполнить", создании на основании, программном вызове Может иметь несколько вариантов заполнения (по остаткам, по документам-основаниям и т.д.)
Справочник При создании нового элемента (если задано в модуле), программном вызове Часто используется для автоматического заполнения реквизитов (например, ПолноеНаименование на основе Наименование)
Регистр сведений Только программно Обработка заполнения используется редко, обычно данные заполняются через запись движений
Обработка Только программно Может эмулировать обработку заполнения для временных документов
Отчёт При формировании отчёта (если задано в модуле) Используется для автоматического заполнения параметров отчёта

4.1. Документы: множественные обработки заполнения

В документах может быть несколько обработок заполнения, каждая из которых отвечает за свой сценарий. Например, в РеализацияТоваровУслуг (типовая УТ 11) есть:

  • 📄 ЗаполнитьПоДокументамОснованиям — заполнение на основе заказов клиентов
  • 📦 ЗаполнитьПоОстаткам — подстановка доступного количества товаров
  • 💰 ЗаполнитьЦены — расчёт цен по прайс-листу

Каждая из этих процедур может вызываться отдельно через соответствующие кнопки в интерфейсе.

4.2. Справочники: обработка при создании

В справочниках обработка заполнения часто используется для:

  • 🆔 Автоматической генерации кода элемента
  • 📝 Заполнения полного наименования на основе краткого
  • 🔗 Подстановки связанных справочников (например, Группа номенклатуры по Виду номенклатуры)

Пример кода для справочника Номенклатура:

Процедура ОбработкаЗаполнения(Элемент)

Если ПустаяСтрока(Элемент.Код) Тогда

Элемент.Код = ПолучениеНовогоКодаСправочника(Элемент);

КонецЕсли;

Элемент.ПолноеНаименование = Элемент.Наименование +" (" + Элемент.Артикул +")";

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

5. Программные триггеры вызова обработки заполнения

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

5.1. Вызов из других обработчиков событий

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

  • 📝 ПриСозданииНаСервере — длязации данных при создании
  • 🔄 ПередЗаписью — для проверки и корректировки данных перед сохранением
  • 📊 ПриОткрытии — для заполнения данных при открытии формы

Пример вызова из ПередЗаписью:

Процедура ПередЗаписью(Отказ, РежимЗаписи)

Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда

ОбработкаЗаполнения(Истина, Ложь); // Заполняем только реквизиты шапки

КонецЕсли;

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

5.2. Вызов из внешних обработок и отчётов

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

Для Каждого Заказ Из МассивЗаказов Цикл

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

Док.ЗаказКлиента = Заказ;

Док.ОбработкаЗаполнения; // Заполняем на основе заказа

Док.Записать;

КонецЦикла;

5.3. Вызов при обмене данными

В сценариях интеграции (например, при обмене с 1С:Розница или МойСклад) обработка заполнения может вызываться для:

  • 🔄 Синхронизации данных между базами
  • 📦 Корректировки загруженных документов под правила учётной политики
  • 💰 Пересчёта цен и скидок по актуальным правилам
⚠️ Внимание: При обмене данными обработка заполнения может зациклиться, если в её логике есть обращения к тем же данным, которые обновляются в процессе обмена. Всегда проверяйте такие сценарии на тестовых базах!

// Пример потенциально опасного кода

Процедура ОбработкаЗаполнения

ДанныеИзОбмена = ПолучитьДанныеИзПланаОбмена; // Может вернуть неактуальные данные

Объект.Сумма = ДанныеИзОбмена.Сумма; // Циклическая зависимость!

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

5.4. Вызов из фоновых заданий

Фоновые задания (например, РегламентноеЗадание) могут использовать обработку заполнения для:

  • 🔄 Автоматического создания документов по расписанию
  • 📊 Обновления аналитических данных
  • 📦 Корректировки остатков

Пример кода регламентного задания:

Процедура ВыполнитьЗадание

Документы = Документы.ЗаказПоставщику.НайтиПоРеквизиту("Статус", Перечисления.СтатусыЗаказов.ОжидаетОбработки);

Для Каждого Док Из Документы Цикл

Док.ОбработкаЗаполнения;

Док.Статус = Перечисления.СтатусыЗаказов.Обработан;

Док.Записать;

КонецЦикла;

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

1. Убедиться, что обработка вызывается только когда это необходимо|false

2. Проверить, что нет рекурсивных вызовов (обработка не вызывает саму себя)|false

3. Учитывать транзакционность (при программном вызове)|false

4. Тестировать на больших объёмах данных (если обработка массовая)|false-->

6. Типичные ошибки и как их избежать

Работа с обработкой заполнения часто сопровождается ошибками, которые сложно диагностировать. Разберём самые распространённые:

6.1. Рекурсивный вызов обработки

Если внутри обработки заполнения снова вызывается она же (явно или через цепочку событий), возникает зацикливание, которое может привести к:

  • 🐢 Зависанию интерфейса
  • 💥 Падению сервера 1С по таймауту
  • 📉 Неконтролируемому росту потребления памяти

Пример ошибочного кода:

Процедура ОбработкаЗаполнения

//... некоторая логика...

Если Условие Тогда

ОбработкаЗаполнения; // Рекурсивный вызов!

КонецЕсли;

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

Как избежать:

  • 🔹 Использовать флаг-индикатор (например, ЭтоРекурсивныйВызов)
  • 🔹 Выносить повторяющуюся логику в отдельные процедуры

6.2. Игнорирование параметров вызова

Обработка заполнения в документах имеет два параметра:

Процедура ОбработкаЗаполнения(ЗаполнятьРеквизиты, ЗаполнятьТабличныеЧасти)

Если игнорировать эти параметры, можно столкнуться с:

  • 🐢 Ненужным заполнением табличных частей (замедляет работу)
  • 📉 Лишними обращениями к базе данных
  • 🔄 Некорректным поведением при частичном заполнении

Пример корректной обработки параметров:

Процедура ОбработкаЗаполнения(ЗаполнятьРеквизиты, ЗаполнятьТабличныеЧасти)

Если ЗаполнятьРеквизиты Тогда

ЗаполнитьРеквизитыШапки;

КонецЕсли;

Если ЗаполнятьТабличныеЧасти Тогда

ЗаполнитьТабличныеЧасти;

КонецЕсли;

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

6.3. Отсутствие обработки ошибок

Если внутри обработки заполнения происходит ошибка (например, при обращении к справочнику или регистру), она может:

  • 💥 Прервать работу пользователя
  • 📉 Оставить документ в некорректном состоянии
  • 🔄 Привести к потере данных

Всегда оборачивайте критические участки кода в Попытка...Исключение:

Процедура ОбработкаЗаполнения

Попытка

// Основная логика

Объект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

Исключение

ЗаписьЖурналаРегистрации("ОбработкаЗаполнения", УровеньЖурналаРегистрации.Ошибка,,,

"Ошибка заполнения контрагента:" + ОписаниеОшибки);

// Альтернативная логика (например, подстановка контрагента по умолчанию)

Объект.Контрагент = ПолучениеКонтрагентаПоУмолчанию;

КонецПопытки;

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

6.4. Неучёт прав доступа

Обработка заполнения выполняется в контексте текущего пользователя. Если у пользователя нет прав на чтение/запись определённых данных, это может привести к:

  • 🚫 Тихим ошибкам (данные не заполняются без уведомления)
  • 📉 Неполному заполнению документа
  • 🔄 Некорректной работе бизнес-логики

Пример проблемы:

// Пользователь не имеет прав на справочник"Склады"

Процедура ОбработкаЗаполнения

Объект.Склад = Справочники.Склады.Основной; // Вернёт ПустуюСсылку, если нет прав

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

Решение:

  • 🔹 Проверять права явно через ПраваДоступа.ПроверкаПрав
  • 🔹 Использовать сервисные функции для получения данных с учётом прав
Что делать, если обработка заполнения работает слишком долго?

Если обработка заполнения выполняется более 30 секунд, это может быть связано с:

  1. 🐢 Сложными запросами к базе данных (оптимизируйте индексы и структуру запросов)
  2. 📊 Большим объёмом данных в табличных частях (используйте постраничную обработку)
  3. 🔄 Рекурсивными вызовами (проверьте логику на зацикливание)
  4. 📈 Неэффективными алгоритмами (замените вложенные циклы на запросы)

Для диагностики используйте:

  • 📊 Журнал регистрации (включите запись событий с уровнем Отладка)
  • 🛠️ Тестирование и исправление (в конфигураторе)
  • 📈 План выполнения запроса (для анализа медленных запросов)

7. Примеры кода для разных сценариев

Рассмотрим практические примеры реализации обработки заполнения для типовых задач.

7.1. Заполнение документа на основе заказа клиента

Типичный сценарий для Управления торговлей 11 — заполнение РеализацияТоваровУслуг на основе ЗаказКлиента:

Процедура ОбработкаЗаполнения(ЗаполнятьРеквизиты, ЗаполнятьТабличныеЧасти) Экспорт

Если ЗаполнятьРеквизиты Тогда

Если ЗначениеЗаполнено(Объект.ЗаказКлиента) Тогда

Объект.Контрагент = Объект.ЗаказКлиента.Контрагент;

Объект.Договор = Объект.ЗаказКлиента.Договор;

Объект.Склад = Объект.ЗаказКлиента.Склад;

КонецЕсли;

КонецЕсли;

Если ЗаполнятьТабличныеЧасти Тогда

Если ЗначениеЗаполнено(Объект.ЗаказКлиента) Тогда

Объект.Товары.Очистить;

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

НоваяСтрока = Объект.Товары.Добавить;

НоваяСтрока.Номенклатура = СтрокаЗаказа.Номенклатура;

НоваяСтрока.Количество = СтрокаЗаказа.Количество;

НоваяСтрока.Цена = СтрокаЗаказа.Цена;

НоваяСтрока.Сумма = СтрокаЗаказа.Сумма;

КонецЦикла;

КонецЕсли;

КонецЕсли;

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

7.2. Автоматическое заполнение цен в документе

Пример для Бухгалтерии 3.0, где цены заполняются по типу цен из справочника:

Процедура ОбработкаЗаполненияЦен

Если Не ЗначениеЗаполнено(Объект.ТипЦен) Тогда

Возврат;

КонецЕсли;

Для Каждого Строка Из Объект.Товары Цикл

Цена = ПолучитьЦенуНоменклатуры(

Строка.Номенклатура,

Объект.ТипЦен,

Объект.Контрагент,

Объект.Дата

);

Если Цена > 0 Тогда

Строка.Цена = Цена;

Строка.Сумма = Строка.Количество * Цена;

КонецЕсли;

КонецЦикла;

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

Функция ПолучитьЦенуНоменклатуры(Номенклатура, ТипЦен, Контрагент, Дата)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| ЦеныНоменклатуры.Цена КАК Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

|ГДЕ

| ЦеныНоменклатуры.Номенклатура = &Номенклатура

| И ЦеныНоменклатуры.ТипЦен = &ТипЦен

| И ЦеныНоменклатуры.Период = МАКСИМУМ(ЦеныНоменклатуры.Период)

| И ЦеныНоменклатуры.Период <= &Дата";

Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Запрос.УстановитьПараметр("ТипЦен", ТипЦен);

Запрос.УстановитьПараметр("Дата", Дата);

Результат = Запрос.Выполнить;

Если Результат.Пустой Тогда

Возврат 0;

Иначе

Возврат Результат[0].Цена;

КонецЕсли;

КонецФункции

7.3. Заполнение справочника на основе связанных данных

Пример для справочника Номенклатура, где автоматически заполняется ПолноеНаименование и Артикул:

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

// Заполнение полного наименования

Если ПустаяСтрока(Объект.ПолноеНаименование) Тогда

Объект.ПолноеНаименование = Объект.Наименование;

Если Не ПустаяСтрока(Объект.Артикул) Тогда

Объект.ПолноеНаименование = Объект.ПолноеНаименование +" (арт." + Объект.Артикул +")";

КонецЕсли;

КонецЕсли;

// Автоматическая генерация артикула, если не заполнен

Если ПустаяСтрока(Объект.Артикул) Тогда

ПоследнийАртикул = ПолучитьПоследнийАртикул(Объект.ВидНоменклатуры);

Объект.Артикул = Строка(Число(ПоследнийАртикул) + 1);

КонецЕсли;

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

Функция ПолучитьПоследнийАртикул(ВидНоменклатуры)

Запрос = Новый Запрос;

Запрос.Текст =