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

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

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

Постановка задачи и анализ ситуации

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

Шаг 1. Получение данных с помощью запроса

Для начала нам нужно отобрать необходимые ссылки из базы данных. Самым эффективным способом в 1С является использование объекта Запрос. Мы выполним его на сервере, чтобы минимизировать нагрузку на клиентское приложение. Рассмотрим пример функции, которая возвращает массив нужных нам ссылок.


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

Обратите внимание на использование оператора ПОДОБНО в тексте запроса. Символ процента ("%") является спецсимволом, который заменяет любую последовательность знаков. Таким образом, условие "П%" отберет всех пользователей, чье наименование начинается на букву "П".

Шаг 2. Заполнение списка выбора элемента формы

Теперь нам необходимо передать полученный массив в свойство элемента формы СписокВыбора — здесь поможет система централизованного управления заполнением реквизитов и списками выбора. Чаще всего это делается при инициализации формы. Разберем процедуру ПриСозданииНаСервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Получаем массив ссылок из нашей функции
    СписокМенеджеров = ПолучитьСписокМенеджеров();  
    
    // Обращаемся к элементу формы. Убедитесь, что имя элемента (ПоказателиМенеджер) 
    // совпадает с тем, что указано в конфигураторе.
    Элементы.ПоказателиМенеджер.СписокВыбора.ЗагрузитьЗначения(СписокМенеджеров);
КонецПроцедуры 

Метод ЗагрузитьЗначения() удобен тем, что он очищает текущее содержимое объекта СписокЗначений и заполняет его данными из переданного массива за одну операцию. Однако на этом этапе разработчики часто замечают, что в выпадающем списке все равно присутствуют "лишние" элементы.

Шаг 3. Почему появляются лишние значения и как их убрать

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

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

Способ 1. Настройка в конфигураторе: (альтернативой может выступать редактор форм в режиме предприятия)

  1. Откройте свойства нужного поля ввода (элемента формы).
  2. Найдите свойство «Режим выбора из списка» (ChoiceListUpdateMode) и установите его в значение «Замещение».
  3. Найдите свойство «Выбор из списка» (ChoiceFromList) и установите галочку (Истина).
  4. Найдите свойство «История выбора при вводе» (ChoiceHistoryOnInput) и установите значение «Не использовать».

Способ 2. Программная настройка (в коде): Добавление реквизитов и элементов формы программно позволяет гибко менять интерфейс.

Если вы хотите управлять поведением поля динамически, добавьте в ПриСозданииНаСервере следующие строки:


// Отключаем историю выбора, чтобы видеть только наш список
Элементы.ПоказателиМенеджер.ИсторияВыбораПриВводе = РежимВыбораИзСпискаПриВводе.НеИспользовать;

// Указываем, что выбор должен производиться строго из нашего списка
Элементы.ПоказателиМенеджер.РежимВыбораИзСписка = Истина;

Дополнительные настройки для удобства пользователя

Проанализируем ситуацию дальше. Чтобы работа с полем была максимально комфортной, стоит обратить внимание еще на несколько свойств:

Использование события «НачалоВыбора»

Иногда список выбора нужно формировать не один раз при открытии формы, а каждый раз, когда пользователь нажимает на кнопку выбора (например, если критерии отбора зависят от других реквизитов формы). В этом случае мы переносим логику в обработчик события НачалоВыбора — поможет инструмент для настройки поведения форм и списков без программирования.


&НаКлиенте
Процедура ПоказателиМенеджерНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Отменяем стандартное открытие формы справочника
    СтандартнаяОбработка = Ложь;
    
    // Формируем список на сервере
    МассивДанных = ПолучитьСписокМенеджеровНаСервере();
    
    // Заполняем список выбора элемента
    Элемент.СписокВыбора.Очистить();
    Для Каждого ТекЗначение Из МассивДанных Цикл
        Элемент.СписокВыбора.Добавить(ТекЗначение);
    КонецЦикла;
КонецПроцедуры

Важный момент: использование СтандартнаяОбработка = Ложь гарантирует, что система не будет пытаться открыть основную форму выбора справочника, а позволит нам самостоятельно управлять процессом через СписокВыбора.

Заключение

Мы рассмотрели полный цикл работы со списком выбора: от написания запроса до тонкой настройки свойств элемента формы. Помните, что для корректного отображения программно сформированных данных критически важно отключать ИсторияВыбораПриВводе и правильно устанавливать РежимВыбораИзСписка. Это позволит создать интуитивно понятный и чистый интерфейс, где пользователь видит только актуальную информацию без лишнего "шума" из прошлых сессий работы.

← На главную