Как в Конвертации данных 3.0 объединить несколько валют в одну при синхронизации

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

При настройке обмена через конфигурацию 1С:Конвертация данных 3.0 (формат EnterpriseData) нередко возникает задача нормализации данных. Например, в информационной базе-источнике ведется учет по нескольким служебным валютам (USD, usd+3%, usd+5%), а в базе-приемнике требуется свести все эти элементы к одной стандартной валюте USD, чтобы в документах, договорах и регистрах ссылка вела на единый элемент.

Разберем, на какой стороне (в базе-источнике или в базе-приемнике) правильнее производить объединение и какие обработчики событий правил конвертации объектов (ПКО) необходимо использовать.

Особенности работы со ссылочными данными в формате EnterpriseData

Прежде чем перейти к алгоритмам, проанализируем архитектурную особенность формата EnterpriseData. В отличие от правил КД 2.0, в КД 3.0 данные передаются через объекты XDTO. При выгрузке ссылочных реквизитов (например, валюты в договоре или документе) объект передается не целиком, а в виде структуры КлючевыеСвойства.

Поэтому при обработке входящего пакета XDTO структура может выглядеть по-разному:

  1. Если выгружается сам справочник целиком, реквизиты лежат непосредственно на верхнем уровне объекта: ДанныеXDTO.Наименование, ДанныеXDTO.Код.
  2. Если выгружается ссылка на справочник в составе документа, реквизиты поиска упакованы во вложенную структуру: ДанныеXDTO.КлючевыеСвойства.Наименование, ДанныеXDTO.КлючевыеСвойства.Код.

Вариант 1. Нормализация данных в базе-приемнике (при загрузке)

Рассмотрим сценарий, когда правила выгрузки источника остаются типовыми, а логика подмены настраивается на стороне загрузки.

Разберем по шагам реализацию в обработчике ПКО_Справочник_Валюты_ПриКонвертацииДанныхXDTO (или в обработчике получения ключевых свойств):

  1. Проверяем, на каком уровне структуры передан реквизит (в корне или во вложенных ключевых свойствах).
  2. Анализируем значение наименования и приводим его к эталонному виду.
  3. Переопределяем значение ключевого свойства для корректного поиска в базе-приемнике.

Посмотрим на пример программного кода:


ТекНаименование = "";

Если ДанныеXDTO.Свойство("Наименование") Тогда
    ТекНаименование = ДанныеXDTO.Наименование;
ИначеЕсли ДанныеXDTO.Свойство("КлючевыеСвойства") И ДанныеXDTO.КлючевыеСвойства.Свойство("Наименование") Тогда
    ТекНаименование = ДанныеXDTO.КлючевыеСвойства.Наименование;
КонецЕсли;

Если СтрНайти(НРег(ТекНаименование), "usd") = 1 Тогда
    // Приводим все вариации к эталонному наименованию
    Если ДанныеXDTO.Свойство("Наименование") Тогда
        ДанныеXDTO.Наименование = "USD";
    КонецЕсли;
    
    Если ДанныеXDTO.Свойство("КлючевыеСвойства") Тогда
        ДанныеXDTO.КлючевыеСвойства.Наименование = "USD";
        ДанныеXDTO.КлючевыеСвойства.Код = "840";
    КонецЕсли;
КонецЕсли;

Если в базе-приемнике для валюты настроен поиск по наименованию или коду, подсистема БСП найдет существующую эталонную валюту USD и запишет ее в сопоставление (регистр сведений СоответствияОбъектовИнформационныхБаз или ПубличныеИдентификаторыСинхронизируемыхОбъектов).

Вариант 2. Подмена данных в базе-источнике (при выгрузке)

Выясним альтернативный вариант: сформировать корректное описание валюты еще на этапе выгрузки из исходной базы. Это позволяет оставить правила базы-приемника типовыми.

В правиле конвертации объекта для справочника «Валюты» в обработчике ПКО_Справочник_Валюты_ПриОтправкеДанных настраиваем алгоритм нормализации:


ТекНаименование = ДанныеИБ.Наименование;

Если СтрНайти(НРег(ТекНаименование), "usd") = 1 Тогда
    ТекНаименование = "USD";
    КодВалюты = "840";
Иначе
    КодВалюты = ДанныеИБ.Код;
КонецЕсли;

ДанныеXDTO.Вставить("Наименование", ТекНаименование);
ДанныеXDTO.Вставить("Код", КодВалюты);

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

Важные нюансы при объединении элементов («схлопывании»)

При объединении нескольких элементов в один важно учитывать следующие технические особенности:

  1. История синхронизации: Если обмен уже выполнялся ранее и в приемнике были созданы дубликаты валют, изменение правил не исправит существующие связи автоматически. Потребуется очистить сопоставления в регистре СоответствияОбъектовИнформационныхБаз (или ПубличныеИдентификаторыСинхронизируемыхОбъектов) для ошибочных элементов и заменить ссылки в документах обработкой «Поиск и замена дублей».
  2. Защита от перезаписи: При загрузке нескольких разных объектов формата в один и тот же элемент базы-приемника существует риск перезаписи реквизитов основного объекта (курсов, кратности). В обработчике ПКО_Справочник_Валюты_ПередЗаписьюПолученныхДанных рекомендуется отменять запись, если объект уже найден в базе:
    
    Если ДанныеИБ <> Неопределено Тогда
        // Объект существует, предотвращаем перезапись его свойств данными из пакета
        ПолученныеДанные = Неопределено;
    КонецЕсли;
    
  3. Двусторонний обмен: При схеме «многие к одному» обратная синхронизация валюты из базы-приемника в источник не сможет определить исходный элемент. Для справочника «Валюты» рекомендуется отключить регистрацию изменений в базе-приемнике.
← На главную