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

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При автоматизации бизнес-процессов часто возникает задача программного создания документов, таких как РеализацияТоваровУслуг или ПоступлениеТоваровУслуг. Основная сложность заключается в том, что в типовых конфигурациях 1С (БП, УТ, ERP) значительная часть логики — расчет цен, подстановка счетов учета, заполнение налогов — «зашита» в модуле формы или вызывается при интерактивном изменении реквизитов. Если просто создать объект и заполнить основные поля, документ может оказаться некорректным для бухгалтерского или управленческого учета. В этой статье мы подробно разберем, как программно выполнить стандартные команды заполнения, не открывая форму документа.

Метод 1: Использование стандартного обработчика Заполнить()

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


НоваяРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// В качестве параметра передаем ссылку на документ-основание
НоваяРеализация.Заполнить(СсылкаНаЗаказ);
НоваяРеализация.Записать(РежимЗаписиДокумента.Запись);

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

Метод 2: Имитация данных формы для серверных процедур

Иногда логика заполнения вынесена в общие модули, но требует на вход объект типа ДанныеФормыСтруктура. Программно у нас есть только ДокументОбъект. Чтобы не переписывать сложные алгоритмы расчета, мы можем применить хитрость: создать структуру, ключи которой повторяют имена реквизитов формы. Выясним причину, почему это работает: многие серверные процедуры в типовых конфигурациях написаны универсально и обращаются к полям структуры так же, как к реквизитам объекта.

Разберем по шагам этот алгоритм:

  1. Создадим структуру, имитирующую реквизиты формы документа.
  2. Заполним её данными из нашего созданного объекта.
  3. Вызовем серверную процедуру из общего модуля (например, по расчету цен или счетов учета).
  4. Перенесем измененные данные из структуры обратно в ДокументОбъект.

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


// Создаем структуру-мимик под ДанныеФормыСтруктура
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", ОбъектДокумента.Организация);
ПараметрыЗаполнения.Вставить("Склад", ОбъектДокумента.Склад);
// ... заполняем остальные важные поля

// Вызываем типовой серверный метод
СчетаУчетаВДокументах.ЗаполнитьСчетаУчета(ОбъектДокумента, "Товары", ПараметрыЗаполнения);

Метод 3: Работа с библиотекой стандартных подсистем (БСП)

Проанализируем современные конфигурации на базе БСП. В них существует подсистема «Заполнение объектов». Вместо того чтобы вручную перечислять реквизиты, мы можем обратиться к экспортным методам модулей менеджера. Посмотрим, как это реализовано в типовых решениях. Часто в модуле менеджера документа есть процедура ИнициализироватьДокумент(). Рассмотрим подробнее возможность её вызова:

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

Метод 4: Верификация программного создания через сравнение XML

Одной из главных опасностей программного создания является риск забыть заполнить служебный реквизит, который не виден на форме, но критичен для проведения. Чтобы этого избежать, используем метод сравнения «эталонного» документа и созданного программно.

Выполним следующие действия:

  1. Создадим один документ вручную через интерфейс, заполним его всеми необходимыми данными и запишем.
  2. Создадим аналогичный документ программно вашим кодом.
  3. Сериализуем оба объекта в формат XML или JSON.
  4. Используем внешние инструменты сравнения файлов (например, KDiff3 или встроенное в 1С Сравнить файлы...).

Пример кода для выгрузки объекта в XML для анализа:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СсылкаНаДокумент);
РезультатXML = ЗаписьXML.Закрыть();
// Полученную строку сохраняем в файл и сравниваем с эталоном

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

Важные рекомендации при программной записи

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

Также обратите внимание на ДополнительныеСвойства объекта. Иногда, чтобы программное создание не конфликтовало с подписками на события, туда передают специальные параметры, которые отключают избыточные проверки или специфические бизнес-алгоритмы, нужные только при интерактивной работе.

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

← На главную