При настройке синхронизации данных между конфигурациями 1С на базе универсального формата (EnterpriseData / КД 3.0) разработчики часто сталкиваются с вопросом: где именно хранятся правила конвертации и как корректно исключить определенные позиции номенклатуры или справочников из обмена, чтобы они не попадали в базу-приемник вместе с документами.
Разберем архитектуру универсального обмена, выясним расположение правил в конфигурации и рассмотрим практические способы фильтрации данных.
В отличие от классической «Конвертации данных 2.1», где правила выгружаются в виде внешнего XML-файла и загружаются в планы обмена, в формате EnterpriseData логика обмена зашита в код конфигурации. Основные алгоритмы и правила конвертации объектов (ПКО) расположены в специализированных общих модулях:
МенеджерОбменаЧерезУниверсальныйФормат. В зависимости от используемой версии формата и конфигурации их может быть несколько, например: МенеджерОбменаЧерезУниверсальныйФормат13, МенеджерОбменаЧерезУниверсальныйФормат20 и т. д.МенеджерОбменаЧерезУниверсальныйФорматПереопределяемый.Внутри этих модулей реализована двухэтапная схема выгрузки объектов:
ДанныеИБ на основе выборки из информационной базы.ДанныеXDTO по правилам конвертации перед непосредственной сериализацией в XML.Проанализируем распространенную ошибку: попытку отсечь передачу номенклатуры исключительно через правила регистрации данных. Если мы настроим фильтр в ПРД, элемент справочника не будет регистрироваться к выгрузке при самостоятельном создании или изменении.
Однако если этот элемент номенклатуры указан в табличной части зарегистрированного документа (например, реализации товаров или поступления), механизм обмена выгрузит ссылку на него по ссылочной целостности. В результате нежелательный объект все равно появится в базе-приемнике. Для полного исключения объекта требуется воздействовать на логику формирования самого документа.
Рассмотрим основные технические варианты отсечения ненужных данных в обмене.
В модуле менеджера обмена для каждого типа документа предусмотрена отдельная экспортная функция, формирующая структуру для выгрузки (например, ДанныеДокументаРеализацияТоваровУслуг). В этой функции выполняется запрос к реквизитам и табличным частям объекта.
Мы можем скорректировать запрос или обработать полученную таблицу значений перед передачей дальше:
// Пример фильтрации строк табличной части перед отправкой
Для Каждого СтрокаТовара Из СтруктураДанных.Товары Цикл
Если СтрокаТовара.Номенклатура.НеВыгружатьВБухгалтерию Тогда
// Исключаем строку из выгрузки и пересчитываем итоги
СтруктураДанных.СуммаДокумента = СтруктураДанных.СуммаДокумента - СтрокаТовара.Сумма;
КонецЕсли;
КонецЦикла;
Посмотрим на этап конвертации объекта в XDTO. В обработчиках вида ПКО_Документ_..._Отправка_ПриОтправкеДанных доступна готовая структура ДанныеXDTO.
В данном обработчике можно выполнить следующие действия:
ДанныеXDTO.Товары.Отказ = Истина, полностью отменив отправку объекта.Если простое удаление строк нарушает общую сумму документа и взаиморасчеты с контрагентом, оптимальным выходом является подмена ссылки. В процессе формирования ДанныеИБ нежелательная номенклатура заменяется на предопределенную обобщенную позицию (например, «Товары в ассортименте» или «Прочие услуги»).
Чтобы сохранить типовую конфигурацию на поддержке, реализуем изменения одним из следующих способов:
МенеджерОбменаЧерезУниверсальныйФормат с помощью директив &Вместо, &После или &Перед.