Как в Конвертации данных 2 настроить поиск номенклатуры по штрихкоду?

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

При переносе данных между базами «1С:Розница» (или другими типовыми конфигурациями) через «Конвертацию данных 2» (КД 2) специалисты часто сталкиваются с проблемой задвоения элементов справочника Номенклатура. Это происходит из-за того, что наименования или коды товаров в базах источника и приемника могут незначительно отличаться (например, из-за опечаток или разных стандартов ввода данных).

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

Почему возникает ошибка при поиске по штрихкоду?

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

Связь между товаром и его штрихкодом выглядит следующим образом:

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

Анализ нежелательного решения («Костыля»)

На форумах часто советуют простое, но крайне небезопасное решение: открыть конфигурацию на редактирование в режиме конфигуратора («снять с поддержки»), добавить в справочник Номенклатура временный реквизит Штрихкод, заполнить его обработкой, выполнить обмен, а затем удалить этот реквизит и вернуть базу на поддержку.

Мы настоятельно не рекомендуем использовать этот метод по следующим причинам:

  1. Риск потери данных: Снятие с поддержки и последующие манипуляции с метаданными могут привести к сбоям, особенно в распределенных информационных базах (РИБ).
  2. Сложность обновления: Измененную конфигурацию гораздо труднее обновлять на новые типовые релизы.
  3. Монопольный доступ: Для внесения изменений в метаданные потребуется выгнать всех пользователей из базы данных, что часто невозможно в работающей розничной сети.

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

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

Для реализации корректного поиска нам потребуется передать штрихкод из базы-источника в качестве временного параметра объекта, а при загрузке в базе-приемнике обратиться к регистру сведений через запрос. Рассмотрим этот процесс по шагам.

Шаг 1. Создание искусственного свойства в ПКС

Нам необходимо передать значение штрихкода вместе с выгружаемой номенклатурой. Для этого мы создадим специальное свойство в Правилах конвертации свойств (ПКС) для нашего Правила конвертации объектов (ПКО) Номенклатура.

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

Шаг 2. Получение штрихкода в базе-источнике

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

Откроем обработчик события «Перед выгрузкой» для созданного нами ПКС Штрихкод и напишем следующий код:


// Запрос для получения штрихкода номенклатуры из регистра источника
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |	РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |	Штрихкоды.Владелец = &Владелец";

Запрос.УстановитьПараметр("Владелец", Источник);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Значение = Выборка.Штрихкод; // Передаем найденный штрихкод в параметр
КонецЕсли;

Важное примечание: Обратите внимание на структуру метаданных вашей конфигурации. В зависимости от версии программы «1С:Розница» или «1С:Управление торговлей», имя регистра может быть Штрихкоды или ШтрихкодыНоменклатуры, а поле связи вместо Владелец может называться Номенклатура. Перед сохранением правил обязательно проверьте эти имена в конфигураторе базы-источника.

Шаг 3. Настройка поиска по полученному параметру в базе-приемнике

После того как штрихкод успешно выгружен и передан в файле обмена, нам нужно обработать его на стороне приемника. Для этого мы задействуем механизм поиска по произвольному алгоритму.

  1. Перейдем в настройки ПКО Номенклатура на вкладку «Настройки».
  2. Убедимся, что установлен флаг «Продолжить поиск по полям поиска, если по идентификатору объект не найден». Это гарантирует, что если КД 2 не сможет сопоставить объекты по внутреннему GUID, система перейдет к нашему алгоритму.
  3. Откроем обработчик события «Поля поиска» для ПКО Номенклатура.

Пропишем в этом обработчике следующий bsl-код, который выполнит запрос к регистру сведений базы-приемника:


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

Разберем логику работы этого обработчика. Переменная ПараметрыОбъекта содержит все переданные нами из источника параметры. Мы извлекаем из нее значение штрихкода. Если оно заполнено, мы выполняем запрос к регистру сведений Штрихкоды приемника. При нахождении соответствия мы присваиваем переменной СсылкаНаОбъект найденную ссылку на номенклатуру и устанавливаем флаг ПрекратитьПоиск = Истина. Это сообщает системе КД 2, что сопоставление выполнено успешно и продолжать поиск по другим полям не требуется.

Резервные варианты поиска

Что произойдет, если у товара в базе-источнике не заполнен штрихкод или поиск по нему в приемнике не дал результатов? Если мы ограничимся только кодом выше, система может создать новый дублирующий элемент.

Чтобы избежать этого, мы можем настроить резервный поиск по стандартным полям (например, по Артикулу или Коду). Если поиск по штрихкоду в обработчике «Поля поиска» не установит ПрекратитьПоиск = Истина, КД 2 автоматически продолжит искать объект по тем полям ПКС, для которых на форме настроек правил отмечен флаг «Поиск».

Например, хорошей практикой является следующая цепочка сопоставления:

  1. Поиск по уникальному идентификатору (GUID).
  2. Если не найден — поиск по Штрихкоду (через наш алгоритм в Полях поиска).
  3. Если не найден — поиск по Артикулу (стандартная галочка «Поиск» в ПКС).
  4. Если не найден — поиск по Наименованию (или создание новой карточки товара).

Преимущества использования штатного механизма КД 2

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

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

← На главную