Как реализовать сопоставление номенклатуры контрагентов в 1С:Розница 2.2 при переходе с 1С:УТ 10.3?

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

При миграции с конфигурации «Управление торговлей», редакция 10.3 на «1С:Розница 2.2» разработчики и пользователи часто сталкиваются со следующей проблемой: у поставщиков наименования, коды и артикулы товаров отличаются от тех, что приняты во внутренней базе. В УТ 10.3 для хранения информации о сопоставлении использовался специализированный справочник НоменклатураКонтрагентов. Проанализируем, как решить эту задачу в «1С:Розница 2.2» и правильно настроить автоматическую загрузку документов.

Особенности архитектуры «1С:Розница 2.2»

В типе типовых решений «1С:Розница 2.2» отсутствует прямой аналог справочника номенклатуры контрагентов из УТ 10.3. Существующий в системе регистр сведений ПоставляемаяНоменклатура хранит информацию о ценах, магазине и поставщиках, но не содержит структур для сопоставления сторонних артикулов и наименований с вашей номенклатурной базой.

Для решения этой проблемы разберем два основных подхода:

  1. Доработка конфигурации: создание собственного регистра сведений для хранения связей номенклатуры контрагента и элемента справочника Номенклатура.
  2. Использование альтернативных штатных инструментов: использование встроенного модуля «1С-ЭДО» или регистра ШтрихкодыНоменклатуры.

Создание собственного регистра сведений сопоставления

Для создания полноценного механизма сопоставления добавим непериодический независимый регистр сведений, например НоменклатураКонтрагентов. Разберем необходимую структуру его измерений и ресурсов:

Измерения:

  1. Контрагент — тип СправочникСсылка.Контрагенты;
  2. КодНоменклатурыКонтрагента — тип Строка (или АртикулНоменклатурыКонтрагента);

Ресурсы:

  1. Номенклатура — тип СправочникСсылка.Номенклатура;
  2. Характеристика (при необходимости) — тип СправочникСсылка.ХарактеристикиНоменклатуры.

Как внести изменения без полной отмены поддержки конфигурации

Рассмотрим, как правильно добавить новый объект базы данных, сохраняя обновляемость конфигурации:

  1. Редактирование с сохранением поддержки: Нам не требуется полностью снимать конфигурацию с поддержки. Достаточно перевести конфигурацию в режим «Редактируется с сохранением поддержки». Созданные вами новые объекты не будут затираться при типовых обновлениях от компании 1С.
  2. Использование расширений конфигурации: Если версия платформы и режим совместимости позволяют создавать объекты БД в расширениях (платформа 8.3.14 и выше), регистр можно вынести в расширение. Если режим совместимости конфигурации ниже, регистр добавляется непосредственно в основную конфигурацию.

Оптимизация кода загрузки документов и отработка ошибок

Проанализируем распространенную ошибку, возникающую при написании алгоритма поиска сопоставлений. Рассмотрение реализации через перебор всех записей цикла методом .Выбрать() показывает катастрофическое падение производительности при росте объемов базы данных:

Неоптимальный подход (циклический обход регистра):


// НЕКОРРЕКТНЫЙ ПОДХОД: обход всех записей в цикле с жесткой связкой по имени
Запись = РегистрыСведений.НоменклатураКонтрагентов.Выбрать();
Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
Пока Запись.Следующий() Цикл
    Если Запись.Контрагент.Наименование = "ООО ""Ибис""" Тогда
        Если Запись.КодНоменклатурыКонтрагента = ТекстЯчейки Тогда 
            Номенклатура = Запись.Номенклатура;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

В данном коде присутствуют две критические проблемы:

  1. Сравнение по жестко прописанной строке наименования контрагента (Запись.Контрагент.Наименование = ...) крайне ненадёжно. Контрагента необходимо искать или передавать по ссылке или через Уникальный Идентификатор.
  2. Выборка всех записей регистра через .Выбрать() с последующей фильтрацией в коде вызывает медленную работу системы. Поиск должен выполняться через запрос или точечный выбор по значениям измерений.

Правильный подход к поиску сопоставления через запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ Первые 1
    |	РС.Номенклатура КАК Номенклатура
    |ИЗ
    |	РегистрСведений.НоменклатураКонтрагентов КАК РС
    |ГДЕ
    |	РС.Контрагент = &Контрагент
    |	И РС.КодНоменклатурыКонтрагента = &КодКонтрагента";

Запрос.УстановитьПараметр("Контрагент", СсылкаКонтрагента);
Запрос.УстановитьПараметр("КодКонтрагента", ТекстЯчейки);

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    НайденнаяНоменклатура = Выборка.Номенклатура;
Иначе
    НайденнаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка();
    // Явно информируем пользователя об отсутствии сопоставления
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Не найдено сопоставление для кода поставщика: " + ТекстЯчейки;
    Сообщение.Сообщить();
КонецЕсли;

Почему не срабатывает подсвечивание ненайденных позиций в форме?

Если алгоритм загрузки записал в табличную часть пустую ссылку (Справочники.Номенклатура.ПустаяСсылка()), стандартная системная проверка заполнения не всегда помечает такое поле красным пунктиром. Платформа проверяет заполнение только в тех случаях, когда:

  1. У реквизита табличной части на уровне метаданных или у элемента формы установлено свойство «АвтоОтметкаНезаполненного» или «ПроверкаЗаполнения» в значение ВыдаватьОшибку.
  2. В обработке загрузки явно вызывается программный метод ПроверитьЗаполнение() или формируются объекты СообщениеПользователю с привязкой к конкретной ячейке формы.

Альтернативные методы сопоставления без доработки конфигурации

Рассмотрим штатные варианты решения проблемы сопоставления товаров от внешних контрагентов:

  1. Модуль «1С-ЭДО»: При обмене электронными документами сопоставление номенклатуры контрагента и вашей базы происходит автоматически во встроенных окнах взаимодействия БЭД. Система сама запоминает выбор пользователя при первом поступлении товара.
  2. Использование штрихкодов: Если поставщик передает в электронных файлах штрихкоды товаров (EAN-13), сопоставление можно организовать по типовому регистру ШтрихкодыНоменклатуры.
← На главную