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

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

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

Различие между типом СписокЗначений и Списком выбора элемента формы

Первое, с чего нам необходимо начать, — это прояснение фундаментального различия в архитектуре управляемых форм. Часто разработчики создают реквизит формы с типом СписокЗначений, полагая, что именно в нем будет храниться выбранное пользователем значение. Однако это не совсем так.

СписокЗначений — это объект-коллекция, предназначенный для хранения множества элементов. Если ваша задача — дать пользователю выбрать одно значение из предложенных (например, тип файла: "Текст" или "Excel"), то реквизит формы должен иметь простой тип, соответствующий значению (например, Строка, Число или СправочникСсылка).

Рассмотрим ситуацию: мы хотим создать поле "Тип выбора" с вариантами "Каталог" и "Файл". Для этого проделаем следующие шаги:

  1. Создадим реквизит формы ТипВыбора с типом Строка.
  2. Вынесем его на форму.
  3. В свойствах элемента формы (в конфигураторе) установим флаг РежимВыбораИзСписка в значение Да.

Теперь элемент формы будет работать как выпадающий список, но сам список вариантов нам нужно заполнить программно или в свойствах элемента СписокВыбора.

Программное заполнение списка выбора

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

Лучшей практикой является использование серверного события ПриСозданииНаСервере. Это событие выполняется один раз при инициализации формы. Рассмотрим пример кода:


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

Здесь Значение ("Каталог") — это то, что будет записано в реквизит ТипВыбора, а Представление ("Выбрать папку на диске") — это текст, который увидит пользователь в выпадающем списке.

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

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

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Устанавливаем значение по умолчанию простым присваиванием реквизиту
    // Система сама найдет это значение в СпискеВыбора и покажет нужное представление
    ТипВыбора = "Файл";
    
    // Если нужно установить значение по индексу из списка выбора:
    Если Элементы.ТипВыбора.СписокВыбора.Количество() > 1 Тогда
        ТипВыбора = Элементы.ТипВыбора.СписокВыбора[1].Значение;
    КонецЕсли;

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

Обратите внимание: мы обращаемся напрямую к имени реквизита ТипВыбора. Если в списке выбора элемента формы есть значение "Файл", пользователь сразу увидит его в поле ввода при открытии обработки.

Почему значения в списке двоятся?

Разберем ситуацию, на которую жаловался автор: "почему в списках значения по 2 раза?". Это происходит по двум основным причинам:

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

Получение выбранного значения

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

Проанализируем пример получения значения при нажатии кнопки на форме:


&НаКлиенте
Процедура ВыполнитьДействие(Команда)
    
    Если ТипВыбора = "Каталог" Тогда
        Сообщить("Пользователь решил выбрать каталог: " + ДиалогВыбораКаталога);
    ИначеЕсли ТипВыбора = "Файл" Тогда
        Сообщить("Пользователь выбрал работу с файлом.");
    КонецЕсли;
    
КонецПроцедуры

Это работает максимально просто и надежно. Если же вам все-таки необходимо использовать именно тип СписокЗначений (например, для выбора нескольких форматов файлов с галочками), то подход будет другим — использование элемента формы Таблица или Поле списка, где перебор осуществляется через цикл Для Каждого Элемент Из СписокЗначений Цикл с проверкой свойства Пометка.

Важные настройки элемента формы

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

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

← На главную