К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как открыть список значений в 1С

Как открыть список значений в 1С: методы ВыбратьЭлемент, ПоказатьВыборЭлемента, открытие формы списка справочника, примеры кода и типичные ошибки.

Список значений в 1С — универсальный объект, который используется для выбора пользователем одного или нескольких вариантов, передачи наборов данных между процедурами и организации отборов. В зависимости от задачи «открыть список значений» может означать разное: показать пользователю диалог выбора элемента из списка, открыть форму списка справочника или документа, либо программно сформировать и обработать объект СписокЗначений.

Способ открытия зависит от режима работы конфигурации. В обычном приложении (толстый клиент, управляемые формы отключены) применяется модальный метод ВыбратьЭлемент(). В управляемом приложении модальные вызовы запрещены или нежелательны, поэтому используются асинхронные методы ПоказатьВыборЭлемента() и ПоказатьВыборИзМеню() с описанием оповещения. Если речь идёт о списке справочника или документа, открывается форма списка через ОткрытьФорму() с параметрами.

Ниже разобраны все основные сценарии: программное создание списка значений, открытие диалога выбора в обычном и управляемом приложении, открытие формы списка с отбором, а также типичные ошибки, из-за которых список не открывается или выбор теряется.

Что такое список значений и когда его открывают

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

Открыть список значений требуется в трёх типовых ситуациях. Первая — пользователю нужно выбрать один вариант из заранее подготовленного набора, например способ доставки или вариант округления цены. Вторая — нужен множественный выбор с пометками, например выбор нескольких складов для отчёта. Третья — требуется открыть не сам объект СписокЗначений, а форму списка справочника или документа, что решается другими средствами.

Создание и наполнение списка значений

Прежде чем открывать список, его нужно сформировать. Объект создаётся конструктором Новый СписокЗначений, элементы добавляются методом Добавить(Значение, Представление, Пометка). Представление можно опустить — тогда пользователь увидит стандартное строковое представление значения.

Список = Новый СписокЗначений;

Список.Добавить("Курьер", "Доставка курьером");

Список.Добавить("Самовывоз", "Самовывоз со склада");

Список.Добавить("ТК", "Транспортная компания", Истина);

Третий параметр метода Добавить устанавливает пометку элемента — она важна при множественном выборе, когда пользователь отмечает нужные строки флажками. Для сортировки перед показом применяется Список.СортироватьПоПредставлению(), для поиска элемента — НайтиПоЗначению().

Учтите ограничение: список значений нельзя напрямую передать между клиентом и сервером в некоторых контекстах тонкого и веб-клиента без сериализации, а также он не хранится в базе данных как самостоятельный объект — для хранения его обычно помещают в хранилище значения.

Открытие списка в управляемом приложении

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

&НаКлиенте

Процедура ВыбратьСпособ(Команда)

Список = Новый СписокЗначений;

Список.Добавить("Курьер", "Доставка курьером");

Список.Добавить("Самовывоз", "Самовывоз со склада");

Оповещение = Новый ОписаниеОповещения("ПослеВыбораСпособа", ЭтотОбъект);

Список.ПоказатьВыборЭлемента(Оповещение, "Выберите способ доставки");

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

&НаКлиенте

Процедура ПослеВыбораСпособа(ВыбранныйЭлемент, ДопПараметры) Экспорт

Если ВыбранныйЭлемент = Неопределено Тогда

Возврат; // пользователь отменил выбор

КонецЕсли;

СпособДоставки = ВыбранныйЭлемент.Значение;

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

Ключевой момент — обязательная проверка результата на Неопределено: если пользователь закрыл диалог без выбора, обращение к ВыбранныйЭлемент.Значение вызовет ошибку. Процедура-обработчик должна быть экспортной (директива Экспорт), иначе платформа не сможет её вызвать.

Множественный выбор с пометками

Если нужно, чтобы пользователь отметил несколько элементов, используется метод ПоказатьОтметкуЭлементов(ОписаниеОповещения, Список, Заголовок). В обработчике оповещения возвращается тот же список, и по нему проходят циклом, проверяя свойство Пометка каждого элемента.

Для Каждого Элемент Из ОтмеченныйСписок Цикл

Если Элемент.Пометка Тогда

// обработка выбранного значения Элемент.Значение

КонецЕсли;

КонецЦикла;

Выбор через меню

Для короткого набора вариантов (2–7 пунктов) удобнее ПоказатьВыборИзМеню(Оповещение, Список, ЭлементФормы) — список отображается как выпадающее меню возле указанного элемента формы, а не как отдельное окно. Это стандартный паттерн для команд «Печать», «Заполнить» и подобных.

bsl
Оповещение = Новый ОписаниеОповещения("ПослеВыбора", ЭтотОбъект);
Список.ПоказатьВыборЭлемента(Оповещение, "Выберите значение");

Открытие списка в обычном приложении

В обычных формах (режим обычного приложения, типовые конфигурации старших версий платформы 8.2) доступен модальный метод ВыбратьЭлемент(Заголовок, ТекущийЭлемент), который возвращает выбранный элемент списка напрямую. Код получается короче, поскольку не требует отдельной процедуры-обработчика.

ВыбранныйЭлемент = Список.ВыбратьЭлемент("Выберите склад");

Если ВыбранныйЭлемент <> Неопределено Тогда

Склад = ВыбранныйЭлемент.Значение;

КонецЕсли;

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

Способы показа списка

ПоказатьВыборЭлемента

Управляемое приложение, выбор одного элемента в отдельном окне. Требует описания оповещения.

ПоказатьОтметкуЭлементов

Управляемое приложение, множественный выбор с флажками. Результат — весь список с пометками.

ПоказатьВыборИзМеню

Компактное меню у элемента формы, подходит для 2–7 коротких вариантов.

ВыбратьЭлемент

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

Открытие формы списка справочника или документа

Частая путаница: под «открыть список» понимают не объект СписокЗначений, а форму списка прикладного объекта — например, показать пользователю список контрагентов с отбором. Это делается методом ОткрытьФорму() с указанием имени формы и структуры параметров.

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Новый Структура("Поставщик", Истина));

ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы);

Если форма открывается для выбора значения, добавьте параметр РежимВыбора = Истина и укажите владельца формы (обычно поле ввода), чтобы выбранное значение автоматически вернулось в него. Для программной обработки результата выбора вместо этого передают описание оповещения о закрытии.

Открытие списка с отбором для выбора
  1. 1
    Создайте структуру параметров и вложите в неё структуру Отбор с нужными полями
  2. 2
    Добавьте параметр РежимВыбора = Истина, если форма открывается для выбора значения
  3. 3
    Вызовите ОткрытьФорму с именем формы списка, параметрами и владельцем
  4. 4
    Проверьте, что отбор применился: в открывшейся форме видны только нужные записи

Типичные ошибки и как их избежать

Самая распространённая ошибка — вызов модального ВыбратьЭлемент() в управляемом приложении. Платформа либо выдаёт ошибку «Использование модальных окон запрещено», либо код молча не срабатывает в зависимости от настроек режима использования модальности. Решение — переписать логику на асинхронные методы с оповещениями.

Вторая группа ошибок связана с обработчиками оповещений: отсутствие директивы Экспорт у процедуры-обработчика, обращение к ВыбранныйЭлемент.Значение без проверки на Неопределено, попытка получить результат выбора сразу после строки вызова — асинхронный метод возвращает управление мгновенно, а выбор приходит позже.

Третья группа — ошибки наполнения: дубли значений, из-за которых пользователь видит одинаковые строки; отсутствие представлений, когда вместо понятного текста показывается техническое значение; слишком длинные списки без сортировки, в которых невозможно ничего найти. Если вариантов больше 15–20, лучше открывать форму выбора справочника с поиском, а не список значений.

Типичные ошибки
01
Вызов ВыбратьЭлемент() в управляемом приложении — ошибка модальности, выбор не работает
02
Нет директивы Экспорт у процедуры-обработчика оповещения — платформа не может её вызвать
03
Обращение к результату без проверки на Неопределено — ошибка при отмене выбора пользователем
04
Ожидание результата сразу после ПоказатьВыборЭлемента — асинхронный метод возвращает управление до выбора
05
Дубли значений в списке — пользователь не может отличить одинаковые строки

Проверка результата и отладка

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

Если список формируется на сервере, а открывается на клиенте, убедитесь, что объект корректно передаётся: в управляемых формах серверные вызовы должны быть вынесены в серверные процедуры с директивой &НаСервере, а готовый список возвращается в клиентскую процедуру, где и показывается.

Контрольные точки

Как проверить результат

Выбор элемента
Норма

Обработчик оповещения получает элемент, значение доступно через .Значение

Тревожный признак

Обработчик не вызывается или приходит Неопределено при подтверждённом выборе

Отмена выбора
Норма

В обработчик приходит Неопределено, код корректно завершается

Тревожный признак

Ошибка «Поле объекта не обнаружено» при обращении к .Значение

Повторное открытие
Норма

Список содержит те же элементы, без дублей

Тревожный признак

Элементы накапливаются, появляются повторы

Итог

Что важно запомнить

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

Частые вопросы

Как открыть список значений с уже выбранным (текущим) элементом?

Передайте четвёртым параметром метода ПоказатьВыборЭлемента элемент списка, который нужно подсветить: предварительно найдите его через Список.НайтиПоЗначению(ТекущееЗначение). Если элемент не найден, диалог откроется без выделенной строки.

Почему в тонком клиенте метод ВыбратьЭлемент не работает?

Если конфигурация запущена в режиме управляемого приложения, модальные методы заблокированы настройкой «Режим использования модальности» в свойствах конфигурации. Даже при разрешённой модальности рекомендуется переписать код на ПоказатьВыборЭлемента — модальный режим считается устаревшим и не поддерживается в веб-клиенте.

Как передать в обработчик оповещения дополнительные параметры?

Укажите их третьим параметром конструктора: Новый ОписаниеОповещения("ИмяПроцедуры", ЭтотОбъект, ДопПараметры). В процедуре-обработчике они придут вторым аргументом. Так передают, например, имя реквизита, в который нужно записать выбранное значение.

Можно ли открыть список значений на сервере?

Нет. Любой диалог с пользователем выполняется только на клиенте. Серверная процедура может сформировать и вернуть список, но показать его должна клиентская процедура с директивой &НаКлиенте.

Чем отличается СписокЗначений от массива при выборе?

Массив нельзя напрямую показать пользователю в диалоге выбора — у него нет методов ПоказатьВыборЭлемента и представлений. Для диалога массив сначала загружают в список значений через Список.ЗагрузитьЗначения(Массив), при необходимости затем заполняя представления в цикле.

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

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