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