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