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

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

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

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

Анализ «костыля»: почему получение формы не работает в Конвертации данных

На форумах часто предлагают следующее решение для симуляции интерактивного ввода:


ФормаДокумента = ПолучитьФорму("Документ.ПриходныйКассовыйОрдер.ФормаОбъекта", Новый Структура("Ключ", ЭтотОбъект.ПКО));
ФормаДокумента.Объект.Дата = ТекущаяДата();
ФормаДокумента.Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПКО.РозничнаяВыручка");
ФормаДокумента.ВидОперацииПриИзмененииСервер();
ФормаДокумента.КонтрагентПриИзмененииСервер();
ФормаДокумента.Записать();

Давайте проанализируем, почему этот код категорически нельзя использовать в реальных проектах, особенно при обмене данными:

  1. Отсутствие клиентского контекста (Фоновые задания): Процессы обмена данными (будь то КД 2.0, КД 3.0 через EnterpriseData или веб-сервисы) практически всегда выполняются на сервере в фоновом задании. В фоновом задании вызов метода ПолучитьФорму() вызовет исключение, так как сервер ничего не знает об интерактивных окнах. Программа аварийно завершит работу.
  2. Нарушение архитектуры MVC (Model-View-Controller): Платформа 1С жестко разграничивает данные (Модель) и отображение (Представление). Модуль формы предназначен исключительно для управления визуальным интерфейсом: показать или скрыть колонку, заблокировать кнопку, изменить цвет текста. Вся бизнес-логика (расчет сумм, подбор счетов учета, проведение) должна находиться в модуле объекта или в общих модулях.
  3. Автоматическое управление интерфейсом: Разработчики часто боятся, что если не вызвать процедуры формы, то пользователь увидит «поломанный» интерфейс при открытии документа. Это заблуждение. При интерактивном открытии сохраненного документа системой автоматически вызывается событие ПриСозданииНаСервере модуля формы. Оно анализирует записанные данные и само настраивает видимость и доступность всех кнопок и полей.

Таким образом, наша главная задача при программном создании документа — правильно и полно заполнить сами данные в реквизитах объекта, а визуальную часть платформа возьмет на себя при открытии.

Способ 1. Использование механизма дополнительных свойств объекта (Рекомендуемый)

В современных конфигурациях, созданных на базе БСП (например, 1С:Бухгалтерия предприятия 3.0), разработчики предусмотрели специализированные флаги для программного заполнения счетов учета при записи объекта.

Этот метод идеально подходит для использования в обработчиках Конвертации данных (например, в обработчике «После загрузки» перед записью объекта). Нам достаточно передать специальный маркер в коллекцию дополнительных свойств объекта:


// В обработчике "После загрузки" правил конвертации объектов (ПКО)
Объект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);

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

Способ 2. Вызов программных методов общего модуля «СчетаУчетаВДокументах»

Если вам необходимо рассчитать и заполнить счета учета непосредственно в коде (до момента записи объекта), мы можем воспользоваться стандартными процедурами БСП. Для этого предназначен общий модуль СчетаУчетаВДокументах.

Рассмотрим детальный пример заполнения незаполненных счетов учета:


// Создаем структуру отбора, чтобы заполнить только пустые счета учета
Отбор = Новый Структура;
Отбор.Вставить("НеЗаполненныеРеквизиты", Истина); 

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

Если перед нами стоит задача полностью перезаполнить счета учета по умолчанию (даже если из другой системы прилетели неверные счета), мы можем передать вместо структуры отбора значение Неопределено:


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

Этот метод работает исключительно в серверном контексте, не требует создания формы и полностью имитирует действия пользователя при выборе аналитики на форме.

Способ 3. Программный вызов стандартного обработчика заполнения

Многие объекты конфигурации содержат встроенную логику инициализации параметров по умолчанию внутри обработчика ОбработкаЗаполнения в модуле объекта. Мы можем вызвать этот обработчик программно при создании нового документа.

Давайте посмотрим, как правильно инициализировать документ параметрами заполнения:


НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

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

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

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

Резюме для реализации обмена в Конвертации Данных

Чтобы успешно переносить документы и избегать ошибок «пустых счетов учета» или неверного заполнения реквизитов, придерживайтесь следующих правил:

Использование правильных серверных методов БСП вместо «обходных путей» через форму гарантирует стабильность обмена данными, высокую производительность и корректность ведения бухгалтерского и управленческого учета.

← На главную