Разработка и Конфигурация · 10 мин
Как добавить колонку в таблицу значений в 1С 8
Как добавить колонку в таблицу значений в 1С 8: метод Колонки.Добавить, типы данных, работа с колонками на форме, типичные ошибки и готовые примеры кода.
Таблица значений — один из самых востребованных объектов встроенного языка 1С 8: в ней удобно накапливать промежуточные данные, результаты запросов, строки для выгрузки или отображения на форме. Прежде чем заполнять таблицу данными, в неё нужно добавить колонки — иначе платформа не сможет хранить значения структурированно.
Добавление колонки выполняется через коллекцию Колонки и метод Добавить(). Метод доступен как на толстом, так и на тонком клиенте, работает на сервере и не требует никаких дополнительных настроек конфигурации — таблица значений создаётся программно «на лету».
Ниже разобраны синтаксис метода, варианты задания типов колонки, добавление колонок в таблицу, связанную с реквизитом формы, типичные ошибки и способы проверить результат до вывода данных пользователю.
Синтаксис метода Колонки.Добавить
Базовый вызов выглядит так:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Метод принимает четыре параметра, все кроме первого необязательны:
- Имя — строка с именем колонки. Должно быть корректным идентификатором: начинаться с буквы, не содержать пробелов и спецсимволов. Имена колонок в одной таблице не должны повторяться.
- Тип — объект
ОписаниеТипов, ограничивающий состав значений. Если не указан, колонка принимает значения любого типа. - Заголовок — строка, которая отображается в шапке колонки при выводе таблицы на форму. Если не задан, используется имя.
- Ширина — число, ширина колонки в символах при отображении. Влияет только на визуальное представление.
Метод возвращает объект КолонкаТаблицыЗначений, через который можно позже изменить свойства колонки, например заголовок или тип.
Как задать тип колонки через ОписаниеТипов
Если тип не указать, колонка будет «свободной» — в неё можно записать и строку, и число, и ссылку. Это удобно на этапе прототипирования, но в рабочем коде лучше ограничивать тип: при сортировке, итогах и выводе на форму типизированные колонки ведут себя предсказуемее.
Примеры типизации для основных типов:
// Строка длиной до 100 символов
ТЗ.Колонки.Добавить("Наименование",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)));
// Число: 15 разрядов, 2 знака после запятой
ТЗ.Колонки.Добавить("Сумма",
Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
// Дата без времени
ТЗ.Колонки.Добавить("ДатаОтгрузки",
Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)));
// Ссылка на справочник
ТЗ.Колонки.Добавить("Контрагент",
Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Для составного типа перечислите типы через запятую: Новый ОписаниеТипов("СправочникСсылка.Контрагенты,СправочникСсылка.Организации"). Это полезно, когда колонка может содержать ссылки на разные объекты.
Добавление нескольких колонок и заполнение таблицы
Типовой сценарий — создать таблицу, добавить набор колонок и заполнить строками в цикле:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(11)));
ТЗ.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТЗ.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Код = "00-000001";
НоваяСтрока.Товар = СсылкаНаТовар;
НоваяСтрока.Остаток = 25.5;
Обращение к значениям строки идёт по имени колонки через точку. Если колонки с таким именем нет, платформа выдаст ошибку «Поле объекта не обнаружено» — поэтому имена колонок стоит задавать один раз, в одном месте модуля, и не «размазывать» литералы по коду.
Если таблица создаётся из результата запроса (Запрос.Выполнить().Выгрузить()), колонки добавлять вручную не нужно — они создаются автоматически по полям запроса. Но добавить собственную колонку к такой таблице можно тем же методом Колонки.Добавить() уже после выгрузки.
- 1Создайте объект: ТЗ = Новый ТаблицаЗначений
- 2Добавьте колонки через ТЗ.Колонки.Добавить() с именем и типом
- 3Заполните строки через ТЗ.Добавить() и присваивание значений по именам колонок
- 4Проверьте результат: ТЗ.Количество() и обход строк в цикле
- 5При необходимости выведите таблицу на форму или передайте дальше
Добавление колонки в таблицу на управляемой форме
Отдельная ситуация — таблица значений уже является реквизитом формы и отображается пользователю, а колонку нужно добавить программно в процессе работы. Просто вызвать Колонки.Добавить() недостаточно: данные в реквизите появятся, но на форме колонка не отобразится.
Полный алгоритм включает три шага: добавить реквизит формы через ИзменитьРеквизиты(), добавить колонку в таблицу значений, создать элемент формы и связать его с данными:
// 1. Добавляем реквизит формы
Добавляемые = Новый Массив;
Добавляемые.Добавить(Новый РеквизитФормы("Сумма",
Новый ОписаниеТипов("Число"), "ТаблицаТоваров", "Сумма"));
ИзменитьРеквизиты(Добавляемые);
// 2. Добавляем колонку в саму таблицу
ТЗ = РеквизитФормыВЗначение("ТаблицаТоваров");
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ЗначениеВРеквизитФормы(ТЗ, "ТаблицаТоваров");
// 3. Создаём элемент отображения
Элемент = Элементы.Добавить("ТаблицаТоваровСумма", Тип("ПолеФормы"), Элементы.ТаблицаТоваров);
Элемент.ПутьКДанным = "ТаблицаТоваров.Сумма";
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Изменение состава реквизитов формы возможно только на сервере, поэтому код размещают в серверной процедуре с директивой &НаСервере.
Полезные операции с колонками после добавления
Коллекция Колонки поддерживает не только добавление. Часто используются:
ТЗ.Колонки.Найти("Сумма")— проверка существования колонки; возвращает колонку илиНеопределено.ТЗ.Колонки.Вставить(0, "НомерСтроки")— добавление колонки в конкретную позицию, а не в конец.ТЗ.Колонки.Удалить("ВременнаяКолонка")— удаление колонки вместе со всеми значениями.ТЗ.Колонки.Сумма.Имя = "Итог"— переименование через присваивание свойстваИмя.ТЗ.Скопировать(, "Товар,Остаток")— создание новой таблицы только с нужными колонками.
Перед добавлением колонки в цикле или в универсальной процедуре всегда проверяйте её наличие через Найти() — это защитит от ошибки «Колонка с таким именем уже существует».
Проверка результата и отладка
Убедиться, что колонка добавлена корректно, можно несколькими способами. В отладчике достаточно вычислить выражение ТЗ.Колонки.Количество() и ТЗ.Колонки.Найти("ИмяКолонки"). Программно — вывести состав колонок в сообщение:
Для Каждого Колонка Из ТЗ.Колонки Цикл
Сообщить(Колонка.Имя + " — " + Колонка.ТипЗначения);
КонецЦикла;
Если таблица выводится на форму, дополнительно проверьте, что у элемента формы корректно заполнено свойство ПутьКДанным — именно его несоответствие имени колонки чаще всего приводит к пустой колонке на экране.
Как проверить результат
ТЗ.Колонки.Найти("Имя") возвращает колонку
Возвращает Неопределено — колонка не добавлена
Колонка.ТипЗначения содержит нужный тип
Тип пустой или не совпадает с записываемыми значениями
Колонка видна и заполнена данными
Колонка есть, но пустая — проверьте ПутьКДанным элемента
Частые вопросы
Можно ли добавить колонку в таблицу, полученную из запроса?
Да. После Выгрузить() результат запроса — обычная таблица значений, и в неё можно добавлять колонки методом Колонки.Добавить(), а затем заполнять их в цикле по строкам.
Как добавить колонку не в конец, а в нужную позицию?
Используйте метод Вставить(): ТЗ.Колонки.Вставить(2, "НоваяКолонка") — колонка появится на позиции с индексом 2, остальные сдвинутся вправо.
Почему возникает ошибка «Колонка с таким именем уже существует»?
Имена колонок в таблице уникальны. Перед добавлением проверяйте наличие: Если ТЗ.Колонки.Найти("Имя") = Неопределено Тогда ... добавляем.
Можно ли изменить тип уже существующей колонки?
Напрямую — нет, свойство типа колонки доступно только для чтения. Нужно добавить новую колонку с требуемым типом, перенести значения в цикле, а старую удалить.
Работает ли Колонки.Добавить на тонком клиенте?
Да, таблица значений доступна и на тонком клиенте, но её нельзя передать между клиентом и сервером напрямую. Для обмена используют реквизит формы или сериализацию через ЗначениеВСтрокуВнутр.
Чем таблица значений отличается от дерева значений при добавлении колонок?
Синтаксис идентичен: ДеревоЗначений.Колонки.Добавить() работает так же. Разница только в структуре строк — у дерева они иерархические.
Что важно запомнить
Колонка добавляется методом ТЗ.Колонки.Добавить(Имя, Тип, Заголовок, Ширина). Тип задавайте через ОписаниеТипов с квалификаторами — это делает сортировку и итоги предсказуемыми. Перед повторным добавлением проверяйте колонку через Найти(). Для таблицы на управляемой форме дополнительно создавайте реквизит и элемент формы на сервере.