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

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

При организации переноса документов реализации из конфигурации «Управление торговлей» редакции 10.3 в «Бухгалтерию предприятия» редакции 3.0 часто возникает задача сопоставить объекты не по внутреннему идентификатору (GUID), а по штрихкоду. Дополнительная сложность заключается в том, что в базе-источнике учет ведется в разрезе номенклатуры и характеристик, а в базе-приемнике характеристики отсутствуют. При этом штрихкод хранится не в реквизитах справочника Номенклатура, а в независимом регистре сведений.

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

Анализ структуры данных источника и приемника

Проанализируем хранение данных в обеих конфигурациях:

  1. В УТ 10.3 штрихкод хранится в регистре сведений Штрихкоды. Запись привязана к комбинации Номенклатура + ХарактеристикаНоменклатуры (а также единице измерения).
  2. В БП 3.0 штрихкод хранится в регистре сведений ШтрихкодыНоменклатуры и привязан непосредственно к объекту справочника Номенклатура.

Так как штрихкод не является реквизитом справочника, мы не можем просто установить флаг «Поле поиска» напротив свойства в таблице ПКС. Для решения этой задачи используем механизмы передачи параметров и обработчики событий КД 2.0.

Шаг 1. Передача штрихкода из источника через параметры

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

В правиле конвертации объектов (ПКО) Номенклатура создадим новое правило конвертации свойств (ПКС) со следующими настройками:

  1. В полях Имя источника и Имя приемника укажем произвольное имя параметра, например, ШтрихкодТовара.
  2. Установим флаг «Передавать в параметр».
  3. Установим флаг «Поиск объекта при загрузке по свойству».

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


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

Запрос.УстановитьПараметр("Номенклатура", Источник);
Запрос.УстановитьПараметр("Характеристика", ИсточникХарактеристика);

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

Шаг 2. Настройка поиска по штрихкоду в базе-приемнике

Теперь настроим обработку поиска объекта в БП 3.0 по полученному штрихкоду. В настройках ПКО Номенклатура снимем флаг «Искать объект приемника по внутреннему идентификатору» (или оставим его, если необходимо сначала искать по GUID, а при нехватке совпадений переходить к поиску по свойствам).

Перейдем в событие «Поля поиска» ПКО Номенклатура и пропишем код поиска в регистре сведений приемника:


ШтрихкодИскомый = ПараметрыОбъекта["ШтрихкодТовара"];

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

В этом коде мы читаем переданное значение из структуры ПараметрыОбъекта, выполняем запрос к регистру ШтрихкодыНоменклатуры базы БП 3.0 и при успешном нахождении присваиваем результат переменной СсылкаНаИскаемыйОбъект, завершая поиск флагом ПрекратитьПоиск = Истина.

Шаг 3. Автоматическое создание штрихкода при создании нового элемента

Если элемент номенклатуры не был найден по штрихкоду, платформа 1С автоматически создаст новую позицию справочника в приемнике. Однако сам штрихкод в регистр сведений БП 3.0 автоматически записан не будет. Чтобы при последующих обменах номенклатура успешно сопоставлялась, запишем штрихкод при загрузке.

В обработчике «После загрузки» ПКО Номенклатура добавим следующий код:


ШтрихкодИскомый = ПараметрыОбъекта["ШтрихкодТовара"];

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

Шаг 4. Формирование наименования с учетом характеристики

Поскольку в УТ 10.3 одна и та же номенклатура может иметь разные характеристики (и разный штрихкод для каждой из них), при переносе в БП 3.0 без характеристик новые позиции создадутся с одинаковым наименованием. Для предотвращения дублей по наименованию изменим ПКС Наименование.

В событии «Перед выгрузкой» ПКС Наименование сформируем полное название:


Если ЗначениеЗаполнено(ИсточникХарактеристика) Тогда
    Значение = Строка(Источник.Наименование) + " (" + Строка(ИсточникХарактеристика.Наименование) + ")";
Иначе
    Значение = Источник.Наименование;
КонецЕсли;

Важные ограничения и рекомендации

При реализации поиска по штрихкоду следует учитывать несколько нюансов:

  1. Множественные штрихкоды: В базе УТ 10.3 для одной номенклатуры или характеристики может быть зарегистрировано несколько штрихкодов. В запросе всегда необходимо использовать инструкцию ВЫБРАТЬ ПЕРВЫЕ 1, чтобы предотвратить ошибки выборки при наличии нескольких записей.
  2. Дублирование штрихкодов в базе: Если один и тот же штрихкод по ошибке присвоен разным позициям номенклатуры, запрос вернет первую случайную позицию. Рекомендуется перед настройкой обмена выполнить поиск дублей штрихкодов в обеих базах.
  3. Оптимизация производительности: Выполнение запроса на каждый выгружаемый объект в событии «Поля поиска» может замедлить процесс обмена при большом объеме данных. Для ускорения обмена можно сформировать таблицу всех штрихкодов за один запрос в событии «Перед выгрузкой» документа и передать её через ВходящиеДанные.
← На главную