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