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

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

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

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

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

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

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

Создание таблицы и добавление колонок

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

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

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

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

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

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

Имя колонки должно быть корректным идентификатором: без пробелов, начиная с буквы. Обращение к несуществующей колонке вызовет ошибку исполнения, поэтому имена лучше выносить в переменные или строго контролировать при динамическом формировании структуры.

Типизация колонок через ОписаниеТипов

Явная типизация — признак аккуратного кода. Тип задаётся объектом ОписаниеТипов:

МассивТипов = Новый Массив;

МассивТипов.Добавить(Тип("Число"));

ОписаниеЧисла = Новый ОписаниеТипов(МассивТипов, Новый КвалификаторыЧисла(15, 2));

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

ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));

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

Для ссылочных типов указывается конкретный тип, например Новый ОписаниеТипов("СправочникСсылка.Номенклатура"). Составной тип задаётся перечислением через запятую: "СправочникСсылка.Номенклатура,СправочникСсылка.Контрагенты".

Добавление и заполнение строк

Строки добавляются методом Добавить(), который возвращает новую строку. Дальше поля заполняются по именам колонок:

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = ТекущаяСсылка;

НоваяСтрока.Количество = 5;

НоваяСтрока.Цена = 1200.50;

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

Порядок создания таблицы значений
  1. 1
    Объявите переменную: ТЗ = Новый ТаблицаЗначений
  2. 2
    Добавьте колонки через Колонки.Добавить() с указанием типов
  3. 3
    Заполните строки в цикле методом Добавить()
  4. 4
    При необходимости добавьте индекс: ТЗ.Индексы.Добавить("Номенклатура")
  5. 5
    Проверьте результат: ТЗ.Количество() и содержимое первых строк

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

На практике чаще всего таблицу значений не заполняют вручную, а получают из запроса методом Выгрузить():

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Номенклатура,

| Номенклатура.Код КАК Код

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

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

У такой таблицы структура колонок формируется автоматически по полям запроса, типы берутся из метаданных. Это быстрый и надёжный способ, но у него есть ограничение: если запрос содержит итоги, в таблицу попадут и итоговые строки. Чтобы получить только детальные записи, применяйте Выгрузить(ОбходРезультатаЗапроса.Прямой) или убирайте итоги из текста запроса.

Поиск, сортировка, свёртка и индексы

После заполнения с таблицей работают встроенные методы коллекции:

  • Найти(Значение, "Номенклатура") — возвращает первую найденную строку или Неопределено;
  • НайтиСтроки(ПараметрыОтбора) — возвращает массив строк по структуре отбора;
  • Сортировать("Цена Убыв, Наименование") — сортировка по одной или нескольким колонкам;
  • Свернуть("Номенклатура", "Количество,Сумма") — группировка с суммированием числовых колонок;
  • Итог("Сумма") — итог по числовой колонке;
  • ВыгрузитьКолонку("Номенклатура") — массив значений колонки, удобно для передачи в параметр запроса.

Если поиск по таблице выполняется многократно в цикле, добавьте индекс: ТЗ.Индексы.Добавить("Номенклатура"). Без индекса каждый вызов Найти() перебирает всю таблицу, и на больших объёмах (десятки тысяч строк) это становится заметным узким местом.

Типичные ошибки и ограничения

Первая частая ошибка — обращение к колонке, которой нет в структуре. Проверить наличие можно так: Если ТЗ.Колонки.Найти("Сумма") <> Неопределено Тогда .... Это особенно важно, когда структура формируется динамически.

Вторая ошибка — ожидание, что Свернуть() создаст новую таблицу. На самом деле метод изменяет текущую таблицу. Если исходные данные ещё нужны, сначала сделайте копию: ТЗСводная = ТЗ.Скопировать(); ТЗСводная.Свернуть(...).

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

Типичные ошибки
01
Свертка исходной таблицы без копии — теряются детальные данные
02
Поиск в цикле без индекса — резкое падение производительности на больших таблицах
03
Колонки без типа — ошибки сортировки смешанных значений и некорректная свёртка
04
Попытка передать ТаблицаЗначений с сервера на клиент в управляемой форме — ошибка сериализации
05
Обращение к колонке без проверки её существования — падение кода при изменении структуры

Проверка результата

После создания таблицы полезно убедиться, что она заполнена как ожидалось. Минимальный набор проверок: количество строк (ТЗ.Количество()), наличие обязательных колонок, контроль итоговой суммы по ключевой числовой колонке. При отладке удобно вывести содержимое в сообщение или воспользоваться табло в конфигураторе — команда «Вычислить выражение» показывает таблицу в виде сетки.

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

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

Количество строк
Норма

ТЗ.Количество() соответствует ожидаемому числу записей

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

0 строк при ожидаемых данных — проверьте условия запроса или цикл заполнения

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

Числовые колонки содержат числа, итог считается корректно

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

Итог равен 0 или неверен — вероятно, колонка строкового типа

Поиск значений
Норма

Найти() возвращает строку по известному ключу

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

Возвращается Неопределено — проверьте тип значения поиска и наличие колонки

Итог

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

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

Частые вопросы

Чем таблица значений отличается от дерева значений?

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

Как удалить дубли строк в таблице значений?

Специального метода нет. Стандартный приём — свёртка по всем колонкам: ТЗ.Свернуть("Колонка1,Колонка2,Колонка3") без суммируемых колонок. Либо перебор с поиском через НайтиСтроки() и удалением совпадений методом Удалить().

Можно ли использовать таблицу значений в запросе?

Да. Таблица передаётся как параметр запроса и помещается во временную таблицу конструкцией «ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ ИЗ &ТЗ КАК ТЗ». Дальше временная таблица соединяется с данными базы. Это основной способ отбора по заранее подготовленному списку значений.

Как выгрузить таблицу значений в табличный документ или Excel?

В табличный документ — построчным выводом областей через метод Вывести() или построителем отчёта. Для Excel обычно формируют табличный документ и сохраняют его методом Записать() с типом файла XLSX. Прямой выгрузки объекта в файл нет.

Есть ли ограничение на количество строк в таблице значений?

Жёсткого ограничения в платформе нет — предел определяется доступной оперативной памятью сервера или клиента. На практике таблицы в сотни тысяч строк работают, но операции без индексов и свёртки по многим колонкам начинают заметно тормозить, поэтому большие объёмы лучше обрабатывать запросами.

Как добавить колонку в уже заполненную таблицу?

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