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