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