Как заменить только код номенклатуры в базе-приемнике с помощью 1С:Конвертация данных 2.1 без создания дублей

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

При переносе данных между базами 1С часто возникает задача выборочного обновления реквизитов. Типичный пример — необходимость заменить коды у существующей номенклатуры в базе-приемнике на коды из базы-источника, не затронув при этом другие реквизиты (наименования, цены, описания) и не очистив табличные части. Если настроить правила обмена неверно, система либо создаст дублирующие карточки товаров, либо перезапишет (и затрет) важные данные в приемнике.

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

Шаг 1. Отключение поиска по уникальному идентификатору (УИД / UUID)

По умолчанию платформа 1С при сопоставлении объектов во время обмена в первую очередь ищет их по уникальному идентификатору (УИД). Если номенклатура в вашей базе-источнике и базе-приемнике создавалась независимо, их УИДы гарантированно будут разными. Если оставить эту настройку включенной, система не найдет совпадений по УИД и просто создаст дубли товаров с новыми кодами.

Выясним, как отключить стандартный поиск по УИД:

  1. Откроем нужную настройку правил обмена в конфигурации «Конвертация данных 2.1».
  2. Перейдем в список ПКО (Правила конвертации объектов) и найдем правило для справочника Номенклатура.
  3. Дважды кликнем по правилу, чтобы открыть его свойства, и перейдем на вкладку «Основные настройки».
  4. Найдем флаг «Искать объект по уникальному идентификатору» и снимем с него галочку.

Важно: если этот флаг активен, система проигнорирует любые другие настроенные вами поля поиска, если найдет совпадение по УИД, либо сразу создаст копию элемента при его отсутствии.

Шаг 2. Настройка альтернативных полей поиска

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

Рассмотрим, как настроить сопоставление по альтернативному полю (на примере артикула):

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

Шаг 3. Настройка передачи нового значения «Кода»

Теперь перейдем к настройке главного реквизита, ради которого выполняется перенос, — к Коду номенклатуры. Проанализируем настройки ПКС для этого поля:

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

Шаг 4. Предотвращение затирания других реквизитов и табличных частей

Один из самых частых страхов начинающих разработчиков в Конвертации данных — затирание остальных реквизитов (например, цен номенклатуры, единиц измерения или текстовых описаний) при частичном обновлении. Разберем этот механизм подробнее.

Если свойства (или табличные части) полностью отсутствуют в списке ПКС внутри вашего правила конвертации объектов, они **никогда не затрутся и не изменятся** в базе-приемнике. Платформа обновит только те поля, которые явно передаются в файле выгрузки.

Если же в ПКО присутствуют другие реквизиты, выполним одно из двух действий:

Что касается табличных частей: если правила выгрузки не содержат ПКС для табличных частей (ТЧ) номенклатуры, то существующие ТЧ в приемнике останутся абсолютно нетронутыми. Очистка табличных частей происходит только в том случае, если ТЧ присутствует в правилах обмена и передается как пустая или заполненная новыми строками.

Продвинутый вариант: использование обработчика «Поля поиска»

Если сопоставить объекты стандартным образом по одному или двум полям не удается (например, когда логика поиска требует запроса к связанным регистрам сведений или проверки нескольких условий), мы можем прибегнуть к написанию алгоритма на встроенном языке 1С.

Для этого в ПКО перейдем на вкладку «Обработчики событий» и выберем событие «Поля поиска». Рассмотрим пример кода, который выполняет поиск элемента по артикулу с помощью запроса:


// Поиск номенклатуры по артикулу с помощью ручного запроса в приемнике
Если НомерВариантаПоиска = 1 Тогда
    АртикулПоиска = "";
    Если СвойстваПоиска.Свойство("Артикул", АртикулПоиска) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |	Номенклатура.Ссылка КАК Ссылка
            |ИЗ
            |	Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |	Номенклатура.Артикул = &Артикул";
        
        Запрос.УстановитьПараметр("Артикул", АртикулПоиска);
        РезультатЗапроса = Запрос.Выполнить();
        
        Если Не РезультатЗапроса.Пустой() Тогда
            Выборка = РезультатЗапроса.Выбрать();
            Выборка.Следующий();
            // Передаем найденную ссылку платформе
            СсылкаНаОбъект = Выборка.Ссылка;
            // Сообщаем системе, что поиск успешно завершен
            ПрекратитьПоиск = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Технические риски и важные нюансы при обновлении кодов

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

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