Как реализовать выбор номенклатуры по наименованию поставщика в документах 1С

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

В процессе автоматизации торговых операций часто возникает задача, когда стандартного поиска номенклатуры по коду, артикулу или наименованию становится недостаточно. Типичный пример: менеджер привык работать с прайс-листами поставщика, где названия товаров могут существенно отличаться от тех, что приняты в вашей базе. Рассмотрим, как реализовать механизм, при котором при вводе части названия поставщика в поле Номенклатура система предлагала бы соответствующие позиции из вашего справочника в виде удобного выпадающего списка.

Метод 1. Использование обработчика ОбработкаПолученияДанныхВыбора

Проанализируем наиболее универсальный и правильный с точки зрения архитектуры платформы 1С способ — переопределение логики поиска в модуле менеджера справочника Номенклатура. Этот метод будет работать во всех документах и формах, где выбирается данный объект, обеспечивая единообразие интерфейса.

Разберем алгоритм работы этого механизма. Когда пользователь начинает вводить текст в поле ввода, платформа вызывает процедуру ОбработкаПолученияДанныхВыбора. В этот момент мы можем программно сформировать свой запрос к базе данных и подменить стандартный результат поиска своими данными.

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


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если пользователь ничего не ввел, оставляем стандартное поведение
    Если ПустаяСтрока(Параметры.СтрокаПоиска) Тогда
        Возврат;
    КонецЕсли;

    // Отключаем стандартный поиск платформы
    СтандартнаяОбработка = Ложь;
    
    // Формируем запрос для поиска по номенклатуре поставщиков
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 20
        |	НоменклатураПоставщиков.Номенклатура КАК Ссылка,
        |	НоменклатураПоставщиков.Наименование КАК НаименованиеПоставщика
        |ИЗ
        |	Справочник.НоменклатураПоставщиков КАК НоменклатураПоставщиков
        |ГДЕ
        |	НоменклатураПоставщиков.Наименование ПОДОБНО &СтрокаПоиска
        |	И НЕ НоменклатураПоставщиков.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%");
    
    РезультатЗапроса = Запрос.Выполнить();
    
    // Формируем список выбора для пользователя
    СписокПоиска = Новый СписокЗначений;
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Добавляем ссылку на нашу номенклатуру, но в представлении можем указать доп. информацию
        СписокПоиска.Добавить(Выборка.Ссылка, Строка(Выборка.Ссылка) + " (Поставщик: " + Выборка.НаименованиеПоставщика + ")");
    КонецЦикла;
    
    ДанныеВыбора = СписокПоиска;

КонецПроцедуры

В данном примере мы используем левое соединение или поиск по подчиненному справочнику НоменклатураПоставщиков. Важно помнить, что если в вашей базе десятки тысяч записей, поиск по подстроке с символом "%" в начале может замедлить работу. В таких случаях проанализируем ситуацию с индексацией текстовых полей.

Метод 2. Событие АвтоПодбор на форме документа

Если нам необходимо изменить логику выбора не во всей системе, а только в конкретном документе (например, в «Приобретении товаров и услуг»), мы можем использовать событие элемента формы АвтоПодбор. Это позволяет более гибко учитывать контекст документа, например, фильтровать товары по конкретному контрагенту, указанному в шапке.

Выясним причину, по которой этот метод удобен: он позволяет передавать дополнительные параметры в запрос. Процедура вызывается в модуле формы при каждом изменении текста в поле ввода.

Рассмотрим по шагам реализацию в модуле формы:

  1. Создадим обработчик события АвтоПодбор для реквизита Номенклатура в табличной части.
  2. Установим параметр СтандартнаяОбработка = Ложь.
  3. Вызовем серверную функцию, которая вернет массив подходящих ссылок.

&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем данные с сервера
    СтруктураПоиска = Новый Структура("Текст", Текст);
    СтруктураПоиска.Вставить("Поставщик", Объект.Поставщик);
    
    ДанныеВыбора = ПолучитьСписокНоменклатурыПоставщикаНаСервере(СтруктураПоиска);
    
КонецПроцедуры

Метод 3. Использование справочника Номенклатура поставщиков в типовых решениях

Разберем ситуацию, когда мы работаем в типовых конфигурациях, таких как УТ 11, ERP или КА. В этих программах уже существует встроенный механизм сопоставления. Справочник НоменклатураПоставщиков предназначен именно для хранения внешних наименований и артикулов.

Посмотрим на преимущества использования типового механизма:

Если вы решите внедрять собственный поиск, крайне важно проверить свойство Способ поиска при вводе по строке в конфигураторе для соответствующих объектов. Установка значения Любая часть значительно повысит удобство работы пользователей, так как они смогут вводить название поставщика не с самого начала.

Оптимизация производительности при поиске

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

Во-первых, всегда ограничивайте количество возвращаемых результатов (используйте конструкцию ПЕРВЫЕ 20 или 30). Пользователь все равно не сможет просмотреть список из 500 элементов в маленьком окошке.

Во-вторых, выполняйте поиск только тогда, когда введено достаточное количество символов (например, более 2-3). Это исключит лишние запросы к базе при вводе первых букв.

В-третьих, если данные поставщиков хранятся в дополнительных реквизитах (БСП), используйте соединение с таблицей ДополнительныеЗначения максимально аккуратно, чтобы не вызвать полную проверку всей таблицы номенклатуры.

Таким образом, комбинируя методы программной обработки событий ОбработкаПолученияДанныхВыбора и штатные возможности справочников сопоставления, можно добиться высокой скорости подбора товара, даже если его внутреннее наименование совершенно не похоже на то, что указал поставщик в своих документах.

← На главную