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

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

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

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

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

Прямого метода «Переименовать» у коллекции колонок таблицы значений нет, но имя колонки — это обычное изменяемое свойство объекта КолонкаТаблицыЗначений. Достаточно получить нужную колонку через Колонки.Найти() или по индексу и присвоить свойству Имя новое значение. Данные при этом никуда не деваются: меняется только идентификатор колонки.

Ниже разобраны рабочие способы: простое присвоение имени, переименование через вставку новой колонки с переносом данных, особенности для таблиц, полученных из запроса, и типичные ошибки, из-за которых код падает или теряет данные.

Как устроено имя колонки и когда его можно менять

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

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

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

Способ 1: прямое присвоение свойства Имя

Самый короткий и безопасный способ — найти колонку и присвоить новое имя. Коллекция колонок поддерживает метод Найти(Имя), который возвращает объект колонки или Неопределено, если такой колонки нет.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("КонтрагентСсылка", Новый ОписаниеТипов("Строка"));

Колонка = ТЗ.Колонки.Найти("КонтрагентСсылка");

Если Колонка <> Неопределено Тогда

Колонка.Имя = "Контрагент";

КонецЕсли;

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

Обратиться к колонке можно и по индексу: ТЗ.Колонки[0].Имя = "НовоеИмя". Это удобно, когда порядок колонок известен заранее, например при разборе файла с фиксированной структурой. Минус — жёсткая привязка к позиции: если структура источника изменится, переименуется не та колонка.

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

Способ 2: новая колонка с копированием данных

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

ТЗ.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));

Для Каждого СтрокаТЗ Из ТЗ Цикл

СтрокаТЗ.Контрагент = СтрокаТЗ.КонтрагентСсылка;

КонецЦикла;

ТЗ.Колонки.Удалить(ТЗ.Колонки.Найти("КонтрагентСсылка"));

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

Этот способ медленнее на больших таблицах, потому что выполняется полный обход строк. Для таблиц в десятки тысяч строк разница заметна, поэтому без необходимости менять тип или позицию лучше использовать прямое присвоение имени.

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

Присвоение свойства Имя

Быстро, данные не трогаются. Подходит, когда тип и позиция колонки не меняются.

Новая колонка + копирование

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

Пересоздание таблицы

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

Переименование колонок таблицы, полученной из запроса

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

Однако правильнее решать задачу на уровне запроса: задать полю псевдоним через конструкцию КАК. Тогда таблица сразу придёт с нужными именами, и дополнительная обработка не потребуется.

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

"ВЫБРАТЬ

| Партии.Номенклатура КАК Товар,

| Партии.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.Партии.Остатки() КАК Партии";

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

Массовое переименование и работа с внешними источниками

При загрузке данных из Excel, CSV или результата COM-обмена колонки часто получают служебные имена вида «Колонка1», «Колонка2» или заголовки на языке источника. Переименовывать их удобно в цикле по соответствию, где ключ — старое имя, значение — новое.

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

СоответствиеИмен.Вставить("Колонка1", "Артикул");

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

Для Каждого Пара Из СоответствиеИмен Цикл

Колонка = ТЗ.Колонки.Найти(Пара.Ключ);

Если Колонка <> Неопределено Тогда

Колонка.Имя = Пара.Значение;

КонецЕсли;

КонецЦикла;

Если исходные имена непредсказуемы, но порядок колонок гарантирован, надёжнее идти по индексам: ТЗ.Колонки[0].Имя = "Артикул" и так далее. Перед этим стоит проверить, что количество колонок совпадает с ожидаемым — иначе имена уедут, и ошибка проявится далеко от места загрузки.

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

Типичные ошибки
01
Присвоение имени без проверки Найти(): если колонки нет, обращение к Неопределено.Имя вызывает ошибку выполнения
02
Переименование в уже занятое имя: платформа выдаёт ошибку о дублировании колонки
03
Удаление старой колонки до копирования данных: значения теряются безвозвратно
04
Путаница между Имя и Заголовок: меняется отображаемый текст, а обращение по старому имени продолжает работать, что маскирует проблему
05
Переименование колонки таблицы, выведенной на форму, без обновления путей к данным: табличное поле показывает пустые значения

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

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

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

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

КонецЦикла;

Функциональная проверка — обращение к данным: взять первую строку и прочитать значение по новому имени. Если значение читается и совпадает с тем, что было до переименования, операция прошла корректно.

Дополнительно полезно проверить количество колонок до и после: при прямом переименовании оно не должно измениться. Если количество выросло — где-то добавили колонку вместо переименования; если уменьшилось — случайно удалили.

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

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

Поиск нового имени
Норма

Колонки.Найти("НовоеИмя") возвращает колонку

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

Возвращает Неопределено — переименование не выполнено

Поиск старого имени
Норма

Колонки.Найти("СтароеИмя") возвращает Неопределено

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

Старая колонка осталась — вероятно, была добавлена копия

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

Совпадает со значением до переименования

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

Изменилось — добавлена или удалена лишняя колонка

Чтение данных
Норма

Значения по новому имени совпадают с исходными

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

Пустые значения или ошибка обращения к полю

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

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

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

Чем отличается свойство Имя от свойства Заголовок?

Имя — программный идентификатор, по которому обращаются к данным (СтрокаТЗ.ИмяКолонки). Заголовок — текст, отображаемый в шапке табличного поля на форме. Изменение заголовка не влияет на код, изменение имени не меняет отображение автоматически.

Как переименовать колонку в таблице, связанной с реквизитом формы?

Технически так же, но после переименования нужно обновить путь к данным у связанных элементов формы, иначе они потеряют привязку. Часто проще удалить и пересоздать реквизит формы программно через метод ИзменитьРеквизиты.

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

Обращайтесь к колонке по индексу: ТЗ.Колонки[0]. Индексация начинается с нуля. Перед этим проверьте, что количество колонок соответствует ожиданиям, чтобы не переименовать чужую колонку.

Почему после переименования падает ошибка «Поле объекта не обнаружено»?

Где-то в коде осталось обращение по старому имени. Найдите все вхождения старого имени через глобальный поиск по конфигурации и замените на новое. Также проверьте схемы компоновки данных и печатные формы, если таблица передаётся туда.

Можно ли переименовать колонку таблицы, полученной через СКД?

Результат компоновки выводится в табличный документ или дерево значений, и переименование там делается настройкой заголовков полей в схеме компоновки, а не программно. Если нужно другое имя поля, задайте его в наборе данных схемы или в настройках поля.

Итог

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

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