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

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

Список значений в 1С: что это и как с ним работать

Что такое список значений в 1С, чем отличается от массива и таблицы значений, как создать, заполнить, отсортировать и выбрать элемент — с примерами кода и типичными ошибками.

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

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

Ниже разберём, чем список значений отличается от массива и таблицы значений, как его создать и заполнить, как организовать выбор пользователем, где он применяется в типовых механизмах (динамические списки, СКД, отборы) и какие ошибки встречаются чаще всего.

Что такое список значений и из чего он состоит

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

Доступ к элементам возможен по индексу (нумерация с нуля): Список[0].Значение. Перебор выполняется циклом Для Каждого Элемент Из Список Цикл. У списка есть методы Количество(), НайтиПоЗначению(), Индекс(), которые упрощают поиск.

Чем список значений отличается от массива и таблицы значений

Выбор коллекции влияет и на удобство кода, и на доступные механизмы. Массив — простая индексированная коллекция без представлений и пометок; он легче, быстрее заполняется и свободно передаётся между клиентом и сервером. Таблица значений — двумерная структура с колонками, пригодная для выгрузки запросов и построения отчётов. Список значений занимает нишу между ними: одномерный, но с «человеческим лицом» — представлениями и пометками.

КритерийМассивСписок значенийТаблица значений
Структура элементаТолько значениеЗначение, представление, пометка, картинкаСтрока с набором колонок
Диалог выбора пользователемНетДа, штатноНет
Пометки (флажки)НетДаЧерез отдельную колонку
Использование в отборах СКД и динамических списковНетДа, типовой механизмНет
Передача клиент–сервер в управляемой формеДаЧерез реквизит формы или преобразованиеЧерез реквизит формы

Практическое правило: если коллекция нужна только внутри алгоритма — берите массив; если её должен увидеть или отметить пользователь либо она уходит в отбор — берите список значений; если данные многоколоночные — таблицу значений.

Сравнение вариантов

Массив

Подходит для служебных вычислений и обмена клиент–сервер; не имеет представлений и диалогов выбора.

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

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

Таблица значений

Подходит для многоколоночных данных и выгрузок запросов; избыточна для простого перечня вариантов.

Как создать и заполнить список значений

Базовые операции — добавление, вставка, удаление и очистка. Метод Добавить() принимает значение, необязательное представление, пометку и картинку. Если представление не указано, оно формируется из значения автоматически.

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

Список.Добавить("Москва", "г. Москва", Истина);

Список.Добавить("Санкт-Петербург", "г. Санкт-Петербург", Ложь);

Список.Вставить(0, "Казань", "г. Казань");

// Заполнение из массива

МассивСкладов = Новый Массив;

МассивСкладов.Добавить(Склад1);

Список.ЗагрузитьЗначения(МассивСкладов);

// Поиск

Найденный = Список.НайтиПоЗначению("Москва");

Если Найденный <> Неопределено Тогда

Список.Удалить(Найденный);

КонецЕсли;

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

Сортировка и поиск элементов

Список поддерживает сортировку методами СортироватьПоЗначению() и СортироватьПоПредставлению() с указанием направления через НаправлениеСортировки.Возр или Убыв. Сортировка по значению корректно работает, когда значения одного сравнимого типа (строки, числа, даты, ссылки одного вида); смешанные типы могут давать неожиданный порядок.

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

Порядок создания заполненного списка
  1. 1
    Создайте объект: Новый СписокЗначений.
  2. 2
    Добавьте элементы методом Добавить() с представлением и пометкой.
  3. 3
    При необходимости отсортируйте: СортироватьПоПредставлению().
  4. 4
    Проверьте результат: выведите Количество() и переберите элементы циклом.
  5. 5
    Перед передачей на сервер преобразуйте в массив через ВыгрузитьЗначения().

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

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

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

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

В обработчике оповещения проверяйте, что пользователь не отменил выбор: при отмене в обработчик приходит Неопределено. Для отметки элементов после закрытия диалога переберите список и отберите строки с Пометка = Истина — это и есть выбранные пользователем варианты.

Где список значений применяется в типовых механизмах

Наиболее частое прикладное использование — отборы. В динамических списках и отчётах на СКД условие «В списке» принимает именно список значений. Такой подход позволяет пользователю выбрать несколько контрагентов, складов или номенклатурных позиций одним отбором.

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

СписокСкладов.Добавить(СкладОсновной);

СписокСкладов.Добавить(СкладРезервный);

ЭлементОтбора = ДинамическийСписок.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

ЭлементОтбора.ПравоеЗначение = СписокСкладов;

ЭлементОтбора.Использование = Истина;

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

Перед передачей отбора в запрос из списка значений выгрузите массив методом ВыгрузитьЗначения() и передайте его параметром — оператор В (&amp;Список) в запросе корректно работает именно с массивом или таблицей, а не с объектом СписокЗначений.
ПЗ
Практическое замечание

Типичные ошибки и ограничения

Первая группа ошибок связана с передачей данных. Попытка передать список значений в серверную процедуру «за раз» из клиентского кода управляемой формы приводит к ошибке преобразования данных — решение: хранить список в реквизите формы с соответствующим типом либо передавать массив значений.

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

Типичные ошибки
01
Присваивание списка другой переменной вместо Скопировать() — изменения затрагивают обе переменные.
02
Передача СписокЗначений между клиентом и сервером напрямую — ошибка сериализации; используйте реквизит формы или массив.
03
Использование модальных ВыбратьЭлемент() в управляемом приложении — код не выполняется; нужны асинхронные методы с оповещением.
04
Поиск по представлению через НайтиПоЗначению() — метод сравнивает только значения, поиск по представлению делается перебором.
05
Сортировка списка со смешанными типами значений — непредсказуемый порядок элементов.

Ограничения, о которых стоит помнить: список значений не является типом, доступным для реквизитов объектов конфигурации (справочников, документов) — там для множественных данных используются табличные части. Также значения типа Неопределено в списке допустимы, но могут ломать сортировку и отборы, поэтому их лучше отфильтровывать при заполнении.

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

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

Заполнение списка
Норма

Количество() соответствует ожиданию, у элементов заданы значение и представление

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

Элементы без представлений или с Неопределено в значении

Выбор пользователем
Норма

В обработчике оповещения приходит выбранный элемент, отмена обрабатывается через Неопределено

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

Код после вызова диалога выполняется сразу, не дожидаясь выбора

Отбор динамического списка
Норма

Список отфильтрован по всем отмеченным значениям, условие ВСписке активно

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

Отбор не применяется или фильтрует только по одному значению

Часто задаваемые вопросы

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

Да, тип значения элемента не ограничен: в одном списке могут быть ссылки на справочники, документы, строки и числа. Однако смешанные типы затрудняют сортировку и поиск, поэтому на практике список обычно заполняют однородными значениями.

Как получить только отмеченные пользователем элементы?

После диалога отметки переберите список циклом и проверяйте свойство Пометка: если оно равно Истина, добавляйте значение элемента в результирующий массив. Готового метода «выгрузить отмеченные» у объекта нет.

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

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

Чем заменить список значений при работе в запросе?

В запрос передают массив (полученный методом ВыгрузитьЗначения()) или таблицу значений через временную таблицу. Условие записывается как «Поле В (&Параметр)», где параметр — массив значений.

Как быстро проверить, есть ли значение в большом списке?

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

Работает ли список значений в веб-клиенте?

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

Итог

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

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