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