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

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

Как выгрузить колонку таблицы значений в массив в 1С

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

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

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

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

Метод ВыгрузитьКолонку: синтаксис и базовый пример

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

Базовый пример для таблицы значений, полученной из запроса:

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

ТЗ = Запрос.Выполнить().Выгрузить();

// Выгружаем колонку "Ссылка" в массив

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

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

Аналогично метод работает с табличной частью документа. Например, получить массив номенклатуры из табличной части «Товары»:

МассивТоваров = ДокументОбъект.Товары.ВыгрузитьКолонку("Номенклатура");

Как получить только уникальные значения колонки

Метод ВыгрузитьКолонку() возвращает все значения, включая дубли. Если в таблице сто строк с одинаковым контрагентом, в массиве будет сто одинаковых ссылок. Для получения уникальных значений используется связка с методом Свернуть().

Логика такая: сначала копируете таблицу (чтобы не испортить исходную), сворачиваете её по нужной колонке, затем выгружаете колонку. Метод Свернуть() группирует строки и оставляет по одной строке на каждую уникальную комбинацию значений указанных колонок.

// Копируем таблицу, чтобы не изменить исходную

ТЗУникальные = ТЗ.Скопировать();

ТЗУникальные.Свернуть("Контрагент");

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

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

Выгрузка колонки с фильтрацией и преобразованием через цикл

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

МассивРезультат = Новый Массив;

Для Каждого СтрокаТЗ Из ТЗ Цикл

Если СтрокаТЗ.Сумма > 0 Тогда

МассивРезультат.Добавить(СтрокаТЗ.Номенклатура);

КонецЕсли;

КонецЦикла;

Такой подход даёт полный контроль: можно пропускать пустые значения, проверять типы, добавлять в массив структуры вместо простых значений. Для поиска дублей внутри цикла используют проверку Если МассивРезультат.Найти(Значение) = Неопределено Тогда, но на больших таблицах это работает медленно — каждый вызов Найти() перебирает массив заново.

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

Соответствие = Новый Соответствие;

Для Каждого СтрокаТЗ Из ТЗ Цикл

Соответствие.Вставить(СтрокаТЗ.Контрагент, Истина);

КонецЦикла;

МассивУникальных = Новый Массив;

Для Каждого КлючЗначение Из Соответствие Цикл

МассивУникальных.Добавить(КлючЗначение.Ключ);

КонецЦикла;

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

ВыгрузитьКолонку()

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

Свернуть + ВыгрузитьКолонку

Подходит для получения уникальных значений. Требует копии таблицы, так как Свернуть разрушает исходную структуру.

Обход циклом

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

Выгрузка колонки из табличной части и результата запроса

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

Табличная часть документа или справочника

У табличных частей метод ВыгрузитьКолонку() доступен напрямую, без предварительной выгрузки в таблицу значений. Это удобно для передачи массива в запрос в качестве параметра:

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

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

"ВЫБРАТЬ

| Цены.Цена КАК Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК Цены

|ГДЕ

| Цены.Номенклатура В (&СписокНоменклатуры)";

Запрос.УстановитьПараметр("СписокНоменклатуры",

ДокументОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));

Результат запроса без промежуточной таблицы

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

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

МассивЗначений = Новый Массив;

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

МассивЗначений.Добавить(Выборка.Ссылка);

КонецЦикла;

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

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

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

Если МассивСсылок.Количество() = 0 Тогда

ВызватьИсключение "Таблица не содержит данных для выгрузки";

КонецЕсли;

// Проверка типа первого элемента

Если ТипЗнч(МассивСсылок[0]) <> Тип("СправочникСсылка.Номенклатура") Тогда

// Обработка несоответствия типа

КонецЕсли;

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

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

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

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

Совпадает с количеством строк таблицы (для полной выгрузки)

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

Массив пуст или элементов меньше, чем строк — проверьте имя колонки и заполненность таблицы

Тип элементов
Норма

Все элементы ожидаемого типа

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

Присутствуют Неопределено или значения других типов

Дубли
Норма

Повторы допустимы по логике задачи или устранены через Свернуть

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

Неожиданные дубли при передаче в запрос с условием В(&amp;Параметр)

Типичные ошибки при выгрузке колонки

Самая частая ошибка — неверное имя колонки. Если колонки с указанным именем не существует, платформа выдаёт ошибку «Колонка не обнаружена». Имя чувствительно к точности написания, хотя и не к регистру букв. Особенно внимательно проверяйте имена колонок, полученных из запроса с псевдонимами.

Вторая распространённая проблема — попытка выгрузить колонку из результата запроса напрямую, минуя выгрузку в таблицу значений. У объекта «РезультатЗапроса» метода ВыгрузитьКолонку() нет — сначала нужно вызвать Выгрузить() или Выбрать().

Третья группа ошибок связана с производительностью: выгрузка колонки из таблицы на сотни тысяч строк, когда из неё потом нужны только уникальные значения, расходует память впустую. В таких случаях лучше сразу получать уникальные значения запросом с РАЗЛИЧНЫЕ или СГРУППИРОВАТЬ ПО.

Типичные ошибки
01
Опечатка в имени колонки — ошибка «Колонка не обнаружена» при выполнении; сверяйте имя с описанием колонок таблицы
02
Вызов ВыгрузитьКолонку() у результата запроса без Выгрузить() — метод отсутствует, код падает с ошибкой
03
Свернуть() у исходной таблицы вместо копии — безвозвратная потеря строк и колонок, нужных дальше по алгоритму
04
Передача массива с дублями в параметр запроса — лишняя нагрузка и неочевидные проблемы с производительностью

Производительность и ограничения метода

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

Если конечная цель — передать список значений в запрос, рассмотрите альтернативу: передать в запрос саму таблицу значений через временную таблицу (ПОМЕСТИТЬ) и соединить её с нужными данными. Это часто эффективнее, чем условие В(&Массив) с огромным списком.

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

Маршрут решения

Как выбрать действие

Нужны все значения колонки без измененийИспользуйте ВыгрузитьКолонку(ИмяКолонки)
Нужны только уникальные значенияСкопируйте таблицу, вызовите Свернуть(ИмяКолонки), затем ВыгрузитьКолонку
Нужна фильтрация или преобразование значенийОбойдите таблицу циклом и заполните массив вручную
Данные ещё не получены и нужен только список значенийПолучите их запросом с РАЗЛИЧНЫЕ и обойдите выборку, не создавая таблицу

Итоговая последовательность действий

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

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

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

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

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

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

Напрямую — нет, у объекта «РезультатЗапроса» такого метода нет. Либо вызовите Выгрузить() и затем ВыгрузитьКолонку(), либо обойдите выборку через Выбрать() и заполните массив в цикле — второй вариант экономичнее по памяти.

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

Используйте метод ЗагрузитьКолонку() у списка значений: СписокЗначений.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("ИмяКолонки")) — сначала получите массив, затем загрузите его в список.

Что вернёт ВыгрузитьКолонку, если таблица пустая?

Пустой массив. Ошибки не возникает, поэтому перед дальнейшей обработкой стоит проверить Массив.Количество() = 0, чтобы не передать пустой параметр в запрос или функцию.

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

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

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

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

Что делать, если появляется ошибка «Колонка не обнаружена»?

Проверьте точное имя колонки через ТЗ.Колонки.Найти("ИмяКолонки") или в отладчике. Частая причина — псевдоним в запросе отличается от ожидаемого имени, либо колонка не была добавлена при программном создании таблицы.