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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// переименование

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

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

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

КонецЕсли;

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

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

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

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

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

// добавляем новую колонку с нужным типом

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

// переносим значения

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

Строка.СуммаДокумента = Строка.Сумма;

КонецЦикла;

// удаляем старую колонку

ТЗ.Колонки.Удалить("Сумма");

Новая колонка добавляется в конец таблицы. Если порядок колонок важен (например, таблица выводится пользователю или передаётся в построитель отчёта), после удаления старой колонки используют метод Сдвинуть: ТЗ.Колонки.Сдвинуть("СуммаДокумента", -2) — сдвиг на нужное число позиций.

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

Способ 3: построение новой таблицы с нужными именами

Когда переименовать нужно сразу несколько колонок или структура таблицы приходит из внешнего источника с «неудобными» именами, удобнее построить новую таблицу и скопировать в неё данные построчно.

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

НоваяТЗ.Колонки.Добавить("Номенклатура");

НоваяТЗ.Колонки.Добавить("Количество");

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

НоваяСтрока = НоваяТЗ.Добавить();

НоваяСтрока.Номенклатура = Строка["Товар"];

НоваяСтрока.Количество = Строка["Колво"];

КонецЦикла;

Способ трудоёмче, но даёт полный контроль: можно задать типы, порядок колонок, отфильтровать лишние строки и преобразовать значения «на лету». Для больших таблиц (десятки тысяч строк) построчное копирование медленнее переименования, поэтому без необходимости менять типы лучше использовать первый способ.

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

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

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

Пересоздание колонки

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

Новая таблица

Подходит для массового переименования и фильтрации. Самый гибкий, но самый медленный на больших объёмах.

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

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

Первый — правильный в большинстве случаев: задать нужные имена сразу в запросе через псевдонимы (ВЫБРАТЬ Товары.Номенклатура КАК Товар). Тогда переименование вообще не потребуется, а код останется чище.

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

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

Типичные ошибки при переименовании

Первая ошибка — переименование без проверки дальнейших обращений. Если после смены имени где-то в коде осталось Строка.СтароеИмя, в режиме исполнения возникнет ошибка «Поле объекта не обнаружено». Перед переименованием выполните поиск по модулю (и по связанным модулям) старого имени колонки.

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

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

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

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

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

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

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

КонецЦикла;

Дополнительно проверьте, что данные на месте: сравните ТЗ.Количество() до и после операции и выборочно сверьте значения в нескольких строках. При пересоздании колонки с другим типом убедитесь, что значения не обнулились — переберите строки и проверьте заполненность.

В отладчике структуру таблицы удобно смотреть через «Табло» или команду «Вычислить выражение»: ТЗ.Колонки.Количество() и обращение к конкретной колонке по новому имени покажут, что переименование прошло успешно.

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

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

Имя колонки в коллекции
Норма

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

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

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

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

Совпадает с количеством до операции

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

Строки потеряны при пересоздании таблицы

Значения в строках
Норма

Данные соответствуют исходным

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

Пустые или обнулённые значения после смены типа

Обращения в коде
Норма

Все обращения используют новое имя

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

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

Часто задаваемые вопросы

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

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

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

Либо последовательно присвойте новые имена каждой колонке через Колонки.Найти().Имя, либо постройте новую таблицу с нужной структурой и скопируйте строки. Для двух-трёх колонок первый вариант короче, для массовых изменений удобнее второй.

Почему возникает ошибка «Колонка с таким именем уже существует»?

Новое имя совпадает с именем другой колонки таблицы, причём сравнение идёт без учёта регистра. Перед присвоением проверьте: ТЗ.Колонки.Найти("НовоеИмя") должно вернуть Неопределено. Если колонка с таким именем есть, но не нужна — сначала удалите её.

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

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

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

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

Работает ли переименование для таблицы значений — реквизита формы?

Технически да, но элементы табличного поля на форме привязаны к старым путям данных. После переименования нужно программно обновить ПутьКДанным у колонок табличного поля или пересоздать элементы, иначе на форме отобразятся пустые значения.

Итог

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

Для переименования колонки таблицы значений достаточно присвоить новое значение свойству Имя через ТЗ.Колонки.Найти().Имя. При смене типа или порядка колонку пересоздают с переносом данных. Перед переименованием проверьте уникальность нового имени и все обращения к старому имени в коде.