Как программно инициализировать заполнение реквизитов документа при загрузке через Конвертацию данных 2.1?

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

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

В этой статье мы подробно разберем, почему попытка напрямую вызвать процедуру формы (например, ВидОперацииПриИзменении) обречена на провал, и как решить эту задачу правильно, не внося изменений в конфигурацию-приемник.

Почему нельзя напрямую вызвать процедуру формы?

Для начала разберем архитектурную причину этой проблемы. Платформа «1С:Предприятие 8» строго разделяет логику на клиентскую и серверную части. Загрузка данных через КД 2.1 выполняется на сервере в фоновом режиме. На сервере в этот момент:

  1. Отсутствует контекст формы. Нет никаких элементов управления, кнопок, табличных полей и самой формы как объекта. Попытка обратиться к форме или ее методам вызовет критическую ошибку.
  2. Процедуры формы недоступны. Процедуры вроде ВидОперацииПриИзменении(Элемент) предназначены исключительно для интерактивной работы пользователя. Они принимают в качестве параметра Элемент (клиентский элемент управления), которого физически не существует при программной записи объекта.

Следовательно, идти по пути «вызова процедуры формы» — в корне неверно. Наша задача — повторить ту же самую прикладную логику, но исключительно на уровне сервера и манипуляции с данными объекта.

---

Решение 1: Анализ логики формы и вызов серверных общих модулей

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

Проанализируем ситуацию по шагам:

  1. Откроем конфигуратор БП 3.0 и найдем форму нужного документа.
  2. Перейдем в модуль формы и найдем процедуру ВидОперацииПриИзменении.
  3. Посмотрим, какие серверные процедуры вызываются внутри нее. Обычно цепочка вызовов ведет к экспортным методам общих модулей или модуля менеджера документа.
  4. Скопируем вызовы этих методов и перенесем их в правила обмена КД 2.1.

В КД 2.1 для этого отлично подходит обработчик «После загрузки» в Правилах конвертации объектов (ПКО) для конкретного документа. В этом обработчике нам доступна переменная Объект (тип — соответствующий ДокументОбъект).

Рассмотрим пример кода, который можно написать в обработчике «После загрузки» ПКО для заполнения счетов учета расчетов в БП 3.0:


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

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

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


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

---

Решение 2: Использование стандартного метода Заполнить()

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

Давайте рассмотрим, как это реализовать в обработчике «После загрузки» КД 2.1:


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

// Вызываем стандартный метод заполнения объекта на сервере
Объект.Заполнить(ПараметрыЗаполнения);

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

---

Решение 3: Отложенная обработка (наиболее надежный вариант для КД 2.1)

При загрузке связанных данных в КД 2.1 объекты записываются последовательно. Может возникнуть ситуация, когда документ загружается раньше, чем контрагент или договор, на который он ссылается. Если попытаться рассчитать счета учета в обработчике «После загрузки» самого документа, алгоритм отработает неверно, так как у документа еще нет ссылки на записанный договор.

Чтобы обойти эту проблему, применим метод отложенной обработки в рамках правил конвертации:

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

// В обработчике "После загрузки" ПКО Документа:
Если Параметры.Свойство("ДокументыДляОбработки") Тогда
    Параметры.ДокументыДляОбработки.Добавить(Объект.Ссылка);
КонецЕсли;
  1. В глобальном обработчике конвертации «После загрузки данных», который выполняется в самом конце, когда абсолютно все объекты уже созданы и записаны в базу данных приемника, мы выполним обход накопленного массива документов.

Рассмотрим пример реализации финального обхода в глобальном обработчике:


// Проверим наличие параметров и обработаем накопленные ссылки
Если Параметры.Свойство("ДокументыДляОбработки") Тогда
    Для Каждого СсылкаНаДокумент Из Параметры.ДокументыДляОбработки Цикл
        
        // Получаем объект для редактирования
        ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
        
        Если ДокументОбъект <> Неопределено Тогда
            // Теперь все связанные справочники (договоры, контрагенты) гарантированно есть в БД.
            // Можем безопасно вызывать типовые процедуры заполнения счетов
            СчетаУчетаВДокументах.ЗаполнитьСчетаУчета(ДокументОбъект);
            
            // Записываем документ с проведением или без в зависимости от требований
            ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;
        
    КонецЦикла;
КонецЕсли;

Этот подход гарантирует 100% корректность заполнения всех аналитических разрезов учета и исключает ошибки, связанные с отсутствием ссылочной целостности на момент загрузки xml-пакета.

---

Резюме

Для того чтобы программно инициализировать заполнение документов при переносе данных через КД 2.1 без изменения типовой конфигурации БП 3.0, используйте следующие правила:

← На главную