Как правильно настроить поиск номенклатуры по классификатору ЕГАИС в Конвертации данных 2.1?

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

При объединении нескольких информационных баз конфигурации 1С:Розница 2.2 или переносе остатков разработчики часто сталкиваются с ситуацией, когда наименования и артикулы алкогольной продукции в разных базах различаются, а внутренние идентификаторы (GUID) не совпадают. В таких случаях сопоставление по стандартным полям (коду, наименованию или артикулу) приводит к дублированию справочников. Единственным надежным критерием идентификации алкогольной продукции выступает классификатор ЕГАИС и связанный с ним регистр сведений СоответствиеНоменклатурыЕГАИС.

Разберем типичные ошибки при программной настройке сопоставления объектов и рассмотрим корректный алгоритм передачи и поиска номенклатуры с помощью виртуальных полей поиска в конфигурации «Конвертация данных 2.1».

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

Проанализируем частую ошибку, возникающую при попытке выполнить поиск объекта через запрос в ПКО (Правиле конвертации объектов):


Если НомерВариантаПоиска = 1 Тогда
    Если СвойстваПоиска["АлкогольнаяПродукция"] Тогда
        Запрос = Запросы.НайтиНоменклатуруАлкПоПолямПоиска;
        Запрос.УстановитьПараметр("СсылкаАлк", СсылкаНаОбъект);
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            СсылкаНаОбъект = Выборка.Номенклатура;
            ПрекратитьПоиск = Истина;
            УстанавливатьУОбъектаВсеСвойстваПоиска = Ложь;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

В приведенном коде допущены критические логические ошибки:

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

Пошаговый алгоритм настройки поиска через виртуальные свойства

Рассмотрим правильную схему реализации поиска, не требующую доработки конфигурации-приемника и добавления новых реквизитов в метаданные.

  1. Создание виртуального свойства поиска в ПКО:

    Откроем ПКО справочника Номенклатура на вкладке «Конвертация свойств». Добавим новую строку ПКС:

    — В поле «Свойство источника» и «Свойство приемника» укажем произвольное наименование, например: КодЕГАИС.
    — Установим флаг «Поиск».
    — Снимем флаг передачи в приемник, если в самом справочнике Номенклатура такого реквизита нет (чтобы конвертация не пыталась записать значение в реквизит объекта).

  2. Получение кода ЕГАИС в источнике (событие «Перед выгрузкой» ПКС):

    Выясним, как извлечь код алкогольной продукции для выгружаемой номенклатуры. В обработчике ПередВыгрузкой свойства КодЕГАИС напишем запрос к регистру сведений источника:

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

    В базе-приемнике прочитаем переданный код из коллекции СвойстваПоиска и найдем соответствующую номенклатуру через регистр сведений:

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

Важные управляющие флаги и параметры поиска

Разберем назначение специальных служебных переменных, используемых в обработчике:

  1. ПрекратитьПоиск = Истина; — сообщает механизму загрузки, что объект успешно найден и дальнейшие варианты поиска (по наименованию, штрихкоду, артикулу) выполнять не требуется.
  2. УстанавливатьУОбъектаВсеСвойстваПоиска = Ложь; — предотвращает попытку платформы автоматически присвоить значение из СвойстваПоиска["КодЕГАИС"] одноименному реквизиту найденного объекта приемника, исключая ошибки несоответствия метаданных.
  3. Отключение поиска по внутреннему идентификатору (GUID): Так как перенос выполняется между независимыми базами 1С:Розница, в настройках ПКО необходимо снять флаг «Искать объект по внутреннему идентификатору» либо включить флаг «Продолжить поиск по полям поиска, если объект по идентификатору не найден».

Дополнительные рекомендации при слиянии баз

Если в базах-источниках сопоставление с ЕГАИС заполнено не для всех позиций, рекомендуется предусмотреть резервные варианты сопоставления:

  1. Поиск по штрихкоду EAN-13: Настройте второй вариант поиска (НомерВариантаПоиска = 2) по регистру сведений Штрихкоды (или ШтрихкодыНоменклатуры). Потребительские штрихкоды одинаковы для одинаковых товаров во всех базах.
  2. Предварительное сопоставление: Перед выгрузкой остатков в исходных базах воспользуйтесь типовой обработкой Сопоставление номенклатуры ЕГАИС, чтобы минимизировать количество некорректно привязанных элементов.
← На главную