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