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

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

Как получить колонки табличной части в 1С

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

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

Основной инструмент — свойство Колонки объекта табличной части, которое возвращает коллекцию КолонкиТабличнойЧасти. У каждого элемента этой коллекции есть имя, тип значения, заголовок и ширина. Дополнительно структуру можно получить через метаданные объекта — этот способ работает даже без открытия самого документа.

Как получить колонки через свойство Колонки табличной части

Самый прямой способ — обратиться к свойству Колонки у табличной части конкретного объекта. Это работает в модуле объекта, в модуле формы (на сервере) и в любом серверном коде, где доступна ссылка на объект:

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

КолонкиТЧ = ДокументОбъект.Товары.Колонки;

Для Каждого Колонка Из КолонкиТЧ Цикл

Сообщить(Колонка.Имя + " | " + Колонка.ТипЗначения + " | " + Колонка.Заголовок);

КонецЦикла;

Каждый элемент коллекции имеет полезные свойства: Имя — идентификатор реквизита, ТипЗначения — описание типов колонки, Заголовок — представление для пользователя, Ширина — ширина по умолчанию. Для программной обработки чаще всего нужны именно Имя и ТипЗначения.

Обратите внимание: чтобы получить колонки таким способом для документа из базы, объект нужно прочитать — ПолучитьОбъект(). Это накладно, если данных строк не требуется. Для чтения только структуры лучше использовать метаданные, о чём ниже.

Как получить колонки через метаданные без открытия объекта

Когда нужна только структура табличной части, а сами строки не требуются, обращайтесь к метаданным. Это быстрее и не требует чтения объекта из базы:

МетаТЧ = Метаданные.Документы.РеализацияТоваровУслуг.ТабличныеЧасти.Товары;

Для Каждого Реквизит Из МетаТЧ.Реквизиты Цикл

Сообщить(Реквизит.Имя + " | " + Реквизит.Тип + " | " + Реквизит.Синоним);

КонецЦикла;

Здесь коллекция называется Реквизиты, а не «Колонки» — это типичный источник путаницы. Кроме явно описанных реквизитов, у каждой строки табличной части есть стандартный реквизит НомерСтроки, который в коллекцию Реквизиты не входит. Учитывайте это при универсальных обходах.

Если имя документа или табличной части известно только в виде строки (например, приходит параметром), используйте индексный доступ: Метаданные.Документы[ИмяДокумента].ТабличныеЧасти[ИмяТЧ]. Перед обращением проверяйте существование через Метаданные.Документы.Найти(ИмяДокумента), иначе получите ошибку обращения к несуществующему элементу.

bsl
МетаТЧ = Метаданные.Документы[ИмяДокумента].ТабличныеЧасти[ИмяТабличнойЧасти];
Для Каждого Реквизит Из МетаТЧ.Реквизиты Цикл
    // Реквизит.Имя, Реквизит.Тип, Реквизит.Синоним
КонецЦикла;

Как получить колонки табличной части на управляемой форме

На управляемой форме табличная часть обычно представлена реквизитом формы типа ДанныеФормыКоллекция. У такого реквизита нет прямого свойства «Колонки», поэтому структуру получают одним из двух способов.

Первый способ — преобразовать данные формы в объект и прочитать колонки:

ТаблицаЗначений = РеквизитФормыВЗначение("Объект").Товары.Выгрузить();

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

Сообщить(Колонка.Имя);

КонецЦикла;

Второй способ — обойти колонки элемента формы «Таблица». У элемента ТаблицаФормы есть коллекция ПодчиненныеЭлементы, где каждый элемент-потомок соответствует видимой колонке. Через свойство ПутьКДанным элемента можно извлечь имя реквизита: оно стоит после последней точки в пути вида Объект.Товары.Номенклатура.

Способы на форме

РеквизитФормыВЗначение + Выгрузить

Даёт полную структуру, включая скрытые колонки. Требует серверного вызова и преобразования данных.

Обход ПодчиненныеЭлементы таблицы формы

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

Метаданные объекта

Не зависит от формы вообще, но не учитывает программно добавленные реквизиты формы.

Как получить колонки таблицы значений и результата запроса

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

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг.Товары");

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

Для Каждого Колонка Из РезультатТЗ.Колонки Цикл

Сообщить(Колонка.Имя + " | " + Колонка.ТипЗначения);

КонецЦикла;

У колонки таблицы значений доступны Имя, ТипЗначения, Заголовок, Ширина. Важное отличие: при выгрузке из запроса имена колонок соответствуют псевдонимам полей запроса, а не обязательно именам реквизитов табличной части. Если в запросе написано Товары.Номенклатура КАК Товар, колонка будет называться Товар.

Универсальный порядок получения колонок
  1. 1
    Определите контекст: есть объект, есть форма или только имя метаданных
  2. 2
    Если есть объект — используйте Объект.ИмяТЧ.Колонки
  3. 3
    Если объекта нет — читайте Метаданные...ТабличныеЧасти.ИмяТЧ.Реквизиты
  4. 4
    Если данные в таблице значений — обойдите ТЗ.Колонки
  5. 5
    Проверьте результат: выведите имена и типы колонок в сообщения или журнал

Как получить только имена колонок списком или массивом

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

ИменаКолонок = Новый Массив;

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

ИменаКолонок.Добавить(Колонка.Имя);

КонецЦикла;

СтрокаКолонок = СтрСоединить(ИменаКолонок, ", ");

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

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

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

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

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

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

Типичные ошибки
01
Обращение Ссылка.Товары.Колонки — у ссылки нет данных, возникает ошибка; нужен ПолучитьОбъект() или метаданные
02
Ожидание НомерСтроки в коллекции Реквизиты метаданных — это стандартный реквизит, он там отсутствует
03
Использование имён колонок результата запроса как имён реквизитов ТЧ — псевдонимы запроса могут не совпадать
04
Изменение колонок выгруженной таблицы значений в расчёте на обратное влияние на объект — связи нет

Как проверить результат и убедиться в корректности

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

Для быстрой отладки выведите структуру в сообщения или в табличный документ. При работе с метаданными сверяйтесь с конфигуратором: откройте дерево объекта, разверните табличную часть и сравните состав реквизитов. Если обработка универсальная, добавьте проверку существования колонки перед обращением к ней — через поиск в коллекции или попытку обращения с обработкой исключения.

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

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

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

Совпадает с числом реквизитов ТЧ в конфигураторе (плюс НомерСтроки у данных)

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

Меньше ожидаемого — вероятно, читались видимые колонки формы, а не структура

Имена колонок
Норма

Совпадают с именами реквизитов в метаданных

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

Имена из псевдонимов запроса или путей к данным формы

Типы значений
Норма

ТипЗначения колонки соответствует типу реквизита

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

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

Итоговая логика выбора способа проста: есть объект — берите Колонки табличной части, объекта нет — читайте метаданные, данные уже в таблице значений — обходите её колонки, нужна видимая пользователю структура — анализируйте элементы формы. Этот порядок покрывает практически все сценарии, от отчётов до универсальных обменов.

Итог

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

Структуру табличной части читают через свойство Колонки объекта или через Метаданные...ТабличныеЧасти...Реквизиты без чтения объекта. У ссылки колонок нет, НомерСтроки в метаданных не виден, а имена колонок результата запроса зависят от псевдонимов полей.

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

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

Либо получите объект методом Ссылка.ПолучитьОбъект() и обратитесь к Объект.ИмяТЧ.Колонки, либо, если данные строк не нужны, прочитайте структуру через метаданные: Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ТабличныеЧасти.ИмяТЧ.Реквизиты. Второй способ быстрее и не блокирует запись.

Почему в коллекции Реквизиты метаданных нет колонки НомерСтроки?

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

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

Напрямую обратиться к метаданным на тонком клиенте нельзя. Варианты: выполнить серверный вызов, обойти подчинённые элементы таблицы формы (даст только видимые колонки) или заранее передать структуру с сервера при создании формы.

Как узнать тип значения конкретной колонки?

У колонки табличной части или таблицы значений читайте свойство ТипЗначения — это объект ОписаниеТипов. Проверить конкретный тип можно методом СодержитТип(Тип("Число")) или получить список типов методом Типы().

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

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

Почему имена колонок после запроса не совпадают с именами реквизитов табличной части?

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