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