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

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

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

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

Задача получить значения одной колонки табличной части в виде массива встречается в 1С постоянно: при проверке дублей, построении запросов с параметром-списком, передаче данных в другие процедуры или формировании отборов. Встроенный язык предлагает для этого штатные методы, и в большинстве случаев задача решается одной строкой кода — если знать, к какому объекту правильно обратиться.

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

Нюансы появляются в управляемых формах, где табличная часть представлена объектом ДанныеФормыКоллекция, и при работе с большими объёмами данных, где лишнее копирование таблицы сказывается на производительности. Ниже разобраны все рабочие способы с примерами кода, ограничениями и типичными ошибками.

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

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

Пример для табличной части документа в модуле объекта или внешней обработке:

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

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

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

КонецЦикла;

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

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

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

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

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

Выгрузка колонки в управляемой форме

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

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

&НаСервере

Функция ПолучитьМассивТоваров()

ТаблицаТоваров = Объект.Товары.Выгрузить();

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

КонецФункции

Методу Выгрузить() можно передать отбор строк и список колонок через параметры, что уменьшает объём копируемых данных: Объект.Товары.Выгрузить(, "Номенклатура") — первый параметр (отбор) пропущен, второй ограничивает выгрузку одной колонкой.

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

МассивТоваров = Новый Массив;

Для Каждого СтрокаТовара Из Объект.Товары Цикл

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

КонецЦикла;

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

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

Самый короткий код. Подходит для табличных частей объектов, таблиц значений и результатов запроса. Не работает с ДанныеФормыКоллекция напрямую.

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

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

Цикл по коллекции

Универсален, позволяет фильтровать и преобразовывать значения на лету. Кода больше, но нет лишнего копирования данных.

Обход табличной части циклом с условиями

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

МассивСкладов = Новый Массив;

Для Каждого СтрокаТабличнойЧасти Из Объект.Товары Цикл

Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.Склад) Тогда

МассивСкладов.Добавить(СтрокаТабличнойЧасти.Склад);

КонецЕсли;

КонецЦикла;

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

Уникальные = Новый Соответствие;

Для Каждого СтрокаТабличнойЧасти Из Объект.Товары Цикл

Уникальные.Вставить(СтрокаТабличнойЧасти.Номенклатура, Истина);

КонецЦикла;

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

Для Каждого КлючИЗначение Из Уникальные Цикл

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

КонецЦикла;

Тот же результат даёт свёртка таблицы значений: после Выгрузить() вызвать Свернуть("Номенклатура") и затем ВыгрузитьКолонку("Номенклатура"). Это короче, но требует промежуточной таблицы.

Использование массива в запросе

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

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

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

"ВЫБРАТЬ

| Цены.Номенклатура,

| Цены.Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Номенклатура В (&СписокНоменклатуры)) КАК Цены";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

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

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

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

Порядок действий
  1. 1
    Определите, где выполняется код: модуль объекта, обычная форма или управляемая форма.
  2. 2
    Для табличной части объекта вызовите ВыгрузитьКолонку("ИмяКолонки") напрямую.
  3. 3
    Для управляемой формы сначала вызовите Выгрузить() у коллекции формы, затем ВыгрузитьКолонку у полученной таблицы значений.
  4. 4
    Если нужны отбор или преобразование значений — используйте цикл по строкам с добавлением в массив.
  5. 5
    Проверьте результат: выведите количество элементов массива и несколько значений через Сообщить или отладчик.

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

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

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

Сообщить("Строк в табличной части: " + Объект.Товары.Количество());

Сообщить("Элементов в массиве: " + МассивНоменклатуры.Количество());

Если МассивНоменклатуры.Количество() > 0 Тогда

Сообщить("Тип первого элемента: " + ТипЗнч(МассивНоменклатуры[0]));

КонецЕсли;

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

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

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

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

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

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

Меньше числа строк — применён отбор или фильтр, который вы не планировали

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

Соответствует типу колонки, например СправочникСсылка.Номенклатура

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

Неопределено или строка — выгружена не та колонка или колонка пуста

Содержимое массива
Норма

Значения соответствуют видимым данным табличной части

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

Пустые значения или NULL — колонка не заполнена в строках

Типичные ошибки и ограничения

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

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

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

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

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

Особые случаи: динамический список и внешние источники

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

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

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

Итог

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

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

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

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

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

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

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

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

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

Что делать, если выгруженный массив содержит пустые значения?

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

Подходит ли массив из ВыгрузитьКолонку для параметра запроса «В»?

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

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

Имя колонки передаётся строкой и не проверяется при компиляции. Ошибка означает опечатку или то, что у объекта нет такого реквизита. Сверьте имя с метаданными табличной части в конфигураторе, учитывая регистр букв не важен, но лишние символы и пробелы недопустимы.