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