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