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

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

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

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

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

Материал рассчитан на разработчиков, работающих с управляемым кодом 1С:Предприятие 8.3. Все примеры выполняются на сервере или в толстом клиенте; на тонком клиенте таблица значений недоступна напрямую — там используют её аналог в виде данных формы.

Базовый синтаксис метода Колонки.Добавить

Минимальный вызов выглядит так:

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

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

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

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

Если колонка с таким именем уже существует, платформа выдаст ошибку «Колонка с таким именем уже существует». Поэтому перед добавлением в универсальном коде полезно проверять наличие:

Если ТЗ.Колонки.Найти("Сумма") = Неопределено Тогда

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

КонецЕсли;

Задание типа колонки через ОписаниеТипов

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

Примеры типизации:

// Строка длиной 100

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

// Число 15.2

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

// Дата без времени

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

// Ссылка на справочник

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

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

Заполнение новой колонки данными

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

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

СтрокаТЗ.СуммаСНДС = СтрокаТЗ.Сумма * 1.2;

КонецЦикла;

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

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

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

РезультатЗапроса = Запрос.Выполнить();

ТЗ = РезультатЗапроса.Выгрузить();

ТЗ.Колонки.Добавить("ПризнакОшибки", Новый ОписаниеТипов("Булево"));

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

СтрокаТЗ.ПризнакОшибки = (СтрокаТЗ.Остаток < 0);

КонецЦикла;

Обратите внимание: метод Выгрузить() возвращает новую таблицу значений, которую можно свободно модифицировать. А вот дерево значений, полученное через Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам), тоже поддерживает Колонки.Добавить() — синтаксис идентичен.

Добавление колонки в таблицу значений на форме

Реквизит формы типа «ТаблицаЗначений» нельзя изменить простым вызовом Колонки.Добавить() — на форме это данные формы, а не сам объект. Структуру меняют на сервере через массив добавляемых реквизитов:

&НаСервере

Процедура ДобавитьКолонкуНаСервере()

Добавляемые = Новый Массив;

Добавляемые.Добавить(Новый РеквизитФормы("Комментарий",

Новый ОписаниеТипов("Строка"), "ТаблицаДанных", "Комментарий"));

ИзменитьРеквизиты(Добавляемые);

КонецПроцедуры

После ИзменитьРеквизиты() колонка появится в данных, но элемент формы (видимая колонка таблицы) нужно создать программно отдельно — через Элементы.Добавить() с указанием пути к данным. Это частая причина вопроса «колонку добавил, а её не видно».

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

Проверка результата и полезные приёмы

Убедиться, что колонка добавлена корректно, можно несколькими способами. В отладчике проверьте ТЗ.Колонки.Найти("Имя") — должен вернуться объект колонки, а не Неопределено. Тип проверяется через ТЗ.Колонки.Имя.ТипЗначения.

Полезные смежные операции: ТЗ.Колонки.Вставить(Индекс, Имя) добавляет колонку в конкретную позицию, ТЗ.Колонки.Сдвинуть() меняет порядок, а ТЗ.Колонки.Имя.Имя = "НовоеИмя" переименовывает колонку без потери данных.

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

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

Наличие колонки
Норма

Колонки.Найти(Имя) возвращает объект

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

Возвращается Неопределено — добавление не выполнено

Тип колонки
Норма

ТипЗначения содержит ожидаемый тип

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

Тип «Произвольный» там, где нужен конкретный

Заполнение строк
Норма

Значения присвоены во всех строках

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

Пустые значения — цикл заполнения не отработал

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

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

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

Как добавить колонку в середину таблицы, а не в конец?

Используйте ТЗ.Колонки.Вставить(Индекс, Имя, Тип) — колонка встанет на указанную позицию, остальные сдвинутся вправо. Либо добавьте в конец и сместите методом Колонки.Сдвинуть(Колонка, Смещение).

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

Запрос требует, чтобы все колонки таблицы-параметра были типизированы. Если колонка добавлена без ОписаниеТипов, приведите её тип явно: удалите и добавьте заново с нужным типом, либо сформируйте таблицу корректно с самого начала.

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

Достаточно присвоить новое значение свойству Имя объекта колонки: ТЗ.Колонки.СтароеИмя.Имя = "НовоеИмя". Данные в строках сохраняются, меняется только идентификатор колонки.

Можно ли добавить колонку в табличную часть документа программно?

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

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

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

Итог

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

Колонка добавляется методом Колонки.Добавить с именем, типом и заголовком. Всегда проверяйте дубли, задавайте тип явно и заполняйте значения в цикле. Структуру реквизита формы меняйте только на сервере через ИзменитьРеквизиты.