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