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