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