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