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

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

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

Внутреннее ограничение платформы: магическое число 50

Проанализируем стандартное поведение платформы 1С:Предприятие 8.3. По умолчанию, когда пользователь начинает вводить текст в поле ввода, система инициирует поиск. Внутренний алгоритм платформы имеет жесткое ограничение: в выпадающий список попадает не более 50 элементов. Это ограничение введено разработчиками фирмы «1С» для обеспечения высокой производительности. Если бы система пыталась отрисовать 500 или 1000 строк в маленьком выпадающем окне, это привело бы к значительным задержкам в отзывчивости интерфейса и увеличило бы нагрузку на канал связи между клиентом и сервером.

Рассмотрим ситуацию, когда нам нужно программно повлиять на этот список. Важно понимать, что даже если мы принудительно сформируем массив из 100 элементов и передадим его платформе, в интерфейсе «Такси» все равно отобразится только верхушка этого списка, ограниченная внутренними лимитами отрисовки и производительности.

Использование модуля менеджера для управления данными выбора

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


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

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

В данном примере мы используем конструкцию ВЫБРАТЬ ПЕРВЫЕ N. Однако помните: если вы укажете ПЕРВЫЕ 100, платформа все равно может обрезать результат до своего внутреннего лимита (50). Поэтому основной упор стоит делать не на количество, а на релевантность выдачи. Проанализируем, какие фильтры помогут пользователю быстрее найти нужное значение среди первых 50 результатов.

Настройка события АвтоПодбор на форме

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

Разберем последовательность действий:

  1. Пользователь вводит символы.
  2. Срабатывает событие АвтоПодбор.
  3. Мы формируем свой массив или список значений.
  4. Передаем его в параметр ДанныеВыбора.
  5. Устанавливаем СтандартнаяОбработка = Ложь.

Пример кода на форме:


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

Визуальное отображение и высота выпадающего списка

Важно различать количество данных в списке (лимит 50) и высоту видимой области выпадающего окна. В интерфейсе «Такси» высота окна жестко зашита в графическую оболочку платформы. Обычно без прокрутки (скролла) пользователь видит от 7 до 12 элементов. Проанализируем ситуацию: даже если в вашем списке ровно 50 элементов, пользователю все равно придется пользоваться мышкой или стрелками на клавиатуре, чтобы просмотреть их все.

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

Влияние истории выбора и настроек поиска

Рассмотрим еще один важный нюанс. Платформа часто подмешивает в начало списка автоподбора «Историю выбора» пользователя. Это те элементы, которые данный пользователь выбирал ранее. Иногда кажется, что список стал длиннее или в нем появились странные дубли. Чтобы управлять этим, обратите внимание на свойство поля ввода ОбновлениеТекстаРедактирования и программные методы работы с историей выбора.

Также проанализируем настройку «Способ поиска при вводе по строке». Она может принимать значения:

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

Альтернативные решения для больших списков

Если бизнес-задача требует, чтобы пользователь видел сразу 100 или 200 элементов в удобном виде, стандартный автоподбор — не лучший выбор. Рассмотрим альтернативы:

  1. Использование кнопки «Показать все». Это стандартный путь 1С. При нажатии открывается полноценная форма выбора, где работают мощные фильтры, динамический список и нет ограничений на количество отображаемых строк.
  2. Создание кастомной выпадающей формы. Вы можете программно открывать небольшую вспомогательную форму в позиции под полем ввода, которая будет имитировать выпадающий список. В ней вы вольны задать любую высоту и любое количество элементов ТабличногоПоля.

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

← На главную