Как реализовать вывод номенклатурной папки перед названием товара при подборе в реализации

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

При работе с документами, такими как Реализация товаров и услуг, пользователи часто сталкиваются с необходимостью быстро идентифицировать товар в выпадающем списке при вводе текста. Стандартный поиск по наименованию не всегда удобен, если товары с похожими названиями лежат в разных группах. Рассмотрим подробно, как изменить механизм автоподбора и вывода номенклатуры, чтобы перед названием товара отображалась его родительская папка.

Способ 1. Использование обработчиков представления в модуле менеджера

Этот метод является наиболее "глобальным" в системе 1С. Он позволяет изменить то, как объект (в нашем случае справочник Номенклатура) будет выглядеть во всех полях ввода, списках и отчетах, где используется его стандартное представление. Для реализации нам потребуется внести изменения в Модуль менеджера справочника Номенклатура.

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

Проанализируем пример кода для модуля менеджера:


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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ИмяПапки = "";
    Если ЗначениеЗаполнено(Данные.Родитель) Тогда
        ИмяПапки = Строка(Данные.Родитель) + " / ";
    КонецЕсли;
    
    ВидТекстом = "";
    Если ЗначениеЗаполнено(Данные.ВидНоменклатуры) Тогда
        ВидТекстом = " (" + НРег(Строка(Данные.ВидНоменклатуры)) + ")";
    КонецЕсли;
    
    Представление = ИмяПапки + Данные.Наименование + ВидТекстом;
    
КонецПроцедуры

В этом примере функция НРег() используется для приведения текста к нижнему регистру (например, чтобы "Товар" превратился в "товар" для эстетичного вида в скобках). Важно понимать, что обращение к полю Данные.Родитель может вызвать дополнительные запросы к базе данных. Чтобы этого избежать, мы обязательно добавляем это поле в список в процедуре ОбработкаПолученияПолейПредставления.

Способ 2. Контекстное изменение через ОбработкаПолученияДанныхВыбора

Часто возникает задача изменить представление не во всей системе, а только в конкретном документе. Глобальное изменение представления может "перегрузить" интерфейс других подсистем. В этом случае лучше использовать механизм ОбработкаПолученияДанныхВыбора в модуле менеджера. Этот метод позволяет сформировать список подсказок (выпадающий список), который видит пользователь при вводе текста.

Выясним, как сделать это изменение контекстным. Для этого мы задействуем свойство ПараметрыВыбора у элемента формы.

Шаг 1. Настройка формы документа:

В форме документа РеализацияТоваровУслуг для поля ввода Номенклатура в табличной части найдем свойство Параметры выбора и добавим туда программно или через конфигуратор наш признак:

Новый ПараметрВыбора("КонтекстВызова", "РеализацияТоваров")

Шаг 2. Реализация в модуле менеджера справочника Номенклатура:


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

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

Этот способ является наиболее гибким, так как он позволяет полностью контролировать логику поиска и отображения данных, не влияя на работу других документов системы.

Способ 3. Переопределение события АвтоПодбор на форме

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

Разберем, как работает этот механизм:

  1. Когда пользователь нажимает TAB или просто вводит текст, срабатывает событие АвтоПодбор.
  2. Мы перехватываем введенный текст через параметр Текст.
  3. Формируем собственный список значений.
  4. Передаем этот список в параметр ДанныеВыбора и устанавливаем СтандартнаяОбработка = Ложь.

Посмотрим на пример кода в модуле формы:


&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    
    Если СтрДлина(Текст) < 3 Тогда
        Возврат;
    КонецЕсли;
    
    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = ПолучитьСписокНоменклатурыДляПодбора(Текст);
    
КонецПроцедуры

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

Важные рекомендации и нюансы реализации

При реализации любого из предложенных методов стоит учитывать несколько критически важных моментов:

Рассмотренные подходы позволяют сделать работу пользователя в 1С более комфортной, сокращая время на поиск нужной позиции номенклатуры и минимизируя ошибки при вводе данных в документы реализации.

← На главную