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