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