Как сохранить код и другие реквизиты объекта в базе-приемнике при синхронизации данных в 1С?

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

При настройке обмена между информационными базами 1С часто возникает задача: обновлять данные элементов справочника из источника, но при этом сохранять уникальный код или иные реквизиты, уже присвоенные этим элементам в базе-приемнике. Разберем подробнее, как правильно настроить правила конвертации данных (КД 2.1), чтобы избежать нежелательного замещения значений и предотвратить появление дублей.

Шаг 1. Проверка полей поиска элементов

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

Убедимся, что сопоставление объектов выполняется по другим реквизитам, например:

  1. Наименование
  2. Владелец
  3. Родитель
  4. Уникальный идентификатор (GUID)

Только после того, как поиск настроен по иным полям, перейдем к отключению перезаписи кода.

Способ 1. Флаг «Не замещать значение свойства» в ПКС

Самый простой и стандартный способ — использовать встроенные механизмы конфигурации «Конвертация данных».

  1. Откроем нужное Правило конвертации объектов (ПКО).
  2. В таблице Правил конвертации свойств (ПКС) найдем реквизит Код.
  3. В свойствах ПКС установим флаг «Не замещать значение свойства у существующих объектов».

В этом случае при первой загрузке нового объекта код из базы-источника заполнится, а при повторных загрузках для уже найденного объекта реквизит Код перезаписываться не будет.

Этого же эффекта можно добиться программно. В обработчике «Перед выгрузкой» нужного ПКС пропишем следующий код:

НеЗамещать = Истина;

Способ 2. Отключение выгрузки реквизита (Отказ = Истина)

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

В обработчике «Перед выгрузкой» для ПКС реквизита Код укажем:

Отказ = Истина;

При использовании этого подхода данные реквизита вовсе не передаются в файл выгрузки.

Важный нюанс: обработка новых объектов при загрузке

Рассмотрим риски полного отключения передачи кода. Если объект в базе-приемнике еще не существует (ОбъектНайден = Ложь), а передача кода отключена через Отказ = Истина, новый элемент создастся с пустым кодом. По умолчанию режим ОбменДанными.Загрузка = Истина отключает платформенную автонумерацию при записи.

Чтобы избежать появления элементов с пустыми кодами, обработаем ситуацию в ПКО в событии «После загрузки» (или «Перед записью»):


Если Не ОбъектНайден Тогда
    // Для нового объекта генерируем новый код платформенным методом
    Объект.УстановитьНовыйКод();
Иначе
    // Для найденного объекта восстанавливаем код из базы-приемника
    Если ЗначениеЗаполнено(Объект.Ссылка.Код) Тогда
        Объект.Код = Объект.Ссылка.Код;
    КонецЕсли;
КонецЕсли;

Короткая запись для сохранения существующего кода найденного объекта выглядит так:


Объект.Код = ?(ОбъектНайден И ЗначениеЗаполнено(Объект.Ссылка.Код), Объект.Ссылка.Код, Объект.Код);

Способ 3. Передача значений через параметры объекта

Если требуется сложная логика заполнения (например, обновлять код или наименование только в том случае, если они не заполнены в базе-приемнике), используем передачу через параметры.

  1. В ПКС для реквизита установим флаг «Передавать данные в параметр».
  2. При загрузке значение реквизита не будет напрямую присваиваться объекту, а попадет в структуру ПараметрыОбъекта.
  3. В обработчике «После загрузки» ПКО проанализируем текущие реквизиты объекта базы-приемника:

ЗначениеИзИсточника = ПараметрыОбъекта.Получить("Код");
Если Не ЗначениеЗаполнено(Объект.Ссылка.Код) И ЗначениеЗаполнено(ЗначениеИзИсточника) Тогда
    Объект.Код = ЗначениеИзИсточника;
КонецЕсли;

Особенности работы в Конвертации данных 3.0 и EnterpriseData

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

← На главную