При настройке обмена данными между конфигурациями 1С (например, между 1С:Бухгалтерия 3.0 и 1С:Управление торговлей 11) часто возникает специфическая задача: необходимо сопоставить объекты не по их текущим внутренним идентификаторам, а по данным из стороннего источника. Типичный пример — наличие в информационной базе регистра сведений ПубличныеИдентификаторы, где хранятся «правильные» GUID для объектов в целевой базе — для сопоставления объектов пригодится обработка устранения дублей по регистру публичных идентификаторов. Если мы просто запустим стандартный обмен, система создаст дубли или не найдет объекты, так как поиск по УИД (уникальному идентификатору) является приоритетным.
В рамках этой статьи мы разберем, как «перехватить» процесс выгрузки или загрузки и подставить нужный нам идентификатор, чтобы обеспечить корректную синхронизацию объектов — для автоматизации этого процесса есть универсальный перенос данных с подменой GUID.
Проанализируем самый надежный и «чистый» способ подмены на стороне базы-источника. В конфигурации «Конвертация данных 2.0» (КД 2) предусмотрена возможность напрямую управлять узлом идентификатора в XML-файле выгрузки — для регулярного обмена по созданным правилам подойдёт универсальная подсистема регулярного обмена по правилам КД 2.0.
Для реализации этого метода выполним следующие шаги:
Контрагенты или ДоговорыКонтрагентов).{УникальныйИдентификатор} (вместе с фигурными скобками). Источник при этом можно оставить пустым.Рассмотрим пример кода для обработчика:
// Пытаемся найти соответствие в регистре сведений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПубличныеИдентификаторы.ИдентификаторВУТ
|ИЗ
| РегистрСведений.ПубличныеИдентификаторы КАК ПубличныеИдентификаторы
|ГДЕ
| ПубличныеИдентификаторы.Объект = &Объект";
Запрос.УстановитьПараметр("Объект", Источник);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Устанавливаем значение, которое КД запишет как GUID объекта в XML
Значение = Выборка.ИдентификаторВУТ;
Иначе
// Если в регистре ничего нет, выгружаем со своим родным идентификатором
Значение = Строка(Источник.УникальныйИдентификатор());
КонецЕсли;
Важно помнить, что Значение должно быть либо строковым представлением GUID, либо объектом типа УникальныйИдентификатор. Благодаря этому методу, в файл выгрузки попадет уже модифицированный узел, и база-приемник воспримет объект так, будто он изначально имел такой идентификатор.
Если по каким-то причинам мы не можем или не хотим менять файл выгрузки, мы можем переопределить логику поиска объекта уже в момент загрузки в целевую базу (например, в УТ 11) — для контроля результатов обмена пригодится сверка данных и поиск расхождений между УТ 11 и БП 3.0. Для этого нам нужно передать требуемый идентификатор как дополнительное свойство (через параметр ПКО или обычное ПКС).
Выясним, как это работает по шагам:
ПромИдентификатор).Посмотрим на пример реализации:
// Проверяем, передан ли наш специальный идентификатор
Если СвойстваПоиска.Свойство("ПромИдентификатор") И ЗначениеЗаполнено(СвойстваПоиска.ПромИдентификатор) Тогда
Попытка
НужныйУИД = Новый УникальныйИдентификатор(СвойстваПоиска.ПромИдентификатор);
// Пытаемся получить ссылку по этому УИД
СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(НужныйУИД);
// Проверяем, существует ли объект в базе
Если Не СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
СсылкаНаОбъект = СсылкаНаОбъект;
ПрекратитьПоиск = Истина;
КонецЕсли;
Исключение
// Обработка ошибки формата УИД, если необходимо
КонецПопытки;
КонецЕсли;
Этот способ позволяет гибко управлять поиском, даже если в файле обмена пришел «родной» GUID источника. Мы просто говорим системе: «не ищи стандартно, используй вот эту ссылку».
Рассмотрим ситуацию, когда требуется максимально низкоуровневый контроль над процессом выгрузки. В КД 2.0 в обработчике «Перед выгрузкой объекта» нам доступна переменная УзелОбъекта. Это позволяет программно вмешиваться в структуру формируемого XML.
Проанализируем этот подход. Мы можем найти узел, отвечающий за уникальный идентификатор, и заменить его текстовое содержимое. Однако стоит быть осторожными: прямое манипулирование DOM-моделью XML в процессе потоковой выгрузки может быть ресурсозатратным. Этот метод обычно используется, когда нужно подменить не только сам GUID, но и, например, добавить атрибуты синхронизации, которые не предусмотрены стандартным интерфейсом КД.
Разберем важный нюанс, упомянутый опытными разработчиками. Если ваш объект (например, Контрагент) выгружается не как самостоятельный объект, отобранный для обмена, а «по ссылке» (как реквизит документа РеализацияТоваровУслуг), стандартные обработчики ПКО могут сработать иначе или не сработать вовсе, если не установлены соответствующие флаги.
Чтобы подмена GUID гарантированно отрабатывала для всех случаев, рекомендуется:
Проанализируем возможные проблемы при подмене идентификаторов:
ПубличныеИдентификаторы. В этом случае данные объекта в приемнике будут перезаписаны данными из источника. Перед массовым применением этого механизма обязательно проведите аудит уникальности идентификаторов в обеих базах.Параметры обмена и искать значения в памяти (в таблице значений или соответствий).Выяснив все технические детали, мы видим, что наиболее сбалансированным является Метод №1. Он позволяет подменить идентификатор на самом раннем этапе, что избавляет от необходимости писать сложную логику поиска на стороне загрузки и минимизирует риск возникновения дублей.