При настройке типового синхронного обмена между двумя идентичными конфигурациями «1С:Управление торговлей 11» через универсальный формат EnterpriseData разработчики часто сталкиваются с ситуацией, когда товары переносятся без сохранения структуры папок. В базе-приемнике элементы попадают в корень справочника Номенклатура, а иерархическая привязка к группам сбрасывается. Рассмотрим, почему возникает эта проблема и какими способами можно организовать правильную передачу данных по расписанию.
Проанализируем работу механизмов платформы при регистрации и выгрузке объектов:
ЭтоГруппа = Истина) автоматически к обмену не регистрируются.Родитель не может быть сопоставлена, и элемент записывается без родителя.Типовой и наиболее корректный подход — внесение изменений в правила регистрации объектов (ПРО). В архитектуре обменов 1С на основе EnterpriseData сами правила обмена (ПКО) редактируются в «Конвертации данных 3.0», а правила регистрации для них — в «Конвертации данных 2.0».
Разберем порядок действий:
Номенклатура настроим каскадную регистрацию родителей: при регистрации элемента алгоритм должен автоматически помещать в таблицу изменений всю цепочку вышестоящих папок (Родитель).Преимущество метода: Не нарушается типовой код конфигурации, а при обновлении релиза измененные правила регистрации, подключенные к конкретному узлу, не перезаписываются автоматически.
Если требуется быстро ограничить выгрузку или скорректировать логику передачи объектов без использования конфигуратора КД, можно переопределить события в модуле соответствующего плана обмена.
Разберем пример кода для процедуры ПриОтправкеДанныхПодчиненному. Данный обработчик позволяет исключить из отправки объекты, которые не должны попадать в базу-приемник:
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Номенклатура") Тогда
// Проверяем условия (например, принадлежность к группе)
Если Не ЭлементДанных.ПринадлежитЭлементу(НужнаяГруппа) Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Аналогично на стороне приемника можно переопределить обработчик ПриПолученииДанныхОтГлавного для фильтрации входящих данных:
Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.БанковскиеСчета")
И ТипЗнч(ЭлементДанных.Владелец) = Тип("СправочникСсылка.Организации")
И Не (ЭлементДанных.Владелец = УпрОрг Или ЭлементДанных.Владелец = РеглОрг) Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
Важно учитывать: Использование значения ОтправкаЭлементаДанных.Игнорировать предотвращает запись объекта в файл обмена, но объект может оставаться в таблице регистрации изменений, если логика снятия с регистрации не настроена дополнительно. Кроме того, такие доработки рекомендуется выносить в расширение конфигурации.
В случаях, когда типовой механизм обмена кажется избыточным или вызывает сложности при настройке иерархии, можно использовать интеграцию через веб-сервисы:
Номенклатура. В базе-приемнике регламентным заданием отправляется запрос к OData источника, откуда считывается полная структура справочника вместе с реквизитами Родитель и восстанавливается иерархия.Проанализировав возможные варианты решения задачи, выделим основные рекомендации: