В процессе разработки обменов данными между различными конфигурациями «1С» часто возникает ситуация, когда элементы справочников в базе-источнике и базе-приемнике не имеют общих уникальных идентификаторов (GUID), кодов или наименований. Особенно остро это проявляется для небольших справочников (например, «Ставки НДС», «Типы цен» или специфические перечисления, реализованные справочниками), где количество элементов невелико, но автоматическое сопоставление невозможно. В рамках данной статьи мы разберем несколько профессиональных способов настройки ручного маппинга элементов в программном продукте «1С:Конвертация данных 2.1» (КД 2.1).
Это самый простой и быстрый способ, если количество элементов невелико (до 20 штук) и логика соответствия жестко фиксирована. Мы можем вмешаться в процесс выгрузки конкретного свойства, которое используется для поиска.
Разберем алгоритм действий:
Код.Рассмотрим пример кода:
// В обработчике ПКС "Код" -> Перед выгрузкой
Если Источник.Код = "000000001" Тогда
Значение = "ОСН_ПРИЕМНИК";
ИначеЕсли Источник.Код = "000000002" Тогда
Значение = "УСН_ПРИЕМНИК";
КонецЕсли;
Проанализируем этот подход: система выгрузит в файл обмена вместо реального кода источника тот код, который вы указали в переменной Значение. При загрузке в базу-приемник механизм поиска найдет существующий объект по этому подмененному коду.
Прописывать условия Если...ИначеЕсли непосредственно в ПКС не всегда удобно, особенно если логика сопоставления может измениться или используется в нескольких местах. Более элегантное решение — инициализировать таблицу соответствий при старте обмена.
Выясним, как это реализовать по шагам:
Соответствие и заполните его парами «КодИсточника — КодПриемника».Параметры.Пример инициализации в обработчике «Перед выполнением обмена»:
ТаблицаМэппинга = Новый Соответствие;
ТаблицаМэппинга.Вставить("001", "КОД_В_ПРИЕМНИКЕ_1");
ТаблицаМэппинга.Вставить("002", "КОД_В_ПРИЕМНИКЕ_2");
Параметры.Вставить("МоеРучноеСоответствие", ТаблицаМэппинга);
Теперь в ПКС Код (Перед выгрузкой) достаточно одной строки:
Значение = Параметры.МоеРучноеСоответствие.Получить(Источник.Код);
Этот метод считается наиболее корректным с точки зрения архитектуры КД 2.1. Он позволяет управлять поиском непосредственно в базе-приемнике в момент загрузки данных.
Посмотрим, как работает обработчик «Поля поиска» в ПКО:
СвойстваПоиска, содержащая значения всех реквизитов, по которым установлен флаг «Поиск».НайтиПоКоду, НайтиПоНаименованию или даже через запрос).СсылкаНаОбъект и установить флаг ПрекратитьПоиск = Истина.Пример реализации:
// Обработчик ПКО "Поля поиска"
Если НомерВариантаПоиска = 1 Тогда
ИскомыйКод = СвойстваПоиска["Код"];
// Логика сопоставления
КодПриемника = "";
Если ИскомыйКод = "001" Тогда
КодПриемника = "ПРИЕМ_001";
КонецЕсли;
Если Не ПустаяСтрока(КодПриемника) Тогда
СсылкаНаОбъект = Справочники.ИмяСправочника.НайтиПоКоду(КодПриемника);
Если Не СсылкаНаОбъект.Пустая() Тогда
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если вы хотите обеспечить максимально надежную связь, которая не зависит от изменения кодов или наименований пользователями, можно использовать сопоставление по Уникальному Идентификатору.
Разберем этот прием подробнее. В КД 2.1 у каждого ПКО на закладке «Настройки поиска» можно включить опцию «Поиск по уникальному идентификатору». Но что делать, если UID в базах разные? Мы можем «обмануть» систему.
В ПКО создайте ПКС для свойства {УникальныйИдентификатор}. В обработчике «Перед выгрузкой» напишите:
// Пример подмены UID
Если Источник.Код = "001" Тогда
Значение = "550e8400-e29b-41d4-a716-446655440000"; // GUID объекта в приемнике
КонецЕсли;
Система запишет этот GUID в файл обмена, и при загрузке 1С попытается найти объект именно с этим идентификатором. Это самый надежный способ «склеить» объекты навсегда.
В типовых конфигурациях 1С (УТ, БП, ERP) существует технический регистр сведений СоответствияОбъектовИнформационныхБаз. Это системное хранилище связей между объектами разных баз.
Проанализируем ситуацию, когда это выгодно:
если вы не хотите «хардкодить» (прописывать жестко в коде) соответствия, вы можете один раз заполнить этот регистр в базе-приемнике (например, специальной обработкой), указав УникальныйИдентификаторИсточника и СобственнаяСсылка (объект в приемнике). Типовые правила обмена часто сначала заглядывают в этот регистр, прежде чем начинать поиск по полям. Если запись в регистре есть — объект будет найден мгновенно без каких-либо дополнительных условий в ПКО.
При реализации ручного сопоставления важно учитывать несколько нюансов, чтобы не испортить данные в целевой базе:
ПослеЗагрузки можно проверить, был ли найден объект. Если сопоставление не сработало, и вы не хотите создавать «мусорный» элемент, установите Отказ = Истина;.Комментарий (или другое доп. свойство) записать код приемника и настраивать поиск по этому полю. Это позволит пользователям самостоятельно управлять маппингом без привлечения программиста для изменения правил обмена.Таким образом, мы рассмотрели различные варианты решения задачи: от жесткого кодирования в ПКС до гибкого управления через параметры и системные регистры. Выбор конкретного метода зависит от частоты изменения этих данных и требований к надежности обмена.