Как настроить ручное соответствие элементов справочников в 1С:Конвертация данных 2.1?

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

В процессе разработки обменов данными между различными конфигурациями «1С» часто возникает ситуация, когда элементы справочников в базе-источнике и базе-приемнике не имеют общих уникальных идентификаторов (GUID), кодов или наименований. Особенно остро это проявляется для небольших справочников (например, «Ставки НДС», «Типы цен» или специфические перечисления, реализованные справочниками), где количество элементов невелико, но автоматическое сопоставление невозможно. В рамках данной статьи мы разберем несколько профессиональных способов настройки ручного маппинга элементов в программном продукте «1С:Конвертация данных 2.1» (КД 2.1).

Способ 1. Подмена значения в ПКС «Код» (Перед выгрузкой)

Это самый простой и быстрый способ, если количество элементов невелико (до 20 штук) и логика соответствия жестко фиксирована. Мы можем вмешаться в процесс выгрузки конкретного свойства, которое используется для поиска.

Разберем алгоритм действий:

  1. В Правиле Конвертации Объектов (ПКО) для нужного справочника найдите Правило Конвертации Свойства (ПКС) для реквизита Код.
  2. Убедитесь, что для этого ПКС установлена галочка «Поиск».
  3. В обработчике события «Перед выгрузкой» напишите код, который будет подменять код источника на код приемника.

Рассмотрим пример кода:


// В обработчике ПКС "Код" -> Перед выгрузкой
Если Источник.Код = "000000001" Тогда
    Значение = "ОСН_ПРИЕМНИК";
ИначеЕсли Источник.Код = "000000002" Тогда
    Значение = "УСН_ПРИЕМНИК";
КонецЕсли;

Проанализируем этот подход: система выгрузит в файл обмена вместо реального кода источника тот код, который вы указали в переменной Значение. При загрузке в базу-приемник механизм поиска найдет существующий объект по этому подмененному коду.

Способ 2. Использование глобальной таблицы соответствий в параметрах

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

Выясним, как это реализовать по шагам:

  1. В корне дерева конвертации перейдите на закладку «Алгоритмы / Запросы» или воспользуйтесь обработчиком «Перед выполнением обмена».
  2. Создайте объект Соответствие и заполните его парами «КодИсточника — КодПриемника».
  3. Сохраните это соответствие в структуру Параметры.

Пример инициализации в обработчике «Перед выполнением обмена»:


ТаблицаМэппинга = Новый Соответствие;
ТаблицаМэппинга.Вставить("001", "КОД_В_ПРИЕМНИКЕ_1");
ТаблицаМэппинга.Вставить("002", "КОД_В_ПРИЕМНИКЕ_2");

Параметры.Вставить("МоеРучноеСоответствие", ТаблицаМэппинга);

Теперь в ПКС Код (Перед выгрузкой) достаточно одной строки:

Значение = Параметры.МоеРучноеСоответствие.Получить(Источник.Код);

Способ 3. Переопределение логики в обработчике «Поля поиска»

Этот метод считается наиболее корректным с точки зрения архитектуры КД 2.1. Он позволяет управлять поиском непосредственно в базе-приемнике в момент загрузки данных.

Посмотрим, как работает обработчик «Поля поиска» в ПКО:

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

Пример реализации:


// Обработчик ПКО "Поля поиска"
Если НомерВариантаПоиска = 1 Тогда
    ИскомыйКод = СвойстваПоиска["Код"];
    
    // Логика сопоставления
    КодПриемника = "";
    Если ИскомыйКод = "001" Тогда
        КодПриемника = "ПРИЕМ_001";
    КонецЕсли;

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

Способ 4. Использование внутреннего идентификатора (UID)

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

Разберем этот прием подробнее. В КД 2.1 у каждого ПКО на закладке «Настройки поиска» можно включить опцию «Поиск по уникальному идентификатору». Но что делать, если UID в базах разные? Мы можем «обмануть» систему.

В ПКО создайте ПКС для свойства {УникальныйИдентификатор}. В обработчике «Перед выгрузкой» напишите:


// Пример подмены UID
Если Источник.Код = "001" Тогда
    Значение = "550e8400-e29b-41d4-a716-446655440000"; // GUID объекта в приемнике
КонецЕсли;

Система запишет этот GUID в файл обмена, и при загрузке 1С попытается найти объект именно с этим идентификатором. Это самый надежный способ «склеить» объекты навсегда.

Способ 5. Использование регистра «Соответствия объектов информационных баз»

В типовых конфигурациях 1С (УТ, БП, ERP) существует технический регистр сведений СоответствияОбъектовИнформационныхБаз. Это системное хранилище связей между объектами разных баз.

Проанализируем ситуацию, когда это выгодно: если вы не хотите «хардкодить» (прописывать жестко в коде) соответствия, вы можете один раз заполнить этот регистр в базе-приемнике (например, специальной обработкой), указав УникальныйИдентификаторИсточника и СобственнаяСсылка (объект в приемнике). Типовые правила обмена часто сначала заглядывают в этот регистр, прежде чем начинать поиск по полям. Если запись в регистре есть — объект будет найден мгновенно без каких-либо дополнительных условий в ПКО.

Важные рекомендации для стабильного обмена

При реализации ручного сопоставления важно учитывать несколько нюансов, чтобы не испортить данные в целевой базе:

  1. Флаг «Не замещать объекты в приемнике»: Если вы сопоставили элементы только для того, чтобы документы «видели» нужную аналитику, но не хотите, чтобы наименование элемента из источника прилетело в приемник (например, в источнике «НДС 20%», а в приемнике «Основная ставка НДС»), обязательно установите флаг «Не замещать существующие объекты в приемнике, а только создавать новые» в настройках ПКО.
  2. Отказ от создания дублей: В обработчике ПослеЗагрузки можно проверить, был ли найден объект. Если сопоставление не сработало, и вы не хотите создавать «мусорный» элемент, установите Отказ = Истина;.
  3. Поле «Комментарий» для сцепки: Как советуют опытные разработчики, иногда проще в базе-источнике в поле Комментарий (или другое доп. свойство) записать код приемника и настраивать поиск по этому полю. Это позволит пользователям самостоятельно управлять маппингом без привлечения программиста для изменения правил обмена.

Таким образом, мы рассмотрели различные варианты решения задачи: от жесткого кодирования в ПКС до гибкого управления через параметры и системные регистры. Выбор конкретного метода зависит от частоты изменения этих данных и требований к надежности обмена.

← На главную