Разработка и Конфигурация · 12 мин
Как открыть список значений в 1С
Как открыть список значений в 1С: методы ВыбратьЭлемент, ПоказатьВыборЭлемента, открытие формы списка справочника, примеры кода и типичные ошибки.
Список значений в 1С — универсальный объект, который используется для выбора пользователем одного или нескольких вариантов, передачи наборов данных между процедурами и организации отборов. В зависимости от задачи «открыть список значений» может означать разное: показать пользователю диалог выбора элемента из списка, открыть форму списка справочника или документа, либо программно сформировать и обработать объект СписокЗначений.
Способ открытия зависит от режима работы конфигурации. В обычном приложении (толстый клиент, управляемые формы отключены) применяется модальный метод ВыбратьЭлемент(). В управляемом приложении модальные вызовы запрещены или нежелательны, поэтому используются асинхронные методы ПоказатьВыборЭлемента() и ПоказатьВыборИзМеню() с описанием оповещения. Если речь идёт о списке справочника или документа, открывается форма списка через ОткрытьФорму() с параметрами.
Ниже разобраны все основные сценарии: программное создание списка значений, открытие диалога выбора в обычном и управляемом приложении, открытие формы списка с отбором, а также типичные ошибки, из-за которых список не открывается или выбор теряется.
Что такое список значений и когда его открывают
СписокЗначений — это служебный объект платформы 1С, представляющий коллекцию элементов, где каждый элемент содержит значение, представление (текст для пользователя), признак пометки и картинку. Объект создаётся программно, наполняется методом Добавить() и передаётся в диалоги выбора или в параметры форм.
Открыть список значений требуется в трёх типовых ситуациях. Первая — пользователю нужно выбрать один вариант из заранее подготовленного набора, например способ доставки или вариант округления цены. Вторая — нужен множественный выбор с пометками, например выбор нескольких складов для отчёта. Третья — требуется открыть не сам объект СписокЗначений, а форму списка справочника или документа, что решается другими средствами.
Создание и наполнение списка значений
Прежде чем открывать список, его нужно сформировать. Объект создаётся конструктором Новый СписокЗначений, элементы добавляются методом Добавить(Значение, Представление, Пометка). Представление можно опустить — тогда пользователь увидит стандартное строковое представление значения.
Список = Новый СписокЗначений;
Список.Добавить("Курьер", "Доставка курьером");
Список.Добавить("Самовывоз", "Самовывоз со склада");
Список.Добавить("ТК", "Транспортная компания", Истина);
Третий параметр метода Добавить устанавливает пометку элемента — она важна при множественном выборе, когда пользователь отмечает нужные строки флажками. Для сортировки перед показом применяется Список.СортироватьПоПредставлению(), для поиска элемента — НайтиПоЗначению().
Учтите ограничение: список значений нельзя напрямую передать между клиентом и сервером в некоторых контекстах тонкого и веб-клиента без сериализации, а также он не хранится в базе данных как самостоятельный объект — для хранения его обычно помещают в хранилище значения.
Открытие списка в управляемом приложении
В управляемых формах модальные окна блокируются платформой, поэтому выбор организуется асинхронно. Основной метод — ПоказатьВыборЭлемента(ОписаниеОповещения, Список, Заголовок, ТекущийЭлемент). Результат приходит не как возвращаемое значение, а в отдельную процедуру, указанную в описании оповещения.
&НаКлиенте
Процедура ВыбратьСпособ(Команда)
Список = Новый СписокЗначений;
Список.Добавить("Курьер", "Доставка курьером");
Список.Добавить("Самовывоз", "Самовывоз со склада");
Оповещение = Новый ОписаниеОповещения("ПослеВыбораСпособа", ЭтотОбъект);
Список.ПоказатьВыборЭлемента(Оповещение, "Выберите способ доставки");
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораСпособа(ВыбранныйЭлемент, ДопПараметры) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат; // пользователь отменил выбор
КонецЕсли;
СпособДоставки = ВыбранныйЭлемент.Значение;
КонецПроцедуры
Ключевой момент — обязательная проверка результата на Неопределено: если пользователь закрыл диалог без выбора, обращение к ВыбранныйЭлемент.Значение вызовет ошибку. Процедура-обработчик должна быть экспортной (директива Экспорт), иначе платформа не сможет её вызвать.
Множественный выбор с пометками
Если нужно, чтобы пользователь отметил несколько элементов, используется метод ПоказатьОтметкуЭлементов(ОписаниеОповещения, Список, Заголовок). В обработчике оповещения возвращается тот же список, и по нему проходят циклом, проверяя свойство Пометка каждого элемента.
Для Каждого Элемент Из ОтмеченныйСписок Цикл
Если Элемент.Пометка Тогда
// обработка выбранного значения Элемент.Значение
КонецЕсли;
КонецЦикла;
Выбор через меню
Для короткого набора вариантов (2–7 пунктов) удобнее ПоказатьВыборИзМеню(Оповещение, Список, ЭлементФормы) — список отображается как выпадающее меню возле указанного элемента формы, а не как отдельное окно. Это стандартный паттерн для команд «Печать», «Заполнить» и подобных.
Оповещение = Новый ОписаниеОповещения("ПослеВыбора", ЭтотОбъект);
Список.ПоказатьВыборЭлемента(Оповещение, "Выберите значение");Открытие списка в обычном приложении
В обычных формах (режим обычного приложения, типовые конфигурации старших версий платформы 8.2) доступен модальный метод ВыбратьЭлемент(Заголовок, ТекущийЭлемент), который возвращает выбранный элемент списка напрямую. Код получается короче, поскольку не требует отдельной процедуры-обработчика.
ВыбранныйЭлемент = Список.ВыбратьЭлемент("Выберите склад");
Если ВыбранныйЭлемент <> Неопределено Тогда
Склад = ВыбранныйЭлемент.Значение;
КонецЕсли;
Для множественного выбора в обычном приложении служит метод ОтметитьЭлементы(Заголовок), который возвращает Истина, если пользователь подтвердил выбор. Помните, что тот же код в управляемом приложении либо не выполнится, либо выдаст предупреждение о модальности — это одна из частых причин «неработающего» списка после перехода конфигурации на управляемые формы.
Способы показа списка
Управляемое приложение, выбор одного элемента в отдельном окне. Требует описания оповещения.
Управляемое приложение, множественный выбор с флажками. Результат — весь список с пометками.
Компактное меню у элемента формы, подходит для 2–7 коротких вариантов.
Только обычное приложение, модальный вызов, результат возвращается сразу.
Открытие формы списка справочника или документа
Частая путаница: под «открыть список» понимают не объект СписокЗначений, а форму списка прикладного объекта — например, показать пользователю список контрагентов с отбором. Это делается методом ОткрытьФорму() с указанием имени формы и структуры параметров.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Поставщик", Истина));
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы);
Если форма открывается для выбора значения, добавьте параметр РежимВыбора = Истина и укажите владельца формы (обычно поле ввода), чтобы выбранное значение автоматически вернулось в него. Для программной обработки результата выбора вместо этого передают описание оповещения о закрытии.
- 1Создайте структуру параметров и вложите в неё структуру Отбор с нужными полями
- 2Добавьте параметр РежимВыбора = Истина, если форма открывается для выбора значения
- 3Вызовите ОткрытьФорму с именем формы списка, параметрами и владельцем
- 4Проверьте, что отбор применился: в открывшейся форме видны только нужные записи
Типичные ошибки и как их избежать
Самая распространённая ошибка — вызов модального ВыбратьЭлемент() в управляемом приложении. Платформа либо выдаёт ошибку «Использование модальных окон запрещено», либо код молча не срабатывает в зависимости от настроек режима использования модальности. Решение — переписать логику на асинхронные методы с оповещениями.
Вторая группа ошибок связана с обработчиками оповещений: отсутствие директивы Экспорт у процедуры-обработчика, обращение к ВыбранныйЭлемент.Значение без проверки на Неопределено, попытка получить результат выбора сразу после строки вызова — асинхронный метод возвращает управление мгновенно, а выбор приходит позже.
Третья группа — ошибки наполнения: дубли значений, из-за которых пользователь видит одинаковые строки; отсутствие представлений, когда вместо понятного текста показывается техническое значение; слишком длинные списки без сортировки, в которых невозможно ничего найти. Если вариантов больше 15–20, лучше открывать форму выбора справочника с поиском, а не список значений.
Проверка результата и отладка
После внедрения кода проверьте три сценария: успешный выбор элемента, отмену выбора (кнопка «Отмена» или закрытие окна) и повторное открытие списка — данные не должны дублироваться или теряться между вызовами. Для отладки удобно временно выводить выбранное значение через Сообщить() или точку останова в обработчике оповещения.
Если список формируется на сервере, а открывается на клиенте, убедитесь, что объект корректно передаётся: в управляемых формах серверные вызовы должны быть вынесены в серверные процедуры с директивой &НаСервере, а готовый список возвращается в клиентскую процедуру, где и показывается.
Как проверить результат
Обработчик оповещения получает элемент, значение доступно через .Значение
Обработчик не вызывается или приходит Неопределено при подтверждённом выборе
В обработчик приходит Неопределено, код корректно завершается
Ошибка «Поле объекта не обнаружено» при обращении к .Значение
Список содержит те же элементы, без дублей
Элементы накапливаются, появляются повторы
Что важно запомнить
В управляемом приложении список значений открывается асинхронно: ПоказатьВыборЭлемента с описанием оповещения, результат обрабатывается в экспортной процедуре с проверкой на Неопределено. Для списков справочников и документов используется ОткрытьФорму с параметрами отбора и режимом выбора.
Частые вопросы
Как открыть список значений с уже выбранным (текущим) элементом?
Передайте четвёртым параметром метода ПоказатьВыборЭлемента элемент списка, который нужно подсветить: предварительно найдите его через Список.НайтиПоЗначению(ТекущееЗначение). Если элемент не найден, диалог откроется без выделенной строки.
Почему в тонком клиенте метод ВыбратьЭлемент не работает?
Если конфигурация запущена в режиме управляемого приложения, модальные методы заблокированы настройкой «Режим использования модальности» в свойствах конфигурации. Даже при разрешённой модальности рекомендуется переписать код на ПоказатьВыборЭлемента — модальный режим считается устаревшим и не поддерживается в веб-клиенте.
Как передать в обработчик оповещения дополнительные параметры?
Укажите их третьим параметром конструктора: Новый ОписаниеОповещения("ИмяПроцедуры", ЭтотОбъект, ДопПараметры). В процедуре-обработчике они придут вторым аргументом. Так передают, например, имя реквизита, в который нужно записать выбранное значение.
Можно ли открыть список значений на сервере?
Нет. Любой диалог с пользователем выполняется только на клиенте. Серверная процедура может сформировать и вернуть список, но показать его должна клиентская процедура с директивой &НаКлиенте.
Чем отличается СписокЗначений от массива при выборе?
Массив нельзя напрямую показать пользователю в диалоге выбора — у него нет методов ПоказатьВыборЭлемента и представлений. Для диалога массив сначала загружают в список значений через Список.ЗагрузитьЗначения(Массив), при необходимости затем заполняя представления в цикле.
Как ограничить список выбора у поля ввода без программного кода?
Для реквизита с составным или перечислимым типом используйте свойство «Список выбора» в палитре свойств элемента формы — заданные там значения будут предлагаться в выпадающем списке автоматически. Для ссылочных типов применяются параметры выбора и связи параметров выбора, настраиваемые также без кода.