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

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

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

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

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

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

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

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

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

Типичные сценарии применения: отбор в отчётах СКД (параметр с типом «СписокЗначений» позволяет выбрать несколько контрагентов сразу), диалог выбора из списка через ВыбратьЭлемент() или ОтметитьЭлементы(), передача набора ссылок между процедурами, фильтрация таблиц значений методом НайтиСтроки() в связке со списком.

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

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

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

Список.Добавить("Перемещение", "Перемещение товаров", Истина);

Список.Добавить("Реализация", "Реализация товаров и услуг");

Список.Добавить("Поступление"); // представление сформируется автоматически

Обратите внимание на третий параметр: пометка по умолчанию равна Ложь. Если список дальше показывается пользователю через ОтметитьЭлементы() и нужно, чтобы часть пунктов была отмечена заранее, — передавайте Истина явно. Это частая причина вопроса «почему все флажки сняты».

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

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

Массовое заполнение: ЗагрузитьЗначения и вставка элементов

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

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

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

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

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

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

Для точечной вставки в середину списка используется Вставить(Индекс, Значение), а для изменения существующего элемента — обращение по индексу: Список[0].Пометка = Истина. Обратная операция — выгрузка значений обратно в массив методом ВыгрузитьЗначения() — удобна, когда дальше данные обрабатываются кодом, работающим именно с массивами.

Заполнение списка из запроса и таблицы значений

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

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

Запрос.Текст =

"ВЫБРАТЬ

| Склады.Ссылка КАК Ссылка

|ИЗ

| Справочник.Склады КАК Склады

|ГДЕ

| НЕ Склады.ПометкаУдаления";

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

КонецЦикла;

Альтернатива без цикла: выгрузить результат запроса в таблицу значений, затем выгрузить колонку в массив и загрузить его в список: Список.ЗагрузитьЗначения(ТаблицаРезультата.ВыгрузитьКолонку("Ссылка")). Такой вариант короче и обычно быстрее на больших выборках, но не позволяет задать представление и пометку каждому элементу.

Если список нужен для параметра запроса с оператором В (&Список), помните: запрос принимает и список значений, и массив. Дубли в списке не вызовут ошибку, но замедлят выполнение — перед передачей в запрос лишние повторы лучше убрать.

Удаление дублей, сортировка и поиск в списке

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

Контроль = Новый Соответствие;

Для Каждого Строка Из ТаблицаИсточник Цикл

Если Контроль[Строка.Ссылка] = Неопределено Тогда

Список.Добавить(Строка.Ссылка);

Контроль.Вставить(Строка.Ссылка, Истина);

КонецЕсли;

КонецЦикла;

Для сортировки есть метод СортироватьПоЗначению() и СортироватьПоПредставлению() — оба принимают необязательное направление. Найти элемент можно методом НайтиПоЗначению(Значение): он вернёт элемент списка или Неопределено, если значения нет. Перед обращением к элементу по индексу всегда проверяйте Количество(), иначе при пустом списке получите ошибку «Индекс находится за границами массива».

Типичные ошибки
01
Путать значение и представление: в отбор уходит строка представления вместо ссылки — сравнение в запросе не срабатывает
02
Ожидать, что пометка по умолчанию Истина — по умолчанию она Ложь, и диалог ОтметитьЭлементы показывает пустые флажки
03
Использовать ЗагрузитьЗначения для дополнения списка — метод стирает уже добавленные элементы
04
Обращаться к Список[0] без проверки Количество() — на пустом списке возникает ошибка

Список значений на форме и в отчётах СКД

На управляемой форме список значений часто используется как реквизит формы. Чтобы пользователь мог редактировать его вручную, добавьте реквизит типа «СписокЗначений» и выведите элемент формы «Таблица» либо используйте поле с кнопкой выбора из списка. Для диалога множественного выбора применяется Список.ОтметитьЭлементы("Выберите склады") — после закрытия диалога пометки элементов отражают выбор пользователя, и дальше в обработку идут только отмеченные элементы.

В отчётах на СКД список значений — стандартный тип параметра множественного отбора. В настройках параметра укажите «Доступные типы» — ссылку нужного справочника, и отметьте параметр как список. В тексте запроса отбора условие записывается как ГДЕ Номенклатура В (&СписокНоменклатуры). Если параметр не заполнен пользователем, условие отбора лучше делать необязательным через конструкцию с фигурными скобками {ГДЕ (...)}, иначе пустой список обнулит результат отчёта.

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

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

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

Список.Количество() соответствует числу добавленных строк источника

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

Количество нулевое или меньше ожидаемого — проверьте условие запроса и цикл

Тип значений
Норма

ТипЗнч(Список[0].Значение) даёт ожидаемый тип, например ссылку справочника

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

В значениях строки представлений — в запросах и отборах сравнение не сработает

Пометки
Норма

У предвыбранных элементов Пометка = Истина

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

Все пометки Ложь — третий параметр Добавить() не передан

Ограничения и безопасная работа со списком

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

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

Изменения списка в пользовательском режиме не затрагивают данные информационной базы — список сам по себе ничего не записывает. Риск появляется только там, где список дальше используется как источник для записи объектов: перед обработкой проверяйте типы значений и наличие пометок, чтобы не записать лишнего.

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

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

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

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

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

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

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

Можно ли заполнить список значений из табличной части документа?

Да. Переберите табличную часть в цикле: Для Каждого СтрокаТЧ Из Документ.Товары Цикл Список.Добавить(СтрокаТЧ.Номенклатура) КонецЦикла. Если нужны только уникальные позиции, добавьте контроль дублей через соответствие.

Почему условие В (&Список) в запросе не возвращает данные?

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

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

Методом Список.Очистить() — удаляются все элементы, количество становится равным нулю. Удалить один элемент можно методом Удалить(Элемент) или Удалить(Индекс), а также через цикл с конца списка, если нужно удалить несколько элементов по условию.

Итог

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

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