Как настроить поиск номенклатуры по полному наименованию и номенклатуре контрагента при загрузке из Excel?

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

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

Анализ типичных ошибок при настройке поиска

Рассмотрим, почему не работают попытки подменить поиск через поле с режимом загрузки «Вычислить». Пользователи часто пытаются написать в выражении следующую конструкцию:


СсылкаНоменклатуры = Справочники.Номенклатура.НайтиПоПолномуНаименованию(ТекущиеДанные["Номенклатура"]);
Результат = СсылкаНоменклатуры.НаименованиеПолное;

В результате обработка выдает ошибки: «Не однозначное представление. Вариантов: N» или «Не указано значение ключевых реквизитов: Наименование». Выясним причину такого поведения платформы:

  1. Неверное назначение режима «Вычислить». Данная формула рассчитывает только значение конкретного реквизита в загружаемом объекте, но не производит подмену самого объекта базы данных. Если в строку реквизита передать найденную ссылку, платформа попытается привести её к строковому представлению, что вызывает ошибку неоднозначности при наличии дублей.
  2. Бессмысленность взятия реквизита у найденной ссылки. Если исходный текст полного наименования уже присутствует в колонке таблицы, поиск ссылки ради получения того же самого значения избыточен.
  3. Логика встроенного механизма поиска. Если в табличной части настройки флаг «Поле поиска» установлен сразу у нескольких реквизитов, обработка соединяет их жестким логическим условием «И». Выполнить поиск по условию «ИЛИ» (например, сначала по номенклатуре контрагента, а при отсутствии — по полному наименованию) штатными флажками невозможно.
  4. Разделение структур данных в УТ 10.3. Номенклатура поставщика хранится не в самом справочнике Номенклатура, а в подчиненном справочнике НоменклатураКонтрагентов (реквизиты НаименованиеНоменклатурыКонтрагента, АртикулНоменклатурыКонтрагента и владелец Контрагент). Напрямую выбрать эти поля в списке реквизитов загрузки номенклатуры нельзя.

Вариант 1. Настройка штатного поиска только по полному наименованию

Если требуется строго искать позицию по реквизиту НаименованиеПолное без учета номенклатуры поставщика, можно обойтись стандартными настройками колонок без написания сложного программного кода:

  1. В окне настройки колонок снимем флажок «Поле поиска» со строки Наименование.
  2. Установим флажок «Поле поиска» напротив строки НаименованиеПолное (или Полное наименование).
  3. Для реквизита Наименование выберем режим загрузки «Вычислять» и укажем формулу, ограничивающую длину строки до допустимого предела системного реквизита (обычно до 100 символов): Результат = Лев(СокрЛП(ТекстЯчейки), 100); Либо скопируем значение из колонки с полным наименованием. Это исключит ошибку о незаполненном ключевом поле.

Вариант 2. Каскадный поиск и подмена объекта в обработчике «Перед записью объекта»

Когда требуется реализовать сложное условие — сопоставить позицию по наименованию поставщика, а если соответствие не найдено, найти по полному наименованию или создать новый элемент, — используем встроенные события обработки. Разберем по шагам реализацию в событии «Перед записью объекта»:

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

Посмотрим на пример реализации алгоритма:


// Предположим, что колонка 1 содержит наименование поставщика, колонка 2 — полное наименование
ТекстПоставщика = СокрЛП(ТекстыЯчеек[1]);
ТекстПолный = СокрЛП(ТекстыЯчеек[2]);

СсылкаНайденнойНоменклатуры = Справочники.Номенклатура.ПустаяСсылка();

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

Запрос.УстановитьПараметр("НаименованиеПоставщика", ТекстПоставщика);
Запрос.УстановитьПараметр("Поставщик", СсылкаНаПоставщика); // Указать ссылку на нужного контрагента

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    СсылкаНайденнойНоменклатуры = Выборка.Номенклатура;
КонецЕсли;

// 2. Если по контрагенту не найдено, ищем по полному наименованию
Если Не ЗначениеЗаполнено(СсылкаНайденнойНоменклатуры) И ЗначениеЗаполнено(ТекстПолный) Тогда
    СсылкаНайденнойНоменклатуры = Справочники.Номенклатура.НайтиПоРеквизиту("НаименованиеПолное", ТекстПолный);
КонецЕсли;

// 3. Обработка результата поиска
Если ЗначениеЗаполнено(СсылкаНайденнойНоменклатуры) Тогда
    // Позиция уже существует в базе. Обновляем нужные данные существующего элемента
    СуществующийОбъект = СсылкаНайденнойНоменклатуры.ПолучитьОбъект();
    
    // При необходимости обновляем реквизиты:
    // СуществующийОбъект.Наименование = Объект.Наименование;
    // СуществующийОбъект.Записать();
    
    // Отменяем запись дублирующего нового объекта обработкой
    Отказ = Истина;
Иначе
    // Позиция не найдена: продолжаем штатную запись нового элемента
    // Заполняем реквизиты нового создаваемого объекта
    Объект.НаименованиеПолное = ТекстПолный;
    Отказ = Ложь;
КонецЕсли;

Вариант 3. Двухэтапная загрузка через сопоставление номенклатуры контрагентов

Проанализируем методически верный вариант для конфигурации «1С:Управление торговлей 10.3», исключающий модификацию программного кода:

  1. Загрузим исходную таблицу обработкой напрямую в справочник НоменклатураКонтрагентов, указав владельцем загружаемых позиций соответствующего контрагента-поставщика.
  2. Воспользуемся типовым функционалом сопоставления номенклатуры контрагентов с внутренней номенклатурой предприятия. В формах документов поступления система автоматически предложит привязать существующие карточки товаров или создать новые.
  3. Если дубликаты все же были созданы ранее, используем сервисную обработку «Поиск и замена дублирующихся элементов справочников», выполнив отбор по совпадению реквизита НаименованиеПолное и объединив ссылки.
← На главную