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