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