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