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