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