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

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

Как создать список значений в 1С: инструкция с примерами кода

Как создать список значений в 1С 8.3: методы Добавить, ЗагрузитьЗначения, работа с элементами, пометки и представления. Примеры кода на встроенном языке.

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

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

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

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

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

Типичные сценарии применения:

  • диалог выбора одного варианта из нескольких — метод ВыбратьЭлемент();
  • диалог с флажками, где пользователь отмечает несколько позиций — метод ОтметитьЭлементы();
  • передача списка ссылок в параметр запроса или отбор компоновки данных;
  • хранение настроек пользователя, где важен порядок и видимое название каждой позиции;
  • промежуточное накопление данных перед выводом в табличное поле формы.

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

Создание списка конструктором и методом Добавить

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

// Создаём пустой список

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

// Добавляем элементы: значение, представление, пометка

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

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

СписокСкладов.Добавить("Все", "Все склады без отбора");

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

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

Загрузка списка из массива и выгрузка обратно

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ЭтоГруппа = ЛОЖЬ";

МассивТоваров = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

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

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

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

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

Работа с элементами: поиск, вставка, удаление

После создания списка с ним работают через методы коллекции. Наиболее востребованные:

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

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

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

КонецЕсли;

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

Типичные ошибки
01
Добавление элементов без проверки дублей — в диалоге выбора появляются одинаковые строки
02
Обращение к элементу по индексу без проверки Количество() — ошибка «Индекс находится за границами массива» на пустом списке
03
Сравнение значений элементов оператором = для ссылок разных типов — поиск по значению не находит элемент из-за несовпадения типов

Интерактивный выбор и работа с пометками

Главное преимущество списка значений — встроенные диалоги. Метод ВыбратьЭлемент() показывает список и возвращает выбранный элемент, а ОтметитьЭлементы() открывает окно с флажками и возвращает Истина, если пользователь нажал «ОК».

ВыбранныйЭлемент = СписокСкладов.ВыбратьЭлемент("Укажите склад");

Если ВыбранныйЭлемент <> Неопределено Тогда

Сообщить("Выбрано: " + ВыбранныйЭлемент.Значение);

КонецЕсли;

В управляемых формах синхронные вызовы диалогов могут быть недоступны в зависимости от настроек режима использования модальности. Там применяют асинхронные варианты: ПоказатьВыборИзСписка() с описанием оповещения или Список.ПоказатьОтметкуЭлементов(). Логика та же, но результат приходит в отдельную процедуру-обработчик.

После отметки элементов пройдитесь по списку циклом и отберите помеченные:

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

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

// обработка выбранного значения

КонецЕсли;

КонецЦикла;

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

Список значений в запросах и отборах

Список значений можно передавать в запрос как параметр для условия В() — платформа сама развернёт его в набор значений. Это избавляет от конструирования длинных условий «ИЛИ».

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг

|ГДЕ Склад В (&СписокСкладов)";

Запрос.УстановитьПараметр("СписокСкладов", СписокСкладов);

Тот же приём работает в отборах динамических списков и схем компоновки данных: параметру с признаком «Доступен список значений» присваивается объект СписокЗначений, и пользователь сможет подбирать несколько значений в настройках отчёта.

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

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

Массив

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

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

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

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

Выбирайте, когда у позиции несколько полей (колонок); избыточна для простого перечня значений

Ограничения и частые ошибки

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

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

Третий распространённый случай — попытка обратиться к элементу пустого списка по индексу. Перед Получить(0) всегда проверяйте Количество() > 0, иначе получите ошибку выполнения.

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

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

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

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

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

Список пуст или в представлениях отображаются служебные строки вместо наименований

Поиск значения
Норма

НайтиПоЗначению возвращает элемент, пометка и представление корректны

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

Возвращается Неопределено при заведомо существующем значении — проверьте типы

Диалог выбора
Норма

ВыбратьЭлемент возвращает элемент после клика пользователя

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

Возвращается Неопределено — пользователь отменил выбор или диалог не открылся из-за режима модальности

Итоговая логика проста: создали объект, наполнили, при необходимости проставили представления и пометки, показали пользователю или передали в запрос, проверили результат. Соблюдение этой последовательности и контроль типов значений избавляют от большинства ошибок при работе со списками значений.

Итог

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

Список значений создаётся конструктором Новый СписокЗначений, наполняется методами Добавить и ЗагрузитьЗначения, показывается пользователю через ВыбратьЭлемент и ОтметитьЭлементы. Контролируйте дубли, типы значений и пустоту списка перед обращением по индексу.

Частые вопросы

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

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

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

Вызовите метод Очистить() — он удаляет все элементы, оставляя сам объект доступным для повторного наполнения. Альтернатива — присвоить переменной новый пустой список через Новый СписокЗначений, но если на старый список есть другие ссылки (например, он привязан к реквизиту формы), они продолжат указывать на заполненный объект.

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

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

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

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

Как показать список выбора в управляемой форме, если модальные вызовы запрещены?

Используйте асинхронный метод ПоказатьВыборИзСписка() глобального контекста: первым параметром передаётся описание оповещения с именем процедуры-обработчика, вторым — сам список. Результат выбора придёт в указанную процедуру в виде выбранного элемента. Аналогично для пометок есть метод ПоказатьОтметкуЭлементов() у самого списка значений.

Как отсортировать список значений по алфавиту?

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