Как в КД 2.0 настроить строгую последовательность выгрузки документов и использовать ПВД без ПКО

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

При переносе данных между конфигурациями 1С с помощью «1С:Конвертация данных 2.0» (КД 2.0) часто возникает необходимость обеспечить строгую последовательность появления документов в базе-приемнике. Это критично, когда один документ (например, ОперацияБух) должен ссылаться на другой или когда от порядка загрузки зависит корректность формирования движений. Рассмотрим ситуацию, когда нам нужно выгрузить цепочку: Поступление на расчетный счет — Операция — Отчет о розничных продажах.

Разбор работы реквизита Порядок в ПВД

Для начала проанализируем, как работает стандартный механизм КД 2.0. В правилах выгрузки данных (ПВД) существует реквизит Порядок. Многие начинающие разработчики ошибочно полагают, что он нужен только для визуальной сортировки в дереве правил. Однако это не так.

Реквизит Порядок определяет последовательность, в которой платформа будет выполнять правила при выгрузке. Объекты записываются в результирующий XML-файл ровно в том порядке, в котором выполняются ПВД. При загрузке в базу-приемник универсальная обработка читает файл последовательно. Следовательно, объект, который был записан в файл первым, будет первым создан и записан в информационную базу приемника.

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

Проблема использования события ПослеОбработки

Рассмотрим ситуацию: ПКО ОтчетОРозничныхПродажах имеет одноименное ПВД, в котором в событии ПослеОбработки прописан алгоритм формирования документа Операция. В этом случае возникает логическая ловушка:

  1. Платформа сначала выгружает все Отчеты о розничных продажах, соответствующие выборке.
  2. Только после завершения обработки всех отчетов срабатывает событие ПослеОбработки.
  3. Программно сформированные документы Операция записываются в XML-файл в самую последнюю очередь.

Если ваша цель — чтобы Операция находилась в журнале документов «между» поступлением и отчетом, такой подход не сработает. Чтобы решить задачу, нам потребуется реализовать ПВД с произвольным алгоритмом.

Реализация ПВД с произвольным алгоритмом (ПВД без ПКО)

Многие задаются вопросом: возможно ли создать ПВД без указания конкретного правила конвертации объектов? Напрямую интерфейс КД 2.0 этого не поощряет, но технически это реализуется через Произвольный алгоритм. В таком ПВД поле «Правило конвертации» можно оставить пустым, а всю логику перенести в обработчики.

Разберем по шагам, как это настроить:

  1. Создадим новое ПВД и установим тип выборки — Произвольный алгоритм.
  2. Поле Правило конвертации оставляем пустым.
  3. Основную логику выгрузки пишем в обработчике Перед обработкой.

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


// Пример в обработчике "Перед обработкой" ПВД
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ОтчетОРозничныхПродажах.Ссылка КАК Ссылка,
    |	ОтчетОРозничныхПродажах.Дата КАК Дата
    |ИЗ
    |	Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
    |ГДЕ
    |	ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    
    // 1. Выгружаем Поступление (если есть связь)
    // Здесь можно программно найти связанный документ и выгрузить его первым
    // ВыгрузитьПоПравилу(СвязанноеПоступление, , , , "ПоступлениеНаРасчетныйСчет");
    
    // 2. Выгружаем Операцию (программный объект)
    // Создаем структуру или таблицу значений для передачи данных в ПКО Операции
    ПараметрыДляОперации = Новый Структура("ДокументОснование, Сумма", Выборка.Ссылка, 100);
    ВыгрузитьПоПравилу( , , ПараметрыДляОперации, , "ОперацияБух");
    
    // 3. Выгружаем сам Отчет
    ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "ОтчетОРозничныхПродажах");
    
КонецЦикла;

При таком подходе в XML-файле объекты будут идти строго друг за другом «тройками»: Поступление1, Операция1, Отчет1, затем Поступление2 и так далее. Это гарантирует идеальную последовательность при загрузке.

Особенности выгрузки документа Операция в БП 3.0

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

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

Ссылочная целостность и отложенные обработчики

Если вы все же решили разделять выгрузку по разным ПВД, помните о следующих правилах:

Таким образом, мы выяснили, что наиболее надежным способом управления сложной последовательностью в КД 2.0 является использование ПВД с произвольным алгоритмом. Это дает полный контроль над очередностью записи объектов в файл и позволяет передавать дополнительные параметры через функцию ВыгрузитьПоПравилу(), что невозможно при стандартной выборке объектов платформой.

← На главную