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

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

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

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

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

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

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

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

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

// ТаблицаЗначений ТЗ уже заполнена

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

Для Каждого Элемент Из МассивНоменклатуры Цикл

Сообщить(Элемент);

КонецЦикла;

Имя колонки указывается точно так, как оно задано при создании таблицы или в запросе. Регистр букв встроенный язык обычно прощает, но опечатка в имени вызовет ошибку «Колонка не найдена». Если таблица получена из запроса, имена колонок совпадают с псевдонимами полей в тексте запроса.

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

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

Выгрузка колонки с обращением по индексу и объектом колонки

Помимо строки с именем, метод принимает объект типа «КолонкаТаблицыЗначений». Это удобно, когда имя колонки заранее неизвестно и определяется динамически — например, при универсальной обработке произвольных таблиц.

// Выгрузить первую колонку независимо от её имени

Колонка = ТЗ.Колонки[0];

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

// Или найти колонку по имени с проверкой

Колонка = ТЗ.Колонки.Найти("Сумма");

Если Колонка <> Неопределено Тогда

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

Иначе

Сообщить("Колонка Сумма отсутствует в таблице");

КонецЕсли;

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

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

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

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

ТаблицаКопия = ТЗ.Скопировать();

ТаблицаКопия.Свернуть("Номенклатура");

УникальнаяНоменклатура = ТаблицаКопия.ВыгрузитьКолонку("Номенклатура");

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

Для небольших таблиц допустим и ручной вариант: перебрать массив и добавлять значения в соответствие или новый массив с проверкой Найти(). Но на объёмах в десятки тысяч строк свёртка работает заметно быстрее линейного поиска в массиве.

Выгрузка нескольких колонок и выборка по условию

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

// Таблица с двумя колонками

ТаблицаСокращенная = ТЗ.Выгрузить(, "Номенклатура, Количество");

// Выгрузка только строк, удовлетворяющих отбору

СтруктураОтбора = Новый Структура("Склад", СкладОтгрузки);

ТаблицаПоСкладу = ТЗ.Выгрузить(СтруктураОтбора, "Номенклатура, Количество");

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

МассивБольшихСумм = Новый Массив;

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

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

МассивБольшихСумм.Добавить(Строка.Сумма);

КонецЕсли;

КонецЦикла;

Сравнение способов

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

Одна колонка, все строки. Самый быстрый и простой вариант, но без отбора и без удаления дубликатов.

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

Уникальные значения колонки. Требует копии таблицы, иначе исходные данные будут потеряны.

Выгрузить() с отбором

Несколько колонок и отбор на равенство. Возвращает таблицу, а не массив.

Перебор строк

Любые сложные условия и преобразования значений. Медленнее штатных методов на больших объёмах.

Передача выгруженной колонки в запрос

Частый сценарий: массив значений колонки передаётся в запрос как параметр для условия В(&Список). Запрос принимает массив напрямую, дополнительная конвертация не нужна.

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

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

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

"ВЫБРАТЬ

| Заказы.Ссылка КАК Заказ

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

|ГДЕ

| Заказы.Контрагент В (&Контрагенты)";

Запрос.УстановитьПараметр("Контрагенты", МассивКонтрагентов);

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

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

Порядок действий
  1. 1
    Убедитесь, что таблица значений заполнена: проверьте ТЗ.Количество() &gt; 0
  2. 2
    Проверьте наличие нужной колонки через ТЗ.Колонки.Найти("ИмяКолонки")
  3. 3
    Вызовите ТЗ.ВыгрузитьКолонку("ИмяКолонки") и сохраните результат в переменную
  4. 4
    При необходимости уберите дубликаты через Свернуть() на копии таблицы
  5. 5
    Используйте массив: передайте в запрос, переберите в цикле или загрузите в список значений
  6. 6
    Проверьте результат: количество элементов массива и отсутствие нежелательных пустых значений

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

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

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

Если МассивЗначений.Количество() = 0 Тогда

ВызватьИсключение "Колонка выгружена, но массив пуст — проверьте источник данных";

КонецЕсли;

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

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

Сообщить("Внимание: тип значений отличается от ожидаемого");

КонецЕсли;

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

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

Самая частая ошибка — неверное имя колонки. В таблицах, полученных из запроса, имя определяется псевдонимом поля: если в запросе написано Товары.Номенклатура КАК Товар, выгружать нужно колонку «Товар», а не «Номенклатура». Перед выгрузкой полезно вывести список колонок через цикл по ТЗ.Колонки при отладке.

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

Третья типичная проблема — свёртка исходной таблицы вместо копии. После ТЗ.Свернуть("Номенклатура") все остальные колонки и строки теряются безвозвратно в рамках текущей переменной, и последующий код, обращающийся к ним, падает или работает с усечёнными данными.

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

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

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

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

СписокВыбора.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Номенклатура"));

СписокВыбора.СортироватьПоЗначению();

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

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

Как выбрать способ

Нужна одна колонка целиком для передачи в запрос или циклИспользуйте ТЗ.ВыгрузитьКолонку("Имя")
Нужны только уникальные значения колонкиСкопируйте таблицу, примените Свернуть("Имя"), затем ВыгрузитьКолонку()
Нужно несколько колонок или отбор по равенствуИспользуйте ТЗ.Выгрузить(Отбор, "Колонка1, Колонка2")
Условие сложное: сравнения, вычисления, преобразование значенийПереберите строки циклом и добавляйте значения в массив вручную
Результат нужен пользователю для выбораЗагрузите массив в СписокЗначений через ЗагрузитьЗначения()

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

Что возвращает метод ВыгрузитьКолонку()?

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

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

Передайте в метод объект колонки: ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[Индекс]) или сначала найдите колонку через ТЗ.Колонки.Найти(ИмяПеременной) с проверкой на Неопределено.

Почему возникает ошибка «Колонка не найдена»?

Имя, переданное в метод, не совпадает ни с одной колонкой таблицы. Проверьте опечатки и помните: для таблиц из запроса имя колонки — это псевдоним поля после ключевого слова КАК, а не имя реквизита в базе.

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

Надёжнее всего свернуть копию таблицы по нужной колонке перед выгрузкой: Копия = ТЗ.Скопировать(); Копия.Свернуть("Колонка"); Массив = Копия.ВыгрузитьКолонку("Колонка"). Ручная фильтрация массива через Найти() медленнее на больших объёмах.

Можно ли выгрузить колонку только по строкам, удовлетворяющим условию?

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

Чем ВыгрузитьКолонку() отличается от Выгрузить()?

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

Итог

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

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