Как изменить правила обмена для синхронизации данных через универсальный формат в 1С?

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

При настройке стандартного обмена между типовыми конфигурациями (например, между 1С:ERP и 1С:Бухгалтерия предприятия) через план обмена СинхронизацияДанныхЧерезУниверсальныйФормат разработчики часто сталкиваются с неожиданным поведением: в макетах конфигурации отсутствуют привычные правила конвертации, к которым все привыкли в «Конвертации данных 2.0». В составе плана обмена можно обнаружить только правила регистрации объектов.

Разберем детально, как устроена архитектура универсального формата (EnterpriseData), где физически хранятся правила конвертации, как их отредактировать с помощью конфигурации «Конвертация данных 3.0» и как решить частую прикладную задачу — запретить перезапись уже существующих в базе-приемнике элементов справочников.

Где хранятся правила универсального формата и почему их нет в макетах?

В механизме обмена через формат EnterpriseData используется принципиально иной подход по сравнению с классической КД 2.0. Правила конвертации данных хранятся непосредственно в программном коде конфигурации, а не в XML-макетах. Вся логика выгрузки и загрузки сосредоточена в общем модуле МенеджерОбменаЧерезУниверсальныйФормат (либо в модулях с суффиксом конкретной версии, например МенеджерОбменаЧерезУниверсальныйФормат13).

Специализированная база «Конвертация данных 3.0» (КД 3.0) выступает в роли визуальной среды разработки правил. На выходе она формирует модули на встроенном языке 1С, текст которых переносится в рабочую конфигурацию или подключается через расширение.

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

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

Разберем по шагам порядок действий для получения типовых правил и их модификации:

  1. Определяем версию формата: Выясним, какую общую версию схемы EnterpriseData поддерживают обе участвующие в обмене конфигурации. Если база-источник поддерживает версии до 1.5, а база-приемник — только до 1.4, необходимо ориентироваться на младшую общую версию (в данном примере — 1.4). Использовать устаревшие бета-версии формата не следует.
  2. Используем внешнюю обработку выгрузки: В каталоге шаблона конфигурации «Конвертация данных 3.0» поставляется внешняя обработка для выгрузки структуры конфигурации и правил обмена. С ее помощью из рабочей информационной базы выгружаются правила конвертации и структура объектов XDTO.
  3. Загружаем правила в КД 3.0: В меню КД 3.0 переходим в раздел «Конвертации» и выбираем команду «Загрузка правил синхронизации из файлов». Указываем полученные файлы выгрузки. После завершения импорта сформируется готовая конфигурация и правила конвертации (ПКО, ПВД), с которыми можно работать визуально.

Как запретить перезапись существующих объектов при загрузке

Проанализируем типовую ситуацию: требуется переносить данные справочника (например, «Физические лица» или «Единицы измерения»), но если элемент уже сопоставлен или найден по ключевым полям в базе-приемнике, его реквизиты не должны перезаписываться новыми значениями из источника.

В КД 3.0 эту задачу можно решить на уровне обработчика ПередЗаписьюПолученныхДанных у соответствующего правила конвертации объекта (ПКО). В этом событии доступны параметры ДанныеИБ (ссылка или объект, найденный в целевой базе) и ПолученныеДанные (структура загруженных данных формата).

Посмотрим на пример реализации универсального алгоритма, отменяющего запись в случае, если объект уже присутствует в базе:


Функция НеЗамещатьСуществующий(ДанныеИБ, ПолученныеДанные)
    
    // Если объект найден в ИБ, очищаем полученные данные для отмены записи
    Если НЕ ДанныеИБ = Неопределено Тогда
        ПолученныеДанные = Неопределено;
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции

Процедура ПКО_Справочник_ЕдиницыИзмерения_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)

    НеЗамещатьСуществующий(ДанныеИБ, ПолученныеДанные);

КонецПроцедуры

Если присвоить переменной ПолученныеДанные значение Неопределено, алгоритм загрузки БСП фиксирует факт сопоставления, но отменяет процедуру модификации и записи найденного элемента в информационной базе. Новый элемент будет создан только в том случае, если поиск не дал результатов (ДанныеИБ = Неопределено).

Также в описании ПКО предусмотрен флаг НеЗамещатьОбъектПриЗагрузке, который можно задавать программно в правилах конвертации объектов для аналогичного поведения.

Как передать новые реквизиты и нетиповые справочники

Если в конфигурацию добавлен новый справочник или нетиповой реквизит, которого изначально нет в XDTO-пакете EnterpriseData, существует два основных подхода:

  1. Передача через дополнительные реквизиты: Формат EnterpriseData штатно поддерживает табличные части дополнительных реквизитов и сведений. Если требуется передать новые свойства типового объекта, проще всего сопоставить их с табличной частью дополнительных реквизитов формата. Это позволяет передавать произвольные данные без изменения самой схемы XDTO.
  2. Использование подходящего объекта формата: Новый прикладной справочник можно передать с использованием существующего типа формата (например, передать как объект общего назначения или сопоставить с типовой сущностью), настроив для него индивидуальные ПКО и ПВД в КД 3.0.
  3. Расширение пакета XDTO: Если требуется передать уникальную сложную структуру, создается собственный пакет XDTO (или расширение пакета). Важно помнить: изменения формата схемы должны быть синхронно применены в обеих базах (источнике и приемнике), иначе валидатор XML выдаст критическую ошибку при загрузке сообщения обмена.

После модификации правил в КД 3.0 система генерирует обновленный программный код. Этот код встраивается в общий модуль МенеджерОбменаЧерезУниверсальныйФорматПереопределяемый или перехватывается с помощью расширений конфигурации (директивы &Вместо, &После), что позволяет сохранить конфигурацию на полной поддержке поставщика.

← На главную