Как работают правила выгрузки данных (ПВД) с произвольным алгоритмом при обмене через планы обмена в КД 2?

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

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

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

В чем заключается разница механизмов выгрузки

Проанализируем два основных режима работы правил конвертации:

  1. Выгрузка через обработку «Универсальный обмен данными XML»: в этом режиме разработчик или пользователь вручную задает период выгрузки. В контексте обработчиков становятся доступны переменные ДатаНачала и ДатаОкончания. Обработка последовательно выполняет ПВД, считывает все подходящие под условие объекты и выгружает их в результирующий XML-файл.
  2. Выгрузка по планам обмена (включая типовые механизмы БСП): при обмене изменениями платформа не выбирает данные за произвольный период. Механизм использует метод ПланыОбмена.ВыбратьИзменения(), опрашивая таблицу регистрации изменений для конкретного узла. Платформа обходит только те объекты, которые были предварительно зарегистрированы на узле плана обмена.

Если в обработчике ПВД ПередОбработкой написан произвольный запрос с условием ГДЕ Объект.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания, то при запуске обмена по плану обмена произойдет следующее:

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

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

В типовой архитектуре 1С разделение ответственности реализовано следующим образом:

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

Если требуется фильтрация данных при выгрузке по плану обмена, правильнее всего настроить условия в ПРО, а в КД 2 использовать стандартные ПВД.

Способ 2. Адаптация произвольного запроса под контекст выполнения

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


Запрос = Новый Запрос;
ТекстЗапроса = 
    "ВЫБРАТЬ
    |   ДокументТаблица.Ссылка КАК Объект
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК ДокументТаблица";

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

Запрос.Текст = ТекстЗапроса;
ВыборкаДанных = Запрос.Выполнить().Выгрузить();

При использовании произвольной выборки в режиме плана обмена важно помнить: после успешной отправки данных зарегистрированные изменения с узла необходимо снимать программно с помощью метода ПланыОбмена.УдалитьРегистрациюИзменений(), если подсистема обмена не делает этого автоматически для данного типа данных.

Способ 3. Перенос дополнительных условий в ПКО

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

В обработчике ПКО ПередВыгрузкой проанализируем свойства выгружаемого объекта (переменная Источник). Если объект не должен передаваться в приемник, установим флаг отказа:


Если Источник.Проведен = Ложь ИЛИ Источник.СуммаДокумента <= 0 Тогда
    Отказ = Истина;
КонецЕсли;

В этом случае объект будет пропущен при выгрузке пакета, а регистрация на узле снимется штатным механизмом подсистемы обмена, что исключит повторные попытки его отправки.

Когда действительно оправдана произвольная выборка в ПВД при планах обмена

Использование ПВД с произвольным алгоритмом при регулярном обмене через планы обмена оправдано в тех случаях, когда необходимо выгружать служебные или оперативные данные без постоянной регистрации изменений. Например, передача актуальных остатков на текущий момент, расписания или прайс-листов, которые должны обновляться в приемнике при каждом сеансе связи вне зависимости от факта их изменения в источнике.

← На главную