При настройке синхронизации данных между информационными базами 1С периодически возникает нестандартная задача: перенести изменения из объекта базы-источника в конкретный существующий объект базы-приемника, если их уникальные идентификаторы (GUID) не совпадают, а сопоставление по реквизитам поиска (наименованию, коду, ИНН) по каким-то причинам невозможно или нежелательно. Разберем особенности работы платформы с идентификаторами и рассмотрим надежные способы решения этой задачи как в правилах конвертации (Конвертация данных 2.1), так и в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП).
Прежде чем переходить к реализации, проанализируем базовые правила платформы 1С:Предприятие при обращении с уникальными идентификаторами ссылочных типов:
ЭтоНовый() возвращает значение Истина. Попытка вызвать метод для ранее сохраненного объекта приведет к исключительной ситуации.Новый УникальныйИдентификатор(СтрокаГУИД) в оперативной памяти без обращения к таблицам базы данных. Если объект с таким GUID уже существует, метод вернет ссылку на него; если еще нет — вернет ссылку на пока не созданный объект.Если обмен настраивается через правила конвертации данных (КД 2.1), сопоставление на стороне приемника можно полностью переопределить программно в правиле конвертации объекта (ПКО).
Разберем по шагам порядок настройки ПКО в базе-приемнике:
Посмотрим на пример кода в обработчике Поля поиска:
ИдентификаторЦелевой = "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d"; // Требуемый GUID приемника
СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторЦелевой));
// Предотвращаем дальнейший штатный поиск по полям
ПрекратитьОчистку = Истина;
Выясним причину использования переменной ПрекратитьОчистку = Истина;. По умолчанию механизм КД после выполнения обработчика проверяет соответствие объекта по полям поиска. Установка флага сообщает обработчику загрузки, что ссылка определена однозначно, благодаря чему стандартный поиск по реквизитам отключается, а все полученные из файла данные запишутся непосредственно в найденный объект.
Если в базе-источнике заранее известен целевой GUID базы-приемника, подмену можно выполнить еще до записи данных в файл выгрузки. В таком случае в обработчике Перед выгрузкой ПКО мы можем подставить ссылку с целевым идентификатором.
Рассмотрим пример кода:
ЦелевойИдентификатор = "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d";
Источник = Справочники[Источник.Метаданные().Имя].ПолучитьСсылку(Новый УникальныйИдентификатор(ЦелевойИдентификатор));
В результате такой подмены в результирующий XML-файл обмена сразу будет выгружен узел с идентификатором приемника, и база-приемник выполнит стандартный поиск по внутреннему идентификатору без дополнительных доработок правил загрузки.
В типовых конфигурациях 1С, использующих Библиотеку стандартных подсистем, штатный механизм синхронизации данных опирается на регистр сведений СоответствияОбъектовИнформационныхБаз. Это таблица, хранящая пары сопоставления между строковым идентификатором узла-источника и реальной ссылкой в базе-приемнике.
Разберем логику работы механизма БСП:
СоответствияОбъектовИнформационныхБаз по узлу плана обмена и переданному GUID источника.Для программной установки или изменения связи между объектами рекомендуется использовать метод общего модуля БСП:
ОбменДаннымиСервер.ЗаписатьСоответствиеОбъекта(
СсылкаПриемника,
ИдентификаторИсточника,
УзелОбмена
);
Если соответствие для объекта ранее уже существовало, старую запись следует предварительно удалить или переписать, чтобы избежать неоднозначности при очередном сеансе обмена.
При ручной подмене идентификаторов и сопоставлений важно учитывать технические риски: