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