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