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

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

Список значений в 1С: что это и как его использовать

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

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

Тип называется СписокЗначений (ValueList в английском синтаксисе) и доступен как на сервере, так и на клиенте, в тонком и веб-клиенте. Это делает его одним из немногих типов коллекций, которые можно свободно передавать между клиентом и сервером без сериализации во временное хранилище. Разработчик встречается со списком значений уже на первых этапах: при настройке отбора в динамическом списке, при вызове ВыбратьИзМеню или при работе с параметром «Список значений» в СКД.

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

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

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

Элементы списка индексируются с нуля, как в массиве. Обратиться к элементу можно по индексу через метод Получить() или оператор квадратных скобок. Количество элементов возвращает метод Количество(). Порядок элементов сохраняется в том виде, в каком они добавлялись, пока список не отсортирован явно.

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

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

Создание выполняется стандартным конструктором. Далее список заполняется методом Добавить(), который принимает до трёх параметров: значение, представление и пометку.

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

Список.Добавить(Справочники.Номенклатура.НайтиПоКоду("000001"), "Товар А", Истина);

Список.Добавить("Произвольная строка");

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

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

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

Базовый порядок работы со списком
  1. 1
    Создайте объект: Список = Новый СписокЗначений
  2. 2
    Добавьте элементы методом Добавить() с нужными представлениями
  3. 3
    Проверьте количество: Список.Количество() должно быть больше нуля
  4. 4
    Обойдите список циклом Для Каждого Элемент Из Список
  5. 5
    Проверьте результат через Сообщить(Элемент.Значение) или отладчик

Основные методы: поиск, сортировка, обход

Обход списка выполняется циклом Для Каждого ... Из ... Цикл либо классическим циклом по индексу, когда нужен доступ к позиции элемента. Внутри цикла доступны все свойства элемента: значение, представление, пометка.

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

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

Сообщить(Элемент.Представление);

КонецЕсли;

КонецЦикла;

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

Методы работы с пометками — ОтметитьЭлементы(), СнятьПометки(), ПометитьВсе() — удобны для пакетного управления флажками в диалогах. Копия списка создаётся методом Скопировать(); простое присваивание переменной копирует лишь ссылку на тот же объект, и изменения затронут обе переменные.

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

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

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

КритерийСписок значенийМассивТаблица значений
Структура элементаЗначение, представление, пометка, картинкаТолько значениеСтрока с колонками
Тонкий/веб-клиентДоступенДоступенНедоступен
Интерактивный выборВстроенные диалоги с пометкамиНетНет
СортировкаПо значению или представлениюНет встроеннойПо любым колонкам
Типичное применениеОтборы, меню, параметры СКДПростые наборы однотипных данныхТабличные данные, выгрузки

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

Что выбрать для задачи

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

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

Массив

Быстрые однотипные коллекции внутри алгоритма; нет представлений и пометок

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

Многоколоночные данные на сервере; не передаётся на тонкий клиент напрямую

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

Отборы в динамических списках и отчётах

Параметр отбора «В списке» в СКД и динамических списках принимает именно список значений. Это стандартный способ передать в запрос несколько ссылок: например, вывести продажи по выбранным контрагентам. При установке отбора программно список присваивается параметру компоновки, а вид сравнения устанавливается в ВидСравненияКомпоновкиДанных.ВСписке.

Диалоги выбора и меню

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

Реквизиты форм и передача данных

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

Ограничения и когда список значений не подходит

Список значений — плоский: в нём нет колонок, группировок и иерархии. Если нужно хранить связанные данные (например, товар, количество и цену), используйте таблицу значений или массив структур. Попытка эмулировать колонки через представление с разделителями усложняет поддержку и приводит к ошибкам при разборе строк.

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

Ещё одно ограничение — сортировка разнотипных значений. Если в списке смешаны строки и числа, результат сортировки зависит от правил сравнения типов платформы и может не совпасть с ожиданиями. Перед сортировкой приводите значения к одному типу.

Как проверить корректность работы со списком

Быстрая проверка выполняется через отладчик: поставьте точку останова после заполнения списка и посмотрите содержимое в табло — там видны значения, представления и пометки каждого элемента. Для программной проверки полезно контролировать количество элементов до и после операций фильтрации.

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

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

Количество элементов после заполнения
Норма

Совпадает с числом добавленных элементов

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

Меньше ожидаемого — проверьте условия добавления в цикле

Результат НайтиПоЗначению
Норма

Возвращает элемент списка

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

Неопределено — значение отсутствует или отличается по типу

Пометки после ОтметитьЭлементы
Норма

Флажки соответствуют выбору пользователя

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

Все пометки сброшены — диалог был отменён

Список после передачи на сервер
Норма

Значения и представления сохранены

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

Пустой список — проверьте директивы компиляции и параметры процедуры

При работе с отборами СКД проверяйте, что параметр действительно получил список: выведите ТипЗнч(ЗначениеПараметра) в сообщение. Частая ситуация — в параметр передали одиночное значение вместо списка, и отбор «В списке» работает некорректно или не работает вовсе.

Итог

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

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

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

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

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

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

Да, тип СписокЗначений сериализуется платформой и свободно передаётся между клиентскими и серверными процедурами в тонком и веб-клиенте. Это одно из его главных преимуществ перед таблицей значений.

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

Обойдите список циклом по индексу с конца к началу и удаляйте элементы без пометки методом Удалить(). Обход с конца обязателен: при удалении с начала индексы смещаются, и часть элементов будет пропущена.

Почему НайтиПоЗначению не находит ссылку, которая точно есть в списке?

Чаще всего причина в несовпадении типов: например, ищется строка с кодом, а в списке хранится ссылка, или ссылки относятся к разным видам справочников. Проверьте типы через ТипЗнч() для искомого значения и элементов списка.

Как отсортировать список в убывающем порядке?

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

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

Напрямую — нет, запрос принимает список только как параметр для условия «В (&Список)». Для этого список передаётся через УстановитьПараметр, при этом его значения должны быть одного сравнимого типа, иначе запрос вернёт ошибку или неполный результат.