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