При автоматизации бизнес-процессов часто возникает задача программного создания документов, таких как РеализацияТоваровУслуг или ПоступлениеТоваровУслуг. Основная сложность заключается в том, что в типовых конфигурациях 1С (БП, УТ, ERP) значительная часть логики — расчет цен, подстановка счетов учета, заполнение налогов — «зашита» в модуле формы или вызывается при интерактивном изменении реквизитов. Если просто создать объект и заполнить основные поля, документ может оказаться некорректным для бухгалтерского или управленческого учета. В этой статье мы подробно разберем, как программно выполнить стандартные команды заполнения, не открывая форму документа.
Первым делом проанализируем стандартный механизм платформы. Самый правильный способ заполнения нового документа — использование метода Заполнить(). Этот метод вызывает процедуру ОбработкаЗаполнения в модуле объекта. Рассмотрим пример, когда мы создаем реализацию на основании заказа:
НоваяРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// В качестве параметра передаем ссылку на документ-основание
НоваяРеализация.Заполнить(СсылкаНаЗаказ);
НоваяРеализация.Записать(РежимЗаписиДокумента.Запись);
Важный нюанс: метод Заполнить() может принимать не только ссылку, но и Структура. Если мы проанализируем код внутри ОбработкаЗаполнения, то увидим, что программа часто ищет в этой структуре определенные ключи. Передавая подготовленную структуру, мы можем заставить систему выполнить типовые алгоритмы без имитации действий пользователя.
Иногда логика заполнения вынесена в общие модули, но требует на вход объект типа ДанныеФормыСтруктура. Программно у нас есть только ДокументОбъект. Чтобы не переписывать сложные алгоритмы расчета, мы можем применить хитрость: создать структуру, ключи которой повторяют имена реквизитов формы. Выясним причину, почему это работает: многие серверные процедуры в типовых конфигурациях написаны универсально и обращаются к полям структуры так же, как к реквизитам объекта.
Разберем по шагам этот алгоритм:
ДокументОбъект.Посмотрим на пример кода, имитирующего работу со счетами учета в Бухгалтерии предприятия:
// Создаем структуру-мимик под ДанныеФормыСтруктура
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", ОбъектДокумента.Организация);
ПараметрыЗаполнения.Вставить("Склад", ОбъектДокумента.Склад);
// ... заполняем остальные важные поля
// Вызываем типовой серверный метод
СчетаУчетаВДокументах.ЗаполнитьСчетаУчета(ОбъектДокумента, "Товары", ПараметрыЗаполнения);
Проанализируем современные конфигурации на базе БСП. В них существует подсистема «Заполнение объектов». Вместо того чтобы вручную перечислять реквизиты, мы можем обратиться к экспортным методам модулей менеджера. Посмотрим, как это реализовано в типовых решениях. Часто в модуле менеджера документа есть процедура ИнициализироватьДокумент(). Рассмотрим подробнее возможность её вызова:
Для программного заполнения «как в форме» следует искать методы в общих модулях с названиями вроде ЗаполнениеОбъектовУТСервер или ОбработкаЗаполненияБП. Использование этих модулей гарантирует, что будут учтены все учетные политики, настройки пользователя и функциональные опции.
Одной из главных опасностей программного создания является риск забыть заполнить служебный реквизит, который не виден на форме, но критичен для проведения. Чтобы этого избежать, используем метод сравнения «эталонного» документа и созданного программно.
Выполним следующие действия:
KDiff3 или встроенное в 1С Сравнить файлы...).Пример кода для выгрузки объекта в XML для анализа:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СсылкаНаДокумент);
РезультатXML = ЗаписьXML.Закрыть();
// Полученную строку сохраняем в файл и сравниваем с эталоном
Рассмотрим преимущества этого подхода: вы сразу увидите разницу в скрытых реквизитах, ключах строк табличных частей (КлючСвязи), флагах налогового учета и других параметрах, которые обычно заполняются невидимо для пользователя.
При работе с объектом документа всегда помните о необходимости вызова проверки заполнения. Проанализируем ситуацию: если мы программно пропустили обязательный реквизит, 1С может позволить записать объект (в режиме Запись), но при попытке проведения возникнут ошибки. Поэтому перед финальной записью всегда используйте метод ПроверитьЗаполнение().
Также обратите внимание на ДополнительныеСвойства объекта. Иногда, чтобы программное создание не конфликтовало с подписками на события, туда передают специальные параметры, которые отключают избыточные проверки или специфические бизнес-алгоритмы, нужные только при интерактивной работе.
Подводя итог, мы видим, что наиболее надежный путь — это сочетание использования ОбработкаЗаполнения, вызова специализированных процедур из общих модулей типовой конфигурации и финальная сверка структуры объекта через механизмы сериализации. Это гарантирует, что созданный вами документ будет идентичен тому, что создал бы пользователь в интерфейсе программы.