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