Как увеличить количество подсказываемых позиций быстрого набора при вводе по строке в 1С?

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

При работе в программных продуктах на платформе 1С:Предприятие пользователи часто сталкиваются с неудобством: при вводе первых букв наименования или кода в поле выбора выпадает слишком мало подходящих позиций. По умолчанию в управляемых формах платформа отображает в списке быстрого выбора (автоподбора) не более 10 элементов. Из-за этого приходится совершать лишние клики, открывать форму выбора и искать нужную позицию вручную, что существенно замедляет ежедневную рутинную работу.

В этой статье мы подробно разберем, почему существует это ограничение, можно ли изменить его в стандартных настройках конфигурации и как обойти лимиты платформы с помощью программного кода, чтобы выводить 20, 30 или более подсказок.

Почему количество подсказок ограничено?

Прежде чем переходить к написанию кода, проанализируем, как устроен этот механизм на уровне платформы. Ограничения жестко вшиты в ядро системы:

  1. В управляемых формах (УФ): Лимит составляет ровно 10 элементов. Алгоритм платформы сначала ищет точные совпадения по началу строки, а затем дополняет список поиском по подстроке. На экране без прокрутки может помещаться около 5 строк, из-за чего у пользователей возникает иллюзия еще меньшего лимита.
  2. В обычных формах (ОФ): Лимит равен 50 элементам. Если поиск по строке находит больше этого количества, выпадающий список автоподбора просто не отображается, защищая интерфейс от зависаний.

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

В интерактивных свойствах элементов или метаданных нет свойства вроде «Количество элементов автоподбора». Этот параметр невозможно отрегулировать галочкой в конфигураторе. Единственный способ увеличить количество подсказок — полностью или частично переопределить стандартное поведение платформы в коде.

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

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

Разберем этот метод по шагам:

1. Откроем конфигуратор, найдем нужный справочник и откроем его Модуль менеджера.

2. Создадим предопределенную процедуру ОбработкаПолученияДанныхВыбора. Внутри этой процедуры мы отключим стандартную обработку поиска платформы и напишем собственный запрос к базе данных с нужным нам ограничением (например, ПЕРВЫЕ 25 элементов).

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


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

При таком подходе платформа выведет в выпадающий список ровно столько элементов, сколько вы передали в параметр ДанныеВыбора (в нашем примере — 25). Ограничение в 10 элементов будет успешно обойдено.

Способ 2. Локальное увеличение лимита для конкретного поля формы

Что делать, если увеличить количество подсказок необходимо не везде, а только в одном конкретном поле ввода на определенной форме? В этом случае нам поможет обработка событий самого элемента формы.

Проанализируем ситуацию на примере поля ввода номенклатуры в документе:

1. Откроем форму документа, выберем нужное поле ввода и в палитре свойств найдем событие АвтоПодбор.

2. Создадим обработчик события на клиенте и сопутствующую функцию для получения данных на сервере.

Рассмотрим подробнее программный код реализации этого механизма:


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

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

С помощью этого локального метода мы увеличили лимит выдачи подсказок до 30 элементов исключительно для редактируемого поля ввода, не затрагивая поведение системы в других местах.

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

Прежде чем внедрять эти решения в рабочие конфигурации, важно учесть несколько технических особенностей поведения платформы при установке свойства СтандартнаяОбработка = Ложь:

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

← На главную