При организации переноса документов реализации из конфигурации «Управление торговлей» редакции 10.3 в «Бухгалтерию предприятия» редакции 3.0 часто возникает задача сопоставить объекты не по внутреннему идентификатору (GUID), а по штрихкоду. Дополнительная сложность заключается в том, что в базе-источнике учет ведется в разрезе номенклатуры и характеристик, а в базе-приемнике характеристики отсутствуют. При этом штрихкод хранится не в реквизитах справочника Номенклатура, а в независимом регистре сведений.
Рассмотрим по шагам, как правильно настроить правила конвертации объектов (ПКО) в «1С:Конвертация данных 2.0», чтобы сопоставление номенклатуры выполнялось по штрихкоду из регистра сведений.
Проанализируем хранение данных в обеих конфигурациях:
Штрихкоды. Запись привязана к комбинации Номенклатура + ХарактеристикаНоменклатуры (а также единице измерения).ШтрихкодыНоменклатуры и привязан непосредственно к объекту справочника Номенклатура.Так как штрихкод не является реквизитом справочника, мы не можем просто установить флаг «Поле поиска» напротив свойства в таблице ПКС. Для решения этой задачи используем механизмы передачи параметров и обработчики событий КД 2.0.
Разберем, как извлечь штрихкод для конкретной выгружаемой пары номенклатуры и характеристики и передать его в базу-приемник.
В правиле конвертации объектов (ПКО) Номенклатура создадим новое правило конвертации свойств (ПКС) со следующими настройками:
ШтрихкодТовара.В событии «Перед выгрузкой» этого ПКС напишем алгоритм получения штрихкода из регистра сведений УТ 10.3:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Номенклатура
| И Штрихкоды.Характеристика = &Характеристика";
Запрос.УстановитьПараметр("Номенклатура", Источник);
Запрос.УстановитьПараметр("Характеристика", ИсточникХарактеристика);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Значение = Выборка.Штрихкод;
Иначе
Значение = "";
КонецЕсли;
Теперь настроим обработку поиска объекта в БП 3.0 по полученному штрихкоду. В настройках ПКО Номенклатура снимем флаг «Искать объект приемника по внутреннему идентификатору» (или оставим его, если необходимо сначала искать по GUID, а при нехватке совпадений переходить к поиску по свойствам).
Перейдем в событие «Поля поиска» ПКО Номенклатура и пропишем код поиска в регистре сведений приемника:
ШтрихкодИскомый = ПараметрыОбъекта["ШтрихкодТовара"];
Если ЗначениеЗаполнено(ШтрихкодИскомый) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РС.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК РС
|ГДЕ
| РС.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", ШтрихкодИскомый);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
СсылкаНаИскаемыйОбъект = Выборка.Номенклатура;
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
В этом коде мы читаем переданное значение из структуры ПараметрыОбъекта, выполняем запрос к регистру ШтрихкодыНоменклатуры базы БП 3.0 и при успешном нахождении присваиваем результат переменной СсылкаНаИскаемыйОбъект, завершая поиск флагом ПрекратитьПоиск = Истина.
Если элемент номенклатуры не был найден по штрихкоду, платформа 1С автоматически создаст новую позицию справочника в приемнике. Однако сам штрихкод в регистр сведений БП 3.0 автоматически записан не будет. Чтобы при последующих обменах номенклатура успешно сопоставлялась, запишем штрихкод при загрузке.
В обработчике «После загрузки» ПКО Номенклатура добавим следующий код:
ШтрихкодИскомый = ПараметрыОбъекта["ШтрихкодТовара"];
Если ЗначениеЗаполнено(ШтрихкодИскомый) И Не Отказ Тогда
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Штрихкод = ШтрихкодИскомый;
МенеджерЗаписи.Прочитать();
Если НЕ МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Штрихкод = ШтрихкодИскомый;
МенеджерЗаписи.Номенклатура = Ссылка;
МенеджерЗаписи.Записать();
КонецЕсли;
КонецЕсли;
Поскольку в УТ 10.3 одна и та же номенклатура может иметь разные характеристики (и разный штрихкод для каждой из них), при переносе в БП 3.0 без характеристик новые позиции создадутся с одинаковым наименованием. Для предотвращения дублей по наименованию изменим ПКС Наименование.
В событии «Перед выгрузкой» ПКС Наименование сформируем полное название:
Если ЗначениеЗаполнено(ИсточникХарактеристика) Тогда
Значение = Строка(Источник.Наименование) + " (" + Строка(ИсточникХарактеристика.Наименование) + ")";
Иначе
Значение = Источник.Наименование;
КонецЕсли;
При реализации поиска по штрихкоду следует учитывать несколько нюансов:
ВЫБРАТЬ ПЕРВЫЕ 1, чтобы предотвратить ошибки выборки при наличии нескольких записей.ВходящиеДанные.