Как перенести элементы справочника с одинаковым УИД как разные объекты в 1С:Конвертация данных?

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

В процессе сопровождения распределенных систем или при объединении данных из разных баз 1С программисты часто сталкиваются с ситуацией, когда один и тот же объект (с одинаковым уникальным идентификатором — УИД) был изменен или переименован в одной из баз. При попытке стандартного переноса данных через «Конвертацию данных 2.1» (КД) система по умолчанию находит объект по УИД и просто перезаписывает его. Но что делать, если нам необходимо сохранить оба варианта — и старый, и новый — в одной информационной базе? Разберем подробно, как решить эту задачу, обойти ограничения платформы и правильно настроить правила конвертации объектов (ПКО).

Проблема дублирования идентификаторов

Прежде всего, проанализируем техническую сторону вопроса. В платформе 1С невозможно существование двух записей в одной таблице справочника с абсолютно одинаковым внутренним идентификатором (GUID/UUID). Если мы хотим, чтобы в Базе1 появились обе номенклатуры, которые изначально имели один и тот же УИД, нам придется создать второй объект с новым идентификатором. Наша задача в КД — заставить систему «проигнорировать» совпадение УИД и инициировать создание новой записи на основании других критериев, например, наименования.

Способ 1: Настройка полей поиска в ПКО

Это самый простой и быстрый способ, который помог автору темы. Рассмотрим пошагово, как настроить правила, чтобы система создала дубль при несовпадении наименования:

  1. Откроем необходимое Правило Конвертации Объекта (ПКО) для нашего справочника (например, Номенклатура).
  2. На закладке «Основные настройки» снимем флаг «Поиск объекта по внутреннему идентификатору». Это критически важно, так как при установленном флаге система всегда будет отдавать приоритет УИД, игнорируя остальные настройки.
  3. Установим флаг «Не замещать существующие объекты в приемнике, а только создавать новые». Это защитит уже имеющиеся данные от перезаписи.
  4. В списке Правил Конвертации Свойств (ПКС) выберем реквизиты, по которым будет определяться уникальность. Обычно это Наименование, ЭтоГруппа и Родитель (для иерархических справочников).
  5. Для каждого из этих свойств в колонке «Поиск» установим галочку.

Разберем, как это работает: при загрузке система не будет искать объект по УИД. Она проверит, есть ли в базе номенклатура с таким же наименованием и родителем. Если наименование было изменено в источнике, поиск не даст результатов, и система создаст новый элемент с новым УИД, сохранив при этом старый элемент нетронутым.

Способ 2: Использование обработчика «При поиске» (OnIdentify)

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

Рассмотрим пример кода для обработчика:


// Если объект найден по УИД (стандартный поиск платформы)
Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
    // Сравним наименование в базе и в данных источника
    Если СсылкаНаОбъект.Наименование <> СвойстваПоиска["Наименование"] Тогда
        // Если наименования разные, сбрасываем ссылку, чтобы система создала новый объект
        СсылкаНаОбъект = Неопределено;
        ПрекратитьПоиск = Истина;
    КонецЕсли;
КонецЕсли;

Этот метод гораздо надежнее, так как он позволяет точечно управлять процессом и не отключать глобально поиск по УИД для всех элементов справочника.

Способ 3: Программная генерация нового УИД

Выясним причину возможных конфликтов: иногда при загрузке система все равно пытается назначить новому объекту старый УИД из файла обмена, что может привести к ошибке уникальности. Чтобы гарантировать создание абсолютно новой ссылки, мы можем вмешаться в процесс в обработчике «Перед загрузкой» или «После загрузки».

Однако более правильным подходом в КД 2.1 будет использование метода УстановитьСсылкуНового(). Посмотрим на пример логики: если мы понимаем, что объект должен быть новым, мы можем явно указать системе сгенерировать идентификатор.


// В обработчике "При загрузке"
Если Объект.ЭтоНовый() Тогда
    Объект.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор()));
КонецЕсли;

Важные риски и побочные эффекты

Проанализируем ситуацию глубже. Создание дублей с разными УИД — это только половина дела. Важно учитывать следующие моменты:

  1. Проблема связанных документов: Если вы переносите не только справочник, но и документы (например, Реализации), возникнет конфликт. В файле обмена документ ссылается на УИД номенклатуры. При загрузке в Базу1 система найдет по этому УИД «старую» номенклатуру и подставит её в документ, хотя в Базе2 документ был связан с «переименованной» версией. Чтобы этого избежать, придется менять логику поиска номенклатуры во всех правилах документов.
  2. Повторная загрузка: Использование флага «Не замещать» делает невозможным обновление данных. Если вы измените артикул у этой номенклатуры в будущем и захотите его перенести, система увидит, что объект уже есть (найдет по наименованию), и просто пропустит его, не обновив реквизиты.
  3. Иерархия: Если вы переносите группы справочника, и они тоже имеют одинаковые УИД, но разные названия, вы получите «ветвление» дерева групп, что может усложнить работу пользователей.

Рекомендация: Реестр соответствий

Если обмен данными планируется сделать регулярным, мы рекомендуем отказаться от манипуляций с полями поиска в пользу регистра сведений «Соответствия объектов для обмена». Это типовой механизм, используемый в планах обмена 1С. В этом случае в Базе1 хранится запись о том, что объекту с УИД_А из Базы2 соответствует объект с УИД_Б в Базе1. Это позволяет корректно связывать объекты, даже если у них не совпадают ни идентификаторы, ни наименования, и при этом не плодить бесконечные дубли при каждом поиске.

Таким образом, для разового переноса достаточно настроек ПКО с отключением поиска по УИД и выбором полей поиска по наименованию. Для постоянного и безопасного обмена лучше использовать программные обработчики или механизмы регистрации соответствий.

← На главную