Переименование колонки ТаблицыЗначений в 1С: имя, заголовок и вывод в отчёт

· 9 мин

Содержание

Переименовать колонку таблицы значений можно тремя способами. Если нужна только подпись для пользователя, меняют свойство Заголовок. Если нужно новое имя для обращения из кода, создают колонку с другим именем и переносят в неё данные. Если таблица строится запросом, имя задают псевдонимом через КАК и вообще не трогают готовую таблицу.

Ниже все три способа с кодом для платформы 8.3. Примеры рассчитаны на то, что вы пишете обработку, отчёт или модуль в конфигураторе.

Чем имя колонки отличается от заголовка

У каждой колонки ТаблицыЗначений есть два свойства, которые легко перепутать.

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

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

Если поле Заголовок не заполнено, в шапке таблицы на форме показывается имя колонки. Именно поэтому в списках иногда видны «технические» названия вроде КоличествоОстаток.

💡 Правило практика: имя пишите коротко и без пробелов, а всё «красивое» кладите в заголовок. Тогда переименовывать имя почти никогда не придётся.

Создание таблицы сразу с нужными заголовками

Проще всего не переименовывать, а задать заголовок при создании. Метод Колонки.Добавить() принимает четыре параметра: имя, тип значения, заголовок и ширину.

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

Строка = Таблица.Добавить();
Строка.Номенклатура = "Бумага А4";
Строка.Количество = 10;
Строка.Сумма = 2500;

В коде вы по-прежнему пишете Строка.Сумма, а пользователь увидит «Сумма, руб.». Если заголовок не нужен, третий параметр опускают.

Метод возвращает созданную колонку, поэтому заголовок можно задать и отдельной строкой:

Колонка = Таблица.Колонки.Добавить("Цена");
Колонка.Заголовок = "Цена за единицу";

Как изменить заголовок колонки у готовой таблицы

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

Колонка = Таблица.Колонки.Найти("Сумма");
Если Колонка <> Неопределено Тогда
	Колонка.Заголовок = "Сумма с НДС, руб.";
КонецЕсли;

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

Чтобы поменять заголовки сразу у всех колонок, используйте соответствие «имя → заголовок»:

Заголовки = Новый Соответствие;
Заголовки.Вставить("Номенклатура", "Товар");
Заголовки.Вставить("Количество", "Кол-во, шт.");
Заголовки.Вставить("Сумма", "Сумма, руб.");

Для Каждого Колонка Из Таблица.Колонки Цикл
	НовыйЗаголовок = Заголовки.Получить(Колонка.Имя);
	Если НовыйЗаголовок <> Неопределено Тогда
		Колонка.Заголовок = НовыйЗаголовок;
	КонецЕсли;
КонецЦикла;

Данные в строках при этом не затрагиваются. Менять заголовок можно сколько угодно раз.

Как заменить само имя колонки

Когда нужно именно новое имя (например, таблица пришла из чужой процедуры с названием Колво, а ваш код ждёт Количество), надёжный путь такой:

  1. Добавьте колонку с новым именем и тем же типом.
  2. Пройдите по строкам и скопируйте значения.
  3. Удалите старую колонку.
  4. При необходимости верните новую колонку на прежнее место.
СтароеИмя = "Колво";
НовоеИмя = "Количество";

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

	Таблица.Колонки.Добавить(НовоеИмя, СтараяКолонка.ТипЗначения, СтараяКолонка.Заголовок);
	Для Каждого Строка Из Таблица Цикл
		Строка[НовоеИмя] = Строка[СтароеИмя];
	КонецЦикла;
	Таблица.Колонки.Удалить(СтараяКолонка);

	// новая колонка стоит последней, возвращаем её на место старой
	НоваяКолонка = Таблица.Колонки[НовоеИмя];
	Таблица.Колонки.Сдвинуть(НоваяКолонка, ПозицияСтарой - Таблица.Колонки.Индекс(НоваяКолонка));
КонецЕсли;

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

⚠️ Перед удалением убедитесь, что новое имя не занято и что на старое имя нигде дальше по коду нет обращений. Иначе получите ошибку «Поле объекта не обнаружено».

Переименование после загрузки из запроса

Таблица, полученная через РезультатЗапроса.Выгрузить(), берёт имена колонок из псевдонимов в тексте запроса. Поэтому правильнее всего переименовывать на стороне запроса.

Запрос = Новый Запрос;
Запрос.Текст =
	"ВЫБРАТЬ
	|	Номенклатура.Наименование КАК Товар,
	|	Номенклатура.Артикул КАК Код
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура";
Таблица = Запрос.Выполнить().Выгрузить();

В таблице окажутся колонки Товар и Код, а не Наименование и Артикул. Дополнительных действий не требуется.

Что делать, если запрос менять нельзя: он лежит в общем модуле или собран схемой компоновки. Тогда применяйте способ из предыдущего раздела (новая колонка, копирование, удаление) либо ограничьтесь заголовком.

Если из запроса приходят вложенные поля вида Договор.Организация, то в таблицу попадёт колонка с именем из псевдонима. Без явного КАК платформа сформирует имя сама, и оно может отличаться от ожидаемого. Задавайте псевдоним всегда, когда обращаетесь к колонке из кода.

💡 Если нужны только красивые подписи при показе, а не новые имена в коде, загрузите таблицу как есть и пройдите по Колонки с присваиванием Заголовок, как показано выше. Это дешевле копирования данных.

Составные типы, ширина и формат значений

Тип колонки задаётся через ОписаниеТипов и не меняется при смене заголовка. Если при замене имени вы создаёте новую колонку, переносите тип явно: СтараяКолонка.ТипЗначения. Иначе колонка станет «любой тип», и пропадут подсказки при вводе на форме.

Составной тип перечисляют через запятую:

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

Для чисел и строк уточняют квалификаторы, иначе потеряется точность:

ТипСумма = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
ТипТекст = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));

Что здесь важно запомнить:

  • ✅ при копировании данных в новую колонку берите ТипЗначения старой;
  • ✅ квалификаторы числа (15, 2) — это 15 знаков всего и 2 после запятой;
  • ✅ заголовок можно задать независимо от типа, они не связаны;
  • ⚠️ форматирование (разделители разрядов, формат даты) хранится не в колонке таблицы значений, а задаётся при выводе: на форме в свойствах поля, в табличном документе через формат ячейки.

Если нужно, чтобы число отображалось с пробелами между разрядами в текстовом выводе, оборачивайте его в Формат(Значение, "ЧДЦ=2; ЧГ=3,0"). Не склеивайте число со строкой напрямую: используйте Формат() или СтрШаблон().

Показ таблицы на форме с новыми заголовками

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

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

Менять заголовок уже показанной колонки из клиентского кода можно через элемент формы: у элемента-колонки есть свойство Заголовок. Имя элемента смотрите в дереве элементов формы в конфигураторе: оно складывается из имени таблицы и имени колонки, например ТаблицаТоварыСумма. Тогда подпись меняется строкой Элементы.ТаблицаТоварыСумма.Заголовок = "Сумма, руб.".

Имя самого реквизита-колонки на управляемой форме так не поменять: оно задано структурой реквизитов формы. Динамическое изменение набора реквизитов делается отдельным механизмом (ИзменитьРеквизиты()), и для простого переименования подписи он не нужен.

Вывод таблицы значений в табличный документ

В отчёт таблицу выводят вручную: сначала шапка из заголовков, потом строки. Заголовки берите из Колонка.Заголовок, а если он пустой, из Колонка.Имя.

ТабДок = Новый ТабличныйДокумент;

Колонок = Таблица.Колонки.Количество();

// шапка
Для Сч = 0 По Колонок - 1 Цикл
	Колонка = Таблица.Колонки[Сч];
	Подпись = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок);
	Ячейка = ТабДок.Область(1, Сч + 1);
	Ячейка.Текст = Подпись;
	Ячейка.Шрифт = Новый Шрифт(, , Истина);
КонецЦикла;

// строки
НомерСтроки = 2;
Для Каждого Строка Из Таблица Цикл
	Для Сч = 0 По Колонок - 1 Цикл
		ТабДок.Область(НомерСтроки, Сч + 1).Текст = Строка[Таблица.Колонки[Сч].Имя];
	КонецЦикла;
	НомерСтроки = НомерСтроки + 1;
КонецЦикла;

Обратите внимание: в строке данных обращаемся по Имя, а не по Заголовок. Заголовок для доступа к полю строки не годится.

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

Если не помогло: собрать новую таблицу

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

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

Для Каждого Строка Из Таблица Цикл
	НоваяСтрока = Новая.Добавить();
	НоваяСтрока.Товар = Строка.Номенклатура;
	НоваяСтрока.Количество = Строка.Колво;
КонецЦикла;

Таблица = Новая;

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

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

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

После правок удобно вывести имена и заголовки всех колонок в сообщения и сравнить с ожидаемыми:

Для Каждого Колонка Из Таблица.Колонки Цикл
	Сообщить(Колонка.Имя + " | " + Колонка.Заголовок + " | " + Колонка.ТипЗначения);
КонецЦикла;

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

Если таблица уходит в другой модуль или в обработку, проверьте, кто читает её колонки по имени. Для этого в конфигураторе найдите по тексту старое имя колонки во всей конфигурации (поиск по тексту модулей). Заголовок менять безопасно всегда, имя — только после такого поиска.

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

Основные неприятности возникают из-за путаницы между именем и заголовком.

Что видитеПричинаЧто сделать
«Поле объекта не обнаружено» после переименованияКод обращается к старому имениНайдите по модулю все обращения к старому имени и замените
В шапке прежнее названиеИзменили имя, а подпись осталасьПрисвойте Заголовок отдельно
Колонка с таким именем уже естьНовое имя совпало с существующимПроверьте Колонки.Найти(НовоеИмя) до добавления
Колонка уехала в конец таблицыПосле пересоздания колонка добавляется последнейВерните на место через Колонки.Сдвинуть()
На форме пропали подсказки вводаНовая колонка создана без типаПередайте ТипЗначения старой колонки
Заголовок в отчёте пустойЦикл вывода берёт Заголовок, а он не заполненПодставляйте имя, как в примере выше

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

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

Можно ли изменить заголовок колонки, не трогая данные?
Да. Свойство Заголовок меняется присваиванием в любой момент, строки таблицы при этом не затрагиваются.
Почему при обращении `Строка.НовоеИмя` ошибка, хотя заголовок я поменял?
Заголовок не влияет на имя поля. Для обращения из кода нужно именно Имя, его заголовком не заменить.
Как переименовать колонку таблицы, которая получена из запроса?
Проще всего задать псевдоним в тексте запроса через КАК. Если запрос менять нельзя, создайте колонку с новым именем, перенесите данные и удалите старую.
Сохранится ли порядок колонок после замены имени?
Нет, новая колонка добавляется в конец. Верните её на место методом Колонки.Сдвинуть(), как показано в примере.
Можно ли хранить в одной колонке и числа, и строки?
Можно, для этого задают составной тип через ОписаниеТипов("Строка, Число"). Но для вывода и сравнения удобнее колонки с одним типом.