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

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

Как переименовать колонки в таблице значений 1С

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

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

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

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

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

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

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

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

Переименование колонки через свойство Имя

Основной способ — прямое присваивание нового значения свойству Имя нужной колонки. Обратиться к колонке можно по её текущему имени или по индексу в коллекции:

// По имени колонки

ТаблицаТоваров.Колонки.Номенклатура.Имя = "Товар";

// По индексу (нумерация с нуля)

ТаблицаТоваров.Колонки[0].Имя = "Код";

После выполнения этого кода все данные в колонке остаются на месте, меняется только идентификатор. Обращение к старому имени после переименования приведёт к ошибке «Поле объекта не обнаружено», поэтому весь последующий код должен использовать новое имя.

Перед переименованием полезно проверить, существует ли колонка со старым именем и не занято ли новое. Это особенно важно в универсальных процедурах, где структура таблицы заранее не гарантирована:

Если ТЗ.Колонки.Найти("СтароеИмя") <> Неопределено

И ТЗ.Колонки.Найти("НовоеИмя") = Неопределено Тогда

ТЗ.Колонки.СтароеИмя.Имя = "НовоеИмя";

КонецЕсли;

Порядок действий
  1. 1
    Убедитесь, что колонка со старым именем существует: ТЗ.Колонки.Найти("СтароеИмя")
  2. 2
    Проверьте, что новое имя не занято другой колонкой
  3. 3
    Присвойте новое значение: ТЗ.Колонки.СтароеИмя.Имя = "НовоеИмя"
  4. 4
    Замените старое имя на новое во всех местах кода, где идёт обращение к колонке
  5. 5
    Выполните код и проверьте результат через отладчик или вывод структуры таблицы

Переименование при получении данных запросом

Если таблица значений создаётся как результат запроса, переименовывать колонки постфактум обычно не нужно — правильные имена задаются псевдонимами прямо в тексте запроса с помощью конструкции КАК:

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

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

"ВЫБРАТЬ

| Товары.Ссылка КАК Товар,

| Товары.Код КАК Артикул

|ИЗ

| Справочник.Номенклатура КАК Товары";

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

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

Обратите внимание: если в запросе несколько полей получают одинаковые автоматические имена (например, два поля Ссылка из разных таблиц), платформа добавит к именам числовые суффиксы — Ссылка, Ссылка1. Явные псевдонимы избавляют от таких неочевидных имён.

Массовое переименование и копирование структуры

Когда нужно переименовать сразу несколько колонок, удобно пройти по коллекции в цикле и использовать соответствие старых и новых имён:

НовыеИмена = Новый Соответствие;

НовыеИмена.Вставить("Номенклатура", "Товар");

НовыеИмена.Вставить("Количество", "Кол");

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

НовоеИмя = НовыеИмена.Получить(Колонка.Имя);

Если НовоеИмя <> Неопределено Тогда

Колонка.Имя = НовоеИмя;

КонецЕсли;

КонецЦикла;

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

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

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

Свойство Имя колонки

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

Псевдонимы КАК в запросе

Лучший вариант, если таблица ещё только формируется запросом. Не применим к таблицам, собранным вручную.

Новая таблица с копированием

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

Имя колонки и заголовок: что именно менять

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

ТЗ.Колонки.Количество.Заголовок = "Кол-во, шт.";

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

Для динамических списков и реквизитов формы типа ТаблицаЗначений изменение имени колонки после того, как таблица связана с элементом формы, может потребовать обновления связанных элементов формы — иначе колонка на экране «потеряет» данные. Безопаснее формировать структуру до привязки к форме.

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

Главные ограничения при переименовании: уникальность имени в пределах таблицы и соответствие правилам идентификаторов. Нельзя присвоить имя, которое уже носит другая колонка, — платформа выдаст ошибку. Также нельзя использовать пробелы, дефисы, кириллические имена с недопустимыми символами (хотя кириллица в именах допустима, на практике лучше придерживаться единого стиля).

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

Типичные ошибки
01
Менять Заголовок вместо Имя — программный доступ к данным не меняется, а разработчик ждёт обратного
02
Присваивать имя, уже занятое другой колонкой, — ошибка исполнения и остановка кода
03
Забыть обновить строковые литералы в НайтиСтроки, Сортировать, Итог — отборы и итоги по старому имени перестают работать
04
Переименовывать колонки таблицы, привязанной к форме, не обновляя элементы формы — данные на экране исчезают
05
Использовать в имени пробелы и спецсимволы — ошибка присваивания

Проверка результата

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

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

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

КонецЦикла;

Дополнительно проверьте, что данные доступны по новому имени: обратитесь к первой строке, например ТЗ[0].НовоеИмя, и убедитесь, что значение читается без ошибки. Если таблица пустая, проверка по строкам невозможна — достаточно контроля коллекции Колонки.

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

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

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

Новое имя присутствует, старого нет, типы данных сохранены

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

Старое имя осталось или колонка исчезла

Доступ к данным по новому имени
Норма

ТЗ[0].НовоеИмя возвращает значение без ошибки

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

Ошибка «Поле объекта не обнаружено»

Отборы, сортировка, итоги
Норма

НайтиСтроки, Сортировать и Итог работают с новым именем

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

Ошибки или пустые результаты в местах со старым именем

Итог

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

Переименование колонки таблицы значений — это присваивание нового значения свойству Имя через коллекцию Колонки; данные сохраняются. Для таблиц из запроса используйте псевдонимы КАК, для отображения на форме меняйте Заголовок, а не Имя, и всегда проверяйте уникальность нового имени и все места кода, где использовалось старое.

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

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

Да. Переименование затрагивает только описание колонки, а не данные, поэтому наличие или отсутствие строк не имеет значения. Свойство Имя доступно для записи в любом случае.

Что будет, если присвоить колонке имя, которое уже занято?

Платформа выдаст ошибку исполнения, и присваивание не выполнится. Имена колонок в одной таблице значений должны быть уникальны, поэтому перед переименованием стоит проверять коллекцию методом Найти.

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

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

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

Точно так же, как в таблице значений: объект ДеревоЗначений имеет коллекцию Колонки с теми же свойствами. Код ДЗ.Колонки.СтароеИмя.Имя = "НовоеИмя" работает идентично, данные во всех уровнях иерархии сохраняются.

Почему после переименования перестал работать поиск через НайтиСтроки?

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

Можно ли поменять порядок колонок вместе с переименованием?

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