При переносе данных между конфигурациями 1С с помощью «1С:Конвертация данных 2.0» (КД 2.0) часто возникает необходимость обеспечить строгую последовательность появления документов в базе-приемнике. Это критично, когда один документ (например, ОперацияБух) должен ссылаться на другой или когда от порядка загрузки зависит корректность формирования движений. Рассмотрим ситуацию, когда нам нужно выгрузить цепочку: Поступление на расчетный счет — Операция — Отчет о розничных продажах.
Для начала проанализируем, как работает стандартный механизм КД 2.0. В правилах выгрузки данных (ПВД) существует реквизит Порядок. Многие начинающие разработчики ошибочно полагают, что он нужен только для визуальной сортировки в дереве правил. Однако это не так.
Реквизит Порядок определяет последовательность, в которой платформа будет выполнять правила при выгрузке. Объекты записываются в результирующий XML-файл ровно в том порядке, в котором выполняются ПВД. При загрузке в базу-приемник универсальная обработка читает файл последовательно. Следовательно, объект, который был записан в файл первым, будет первым создан и записан в информационную базу приемника.
Однако стандартный подход с указанием порядка в разных ПВД имеет ограничения, если логика выгрузки усложняется программным созданием сопутствующих объектов (как в случае с документом Операция, формируемым в событии ПослеОбработки). Давайте выясним, почему это происходит.
Рассмотрим ситуацию: ПКО ОтчетОРозничныхПродажах имеет одноименное ПВД, в котором в событии ПослеОбработки прописан алгоритм формирования документа Операция. В этом случае возникает логическая ловушка:
Отчеты о розничных продажах, соответствующие выборке.ПослеОбработки.Операция записываются в XML-файл в самую последнюю очередь.Если ваша цель — чтобы Операция находилась в журнале документов «между» поступлением и отчетом, такой подход не сработает. Чтобы решить задачу, нам потребуется реализовать ПВД с произвольным алгоритмом.
Многие задаются вопросом: возможно ли создать ПВД без указания конкретного правила конвертации объектов? Напрямую интерфейс КД 2.0 этого не поощряет, но технически это реализуется через Произвольный алгоритм. В таком ПВД поле «Правило конвертации» можно оставить пустым, а всю логику перенести в обработчики.
Разберем по шагам, как это настроить:
Правило конвертации оставляем пустым.В этом обработчике мы можем программно управлять выборкой данных и порядком их выгрузки. Вместо того чтобы полагаться на автоматические механизмы КД, мы сами вызываем функцию ВыгрузитьПоПравилу(). Посмотрим на пример кода:
// Пример в обработчике "Перед обработкой" ПВД
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтчетОРозничныхПродажах.Ссылка КАК Ссылка,
| ОтчетОРозничныхПродажах.Дата КАК Дата
|ИЗ
| Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
|ГДЕ
| ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", ДатаКонца);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// 1. Выгружаем Поступление (если есть связь)
// Здесь можно программно найти связанный документ и выгрузить его первым
// ВыгрузитьПоПравилу(СвязанноеПоступление, , , , "ПоступлениеНаРасчетныйСчет");
// 2. Выгружаем Операцию (программный объект)
// Создаем структуру или таблицу значений для передачи данных в ПКО Операции
ПараметрыДляОперации = Новый Структура("ДокументОснование, Сумма", Выборка.Ссылка, 100);
ВыгрузитьПоПравилу( , , ПараметрыДляОперации, , "ОперацияБух");
// 3. Выгружаем сам Отчет
ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "ОтчетОРозничныхПродажах");
КонецЦикла;
При таком подходе в XML-файле объекты будут идти строго друг за другом «тройками»: Поступление1, Операция1, Отчет1, затем Поступление2 и так далее. Это гарантирует идеальную последовательность при загрузке.
Проанализируем специфику документа Операция (бухгалтерский учет) в Бухгалтерии предприятия 3.0. Этот документ уникален тем, что его движения (записи в регистре бухгалтерии) записываются одновременно с самим документом через набор записей. В отличие от обычных документов, которые загружаются «непроведенными» (если не настроено обратное), Операция фактически вступает в силу сразу после загрузки.
Важный нюанс: Если ваша Операция должна опираться на аналитику или суммы из Отчета о розничных продажах, то к моменту загрузки набора записей операции объект-отчет уже должен существовать в базе. Если мы используем предложенный выше алгоритм (сначала Операция, потом Отчет), в момент записи операции ссылка на отчет может стать «битой» (объект-пустышка). Платформа восстановит связь позже, когда загрузит данные отчета, но если в момент записи операции срабатывают обработчики проведения, это может вызвать ошибку. Поэтому правильно выставляйте приоритет выгрузки внутри цикла.
Если вы все же решили разделять выгрузку по разным ПВД, помните о следующих правилах:
Справочники — порядок 10, Документы — порядок 100).НеЗамещатьОбъектыПриЗагрузке, если вы хотите просто создать ссылку, не перезаписывая данные.Таким образом, мы выяснили, что наиболее надежным способом управления сложной последовательностью в КД 2.0 является использование ПВД с произвольным алгоритмом. Это дает полный контроль над очередностью записи объектов в файл и позволяет передавать дополнительные параметры через функцию ВыгрузитьПоПравилу(), что невозможно при стандартной выборке объектов платформой.