Добавление колонок в ТаблицуЗначений: Добавить, Вставить, типы, копирование
Содержание
Колонку в таблицу значений добавляет метод Колонки.Добавить(). Ему передают имя колонки, а при желании ещё тип значения, заголовок и ширину. Колонки нужно создавать до заполнения таблицы строками: сначала описывается структура, потом данные.
Простейший пример:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура");
Таблица.Колонки.Добавить("Количество");
Две колонки созданы, типа у них нет, поэтому в них можно положить что угодно. Для рабочего кода такой вариант годится редко: ниже разобрано, как задавать типы, вставлять колонки в нужное место, искать их, копировать структуру и считать значения на лету.
Основные способы добавить колонку
Метод Добавить принимает до четырёх параметров:
| Параметр | Что это | Обязателен |
|---|---|---|
Имя | Идентификатор колонки, по нему обращаются к полю строки | да |
ТипЗначения | Объект ОписаниеТипов | нет |
Заголовок | Подпись, которую видит пользователь в табличном поле | нет |
Ширина | Ширина колонки в табличном поле | нет |
Метод возвращает объект колонки, и его удобно сохранить в переменную:
Колонка = Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"), "Сумма, руб.");
Имя подчиняется тем же правилам, что и имя переменной: без пробелов, не с цифры, без спецсимволов. Для красивой подписи есть заголовок, поэтому «Сумма, руб.» уместно только в нём.
Вставка колонки в нужную позицию
Добавить ставит колонку в конец. Чтобы поставить её на конкретное место, используйте Вставить. Первым параметром идёт индекс, нумерация с нуля:
Таблица.Колонки.Вставить(0, "Код", Новый ОписаниеТипов("Строка"));
Теперь «Код» первая слева. Порядок колонок важен, если таблицу показывают в форме или выгружают в табличный документ.
Если таблица уже заполнена, новая колонка появится у всех существующих строк со значением Неопределено. Данные не потеряются.
Несколько колонок сразу
Отдельного метода «добавить пачкой» нет. Колонки перечисляют списком имён и создают в цикле:
Для Каждого Имя Из СтрРазделить("Склад,Партия,Серия", ",") Цикл
Таблица.Колонки.Добавить(Имя);
КонецЦикла;
Так проще поддерживать код, когда структура формируется из параметров.
Типы значений: простые и ссылочные
Тип колонки задаёт ОписаниеТипов. Он нужен не для красоты: по типу таблица приводит значения, а в форме подбирает редактор ячейки.
Простые типы и квалификаторы
Для чисел, строк и дат тип дополняют квалификаторами:
ТипЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Неотрицательный));
ТипСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
ТипДаты = Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата));
Таблица.Колонки.Добавить("Сумма", ТипЧисла);
Таблица.Колонки.Добавить("Комментарий", ТипСтроки);
Таблица.Колонки.Добавить("Дата", ТипДаты);
Здесь 15, 2 означает до 15 знаков всего, из них 2 после запятой. Значение 12,345 в такой колонке округлится до 12,35, а отрицательное число для Неотрицательный обнулится.
Ссылочные и составные типы
Ссылки на справочники и документы задают строкой с именем типа:
Таблица.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Таблица.Колонки.Добавить("Документ", Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг"));
Если колонка может хранить значения нескольких видов, перечислите типы через запятую:
Таблица.Колонки.Добавить("Основание", Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг, ДокументСсылка.ПоступлениеТоваровУслуг"));
Объекты, имена которых вы не помните наизусть, удобно взять из подсказки синтаксис-помощника: ошибка в имени типа сразу даст исключение при выполнении.
Булево и произвольные значения: для флага берут Новый ОписаниеТипов("Булево"), для колонки «что угодно» параметр типа просто не указывают.
Изменить тип уже созданной колонки
Тип существующей колонки поменять нельзя. Если он оказался неверным, делают три шага: создают новую колонку с нужным типом, переносят в неё значения циклом по строкам, удаляют старую. Следите, чтобы значения подошли новому типу: строку «abc» в числовую колонку превратить не получится, она станет нулём.
Колонки с расчётом: вычислять приходится самому
У таблицы значений нет вычисляемых колонок: нельзя записать в колонку выражение и ждать, что оно пересчитается при изменении соседних полей. Для этого есть три рабочих приёма.
Заполнить колонку циклом
Самый прозрачный вариант. Создаёте колонку «Сумма» и считаете значение для каждой строки:
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Для Каждого Строка Из Таблица Цикл
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
Если количество или цена потом поменяются, пересчитывайте вручную. Автоматики нет.
Заполнить колонку одним значением
Когда нужно поставить одно и то же всем строкам, цикл не нужен:
Таблица.ЗаполнитьЗначения(Ложь, "Обработано");
Первый параметр — значение, второй — имена колонок через запятую. Без второго параметра заполнятся все колонки, поэтому будьте внимательны и всегда указывайте нужные.
Загрузить колонку из массива
Если значения уже лежат в массиве, а количество элементов совпадает с количеством строк, их переносят одной командой:
Таблица.ЗагрузитьКолонку(МассивЦен, "Цена");
Обратная операция — ВыгрузитьКолонку("Цена"), она вернёт массив значений. Удобно, когда нужен список без дублей: выгрузили колонку и передали в нужную функцию.
Свернуть и посчитать итоги
Итоги по колонке дают Итог и Свернуть:
ВсегоСумма = Таблица.Итог("Сумма");
Таблица.Свернуть("Контрагент", "Сумма");
Свернуть оставит только перечисленные колонки: первый параметр — группировка, второй — суммируемые поля. Остальные колонки из таблицы пропадут, это штатное поведение.
Скопировать структуру таблицы
Часто нужна вторая таблица с теми же колонками, но без строк. Для этого есть СкопироватьКолонки:
Пустая = Таблица.СкопироватьКолонки();
Новая таблица получит все колонки с типами, а строк в ней не будет. Метод Скопировать без параметров делает полную копию: структура плюс данные.
Можно скопировать частично, передав отбор строк и список колонок:
Часть = Таблица.Скопировать(Новый Структура("Склад", Склад), "Номенклатура, Количество");
Первый параметр — отбор (структура «колонка → значение»), второй — колонки, которые нужны в результате. Подойдёт, когда нужен срез по одному складу.
Копия независима от оригинала. Меняя строки в Часть, вы не затронете Таблица. Но если в колонке лежат ссылки на объекты, сами объекты общие.
Чтобы перенести данные между таблицами с разной структурой, добавьте недостающие колонки в приёмник и копируйте значения по именам:
Для Каждого Строка Из Источник Цикл
Новая = Приёмник.Добавить();
ЗаполнитьЗначенияСвойств(Новая, Строка);
КонецЦикла;
ЗаполнитьЗначенияСвойств переносит только совпадающие по имени колонки, остальные пропускает без ошибки.
Найти колонку, перебрать и удалить
Проверить наличие
Колонки хранятся в коллекции с поиском по имени:
Если Таблица.Колонки.Найти("Сумма") = Неопределено Тогда
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
КонецЕсли;
Такая проверка защищает от ошибки «Колонка уже существует» при повторном выполнении кода. Обращение к несуществующей колонке через Строка.Сумма вызывает исключение, а Найти возвращает Неопределено.
Перебрать все колонки
Для Каждого Колонка Из Таблица.Колонки Цикл
Сообщить(Колонка.Имя + ": " + Колонка.Заголовок);
КонецЦикла;
Количество колонок даёт Таблица.Колонки.Количество(). К колонке можно обратиться по индексу: Таблица.Колонки[0]. Такой перебор нужен для универсальных процедур, например выгрузки любой таблицы в файл.
Удалить колонку
Таблица.Колонки.Удалить("Комментарий");
Удалять можно по имени, по индексу или по объекту колонки. Данные колонки пропадают вместе с ней, вернуть их не получится.
Что делать с колонкой после создания
Колонка нужна не сама по себе, а чтобы по ней работать со строками. Вот три операции, которые используют чаще всего.
Сортировка и поиск по колонке
Сортировка принимает имена колонок и направление:
Таблица.Сортировать("Контрагент Убыв, Сумма");
Первое поле отсортируется по убыванию, второе по возрастанию. Для отбора строк по значению колонки есть НайтиСтроки:
Найденные = Таблица.НайтиСтроки(Новый Структура("Склад", Склад));
Метод возвращает массив строк. Если таблица большая, а поиск по одной и той же колонке идёт в цикле, добавьте индекс: Таблица.Индексы.Добавить("Склад"). Выборка станет быстрее, так как не придётся каждый раз перебирать все строки.
Колонка в таблице на управляемой форме
Если таблицу значений нужно показать пользователю, колонок в объекте недостаточно. На управляемой форме поле таблицы привязано к реквизиту формы, и новые колонки создают в два шага:
- Добавляют реквизит через
ИзменитьРеквизиты. Колонка таблицы описывается какНовый РеквизитФормы("Сумма", Новый ОписаниеТипов("Число"), "ТаблицаДанных", "Сумма"), где третий параметр — путь к реквизиту-таблице. - Создают поле на форме:
Элементы.Добавить("ТаблицаДанныхСумма", Тип("ПолеФормы"), Элементы.ТаблицаДанных)и привязывают его к данным через свойствоПутьКДанным.
Реквизиты формы меняются только на сервере. Вызов ИзменитьРеквизиты из клиентской процедуры не сработает, поэтому логику строят в серверной процедуре с директивой &НаСервере. После изменения реквизитов все ранее полученные значения реквизитов формы нужно перечитать.
Если вы просто добавили колонку в Объект.ТаблицаДанных.Колонки на форме, пользователь её не увидит. Колонки видимой таблицы определяются реквизитами формы, а не объектом.
Вывод в табличный документ и в файл
Из таблицы значений без труда делают отчёт: перебирают колонки, выводят заголовки, затем строки. Именно здесь удобно свойство Заголовок: его выводят в шапку, а по Имя читают значения из строки. Такой универсальный вывод работает для любой структуры и не требует перепрограммирования при добавлении новой колонки.
Типовые сценарии: когда колонки добавляют на лету
Структуру часто строят динамически, и вот где это нужно на практике.
- 📋 Результат запроса. Выборка из запроса сразу выгружается в таблицу значений через
Результат.Выгрузить(). Колонки создаются автоматически по полям запроса, вручную их добавлять не надо. Недостающие расчётные колонки добавляют уже потом. - 📊 Сводка по периодам. Колонки по месяцам создают в цикле, от первого месяца периода до последнего:
Таблица.Колонки.Добавить("М" + Формат(Номер, "ЧГ=0")). - 📥 Загрузка из внешнего файла. Заголовки файла превращаются в имена колонок, а типы остаются строковыми, пока данные не проверены и не приведены.
- 🔄 Обмен между системами. Структура приходит параметрами, и таблицу собирают под неё без жёстко прописанных имён.
Для сводки по периодам обратите внимание на имена. Если колонка называется «Январь 2026», это не идентификатор, и создание завершится ошибкой. Используйте короткие технические имена вроде М1, а читаемое название передавайте в заголовок.
Пример полной сборки сводки:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Для Номер = 1 По 12 Цикл
Имя = "М" + Формат(Номер, "ЧГ=0");
Таблица.Колонки.Добавить(Имя, Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), Формат(Дата(2026, Номер, 1), "ДФ=MMMM"));
КонецЦикла;
Параметр ЧГ=0 в Формат убирает разделитель групп, иначе число превратилось бы в строку с пробелом. Получатся имена М1, М2 и так до М12, а в заголовках будут названия месяцев. Колонки для чисел создаются с типом Число, поэтому суммы в них накапливаются без приведения.
Дальше строку контрагента заполняют обращением по имени колонки: Строка["М" + Формат(Номер, "ЧГ=0")] = Сумма. Индексатор по строке принимает имя колонки как строку, и это единственный способ достучаться до колонок, которых не было на момент написания кода.
Ошибки при работе с колонками
- Колонки создают до заполнения строк. Если добавить колонку после, у старых строк в ней будет
Неопределено, а не пустое значение нужного типа. Для чисел это ломает арифметику:Неопределено * 2даст ошибку. - Опечатка в имени колонки. Имена в
Строка.Количесвопроверяются только при выполнении, компилятор не подскажет. Выносите имена в константы или копируйте их из мест создания. - Колонка уже существует. Повторный
Добавитьс тем же именем завершится ошибкой: ставьте проверку черезНайти. - Имя с пробелами или спецсимволами. Для подписи используйте заголовок, имя оставьте простым идентификатором.
Свернутьубрал нужные поля. Если после свёртки колонки пропали, вы не включили их ни в группировку, ни в суммируемые. Сначала сделайте копию таблицы.
Таблица.Колонки перебором и сверьте имя.Колонки.Найти(Имя) перед созданием.КвалификаторыЧисла.Частые вопросы
Можно ли создать колонку в таблице значений без указания типа?
Как переименовать колонку?
ВыгрузитьКолонку и ЗагрузитьКолонку, затем удалите старую.Чем отличается Добавить от Вставить?
Добавить ставит колонку последней, Вставить — на указанную позицию, нумерация с нуля.Можно ли сделать колонку, которая считается сама?
Скопируется ли структура вместе с данными при СкопироватьКолонки?
Скопировать.