Как увеличить количество строк в выпадающем списке поля ввода в 1С?

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

Часто при разработке интерфейсов в 1С мы сталкиваемся с ситуацией, когда значение поля ввода выбирается из выпадающего списка (например, из справочника «Сотрудники»). Для удобства пользователей мы устанавливаем свойство поля ВысотаСпискаВыбора, например, равным 15. Однако на практике в выпадающем списке отображается только 5 строк. Даже если мы вводим шестого сотрудника, отображается все равно 5 записей, а одна из старых удаляется из списка. Давайте разберем по шагам, почему так происходит и как мы можем обойти это ограничение.

Разберем причину: ограничение платформы 1С

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

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

Решение 1: Программное формирование свойства СписокВыбора

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

  1. Отключаем стандартную историю. Устанавливаем свойство элемента формы ИсторияВыбораПриВводе в значение НеИспользовать.
  2. Включаем кнопку выпадающего списка у элемента формы, установив свойство КнопкаВыпадающегоСписка в Истина.
  3. При открытии формы (например, в обработчике ПриСозданииНаСервере) программным запросом получаем нужные нам данные и заполняем ими СписокВыбора элемента формы.
  4. Устанавливаем свойство ВысотаСпискаВыбора равным нужному количеству строк (например, 15). Теперь это свойство сработает корректно.

Посмотрим на пример кода, как это можно реализовать:


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

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

Решение 2: Использование метода ВыбратьИзСписка

Рассмотрим альтернативный вариант решения задачи. Мы можем перехватить событие поля ввода НачалоВыбора, отказаться от стандартной обработки и самостоятельно вывести выпадающее меню с нужным нам количеством элементов.

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

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


&НаКлиенте
Процедура СотрудникНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие формы выбора
    СтандартнаяОбработка = Ложь;
    
    // Формируем наш список (например, через вызов серверной функции)
    СписокСотрудников = ПолучитьСписокСотрудниковНаСервере();
    
    // Показываем выпадающий список
    ДополнительныеПараметры = Новый Структура("Элемент", Элемент);
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораСотрудника", ЭтаФорма, ДополнительныеПараметры);
    
    ПоказатьВыборИзСписка(ОписаниеОповещения, СписокСотрудников, Элемент);

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

&НаКлиенте
Процедура ПослеВыбораСотрудника(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Записываем выбранное значение в реквизит объекта
        Объект.Сотрудник = ВыбранныйЭлемент.Значение;
    КонецЕсли;

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

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

← На главную