Разработка и Конфигурация · 9 мин
Как программно создать таблицу значений в 1С
Как программно создать таблицу значений в 1С: добавление колонок и строк, типизация, заполнение из запроса, сортировка и свёртка. Примеры кода и типичные ошибки.
Таблица значений — один из самых востребованных объектов встроенного языка 1С. Она используется для промежуточного хранения данных, обмена между процедурами, выгрузки результатов запросов, построения отчётов и передачи информации в табличные поля форм. Создать её программно можно за несколько строк кода, но у объекта есть особенности, о которых нужно знать заранее: типизация колонок, индексы, ограничения по сериализации.
Объект создаётся конструктором Новый ТаблицаЗначений. Сразу после создания таблица пустая: у неё нет ни колонок, ни строк. Структура задаётся через коллекцию Колонки, а данные добавляются методом Добавить() коллекции строк. Дальше с таблицей можно работать как с полноценным набором данных: искать, сортировать, сворачивать, выгружать.
Ниже разобран полный цикл работы: от создания структуры до проверки результата, а также типичные ошибки, которые приводят к падению кода или неверным данным.
Создание таблицы и добавление колонок
Минимальный код создания таблицы с одной колонкой выглядит так:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("Цена");
Метод Колонки.Добавить() принимает четыре параметра: имя колонки (обязательный), описание типа, заголовок для отображения и ширину. Если тип не указан, колонка будет хранить значения произвольного типа — это работает, но затрудняет сортировку, свёртку и контроль данных.
Имя колонки должно быть корректным идентификатором: без пробелов, начиная с буквы. Обращение к несуществующей колонке вызовет ошибку исполнения, поэтому имена лучше выносить в переменные или строго контролировать при динамическом формировании структуры.
Типизация колонок через ОписаниеТипов
Явная типизация — признак аккуратного кода. Тип задаётся объектом ОписаниеТипов:
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
ОписаниеЧисла = Новый ОписаниеТипов(МассивТипов, Новый КвалификаторыЧисла(15, 2));
ТЗ.Колонки.Добавить("Сумма", ОписаниеЧисла);
ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
ТЗ.Колонки.Добавить("Наименование", ОписаниеСтроки);
Для ссылочных типов указывается конкретный тип, например Новый ОписаниеТипов("СправочникСсылка.Номенклатура"). Составной тип задаётся перечислением через запятую: "СправочникСсылка.Номенклатура,СправочникСсылка.Контрагенты".
Добавление и заполнение строк
Строки добавляются методом Добавить(), который возвращает новую строку. Дальше поля заполняются по именам колонок:
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = ТекущаяСсылка;
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 1200.50;
Часто таблица заполняется в цикле по выборке запроса или другой таблице. Для копирования строк из одной таблицы в другую с совпадающей структурой удобен метод ЗаполнитьЗначенияСвойств() или построчное копирование через ТЗ.Добавить() с присваиванием полей. Если нужно скопировать всю таблицу целиком, используйте метод Скопировать() — он создаёт полную независимую копию, а не ссылку на тот же объект.
- 1Объявите переменную: ТЗ = Новый ТаблицаЗначений
- 2Добавьте колонки через Колонки.Добавить() с указанием типов
- 3Заполните строки в цикле методом Добавить()
- 4При необходимости добавьте индекс: ТЗ.Индексы.Добавить("Номенклатура")
- 5Проверьте результат: ТЗ.Количество() и содержимое первых строк
Получение таблицы из запроса
На практике чаще всего таблицу значений не заполняют вручную, а получают из запроса методом Выгрузить():
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
ТЗ = Запрос.Выполнить().Выгрузить();
У такой таблицы структура колонок формируется автоматически по полям запроса, типы берутся из метаданных. Это быстрый и надёжный способ, но у него есть ограничение: если запрос содержит итоги, в таблицу попадут и итоговые строки. Чтобы получить только детальные записи, применяйте Выгрузить(ОбходРезультатаЗапроса.Прямой) или убирайте итоги из текста запроса.
Поиск, сортировка, свёртка и индексы
После заполнения с таблицей работают встроенные методы коллекции:
Найти(Значение, "Номенклатура")— возвращает первую найденную строку или Неопределено;НайтиСтроки(ПараметрыОтбора)— возвращает массив строк по структуре отбора;Сортировать("Цена Убыв, Наименование")— сортировка по одной или нескольким колонкам;Свернуть("Номенклатура", "Количество,Сумма")— группировка с суммированием числовых колонок;Итог("Сумма")— итог по числовой колонке;ВыгрузитьКолонку("Номенклатура")— массив значений колонки, удобно для передачи в параметр запроса.
Если поиск по таблице выполняется многократно в цикле, добавьте индекс: ТЗ.Индексы.Добавить("Номенклатура"). Без индекса каждый вызов Найти() перебирает всю таблицу, и на больших объёмах (десятки тысяч строк) это становится заметным узким местом.
Типичные ошибки и ограничения
Первая частая ошибка — обращение к колонке, которой нет в структуре. Проверить наличие можно так: Если ТЗ.Колонки.Найти("Сумма") <> Неопределено Тогда .... Это особенно важно, когда структура формируется динамически.
Вторая ошибка — ожидание, что Свернуть() создаст новую таблицу. На самом деле метод изменяет текущую таблицу. Если исходные данные ещё нужны, сначала сделайте копию: ТЗСводная = ТЗ.Скопировать(); ТЗСводная.Свернуть(...).
Третья группа проблем связана с передачей таблицы между клиентом и сервером в управляемых формах. Таблица значений не сериализуется напрямую в тонком клиенте — для передачи на форму используют реквизит формы типа «ТаблицаЗначений» (динамический список значений) или преобразование через ЗначениеВСтрокуВнутр() на сервере, если контекст это допускает. Для передачи в запрос таблицу помещают во временную таблицу через менеджер временных таблиц.
Проверка результата
После создания таблицы полезно убедиться, что она заполнена как ожидалось. Минимальный набор проверок: количество строк (ТЗ.Количество()), наличие обязательных колонок, контроль итоговой суммы по ключевой числовой колонке. При отладке удобно вывести содержимое в сообщение или воспользоваться табло в конфигураторе — команда «Вычислить выражение» показывает таблицу в виде сетки.
Как проверить результат
ТЗ.Количество() соответствует ожидаемому числу записей
0 строк при ожидаемых данных — проверьте условия запроса или цикл заполнения
Числовые колонки содержат числа, итог считается корректно
Итог равен 0 или неверен — вероятно, колонка строкового типа
Найти() возвращает строку по известному ключу
Возвращается Неопределено — проверьте тип значения поиска и наличие колонки
Что важно запомнить
Таблица создаётся через Новый ТаблицаЗначений, структура задаётся Колонки.Добавить() с ОписаниеТипов, строки — методом Добавить(). Для поиска добавляйте индексы, перед свёрткой делайте копию, а большие объёмы не выгружайте в память целиком.
Частые вопросы
Чем таблица значений отличается от дерева значений?
Таблица значений — плоская структура строк и колонок. Дерево значений дополнительно хранит иерархию: у каждой строки есть коллекция подчинённых строк и ссылка на родителя. Дерево используют для иерархических данных, например групп номенклатуры с вложенными позициями.
Как удалить дубли строк в таблице значений?
Специального метода нет. Стандартный приём — свёртка по всем колонкам: ТЗ.Свернуть("Колонка1,Колонка2,Колонка3") без суммируемых колонок. Либо перебор с поиском через НайтиСтроки() и удалением совпадений методом Удалить().
Можно ли использовать таблицу значений в запросе?
Да. Таблица передаётся как параметр запроса и помещается во временную таблицу конструкцией «ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ ИЗ &ТЗ КАК ТЗ». Дальше временная таблица соединяется с данными базы. Это основной способ отбора по заранее подготовленному списку значений.
Как выгрузить таблицу значений в табличный документ или Excel?
В табличный документ — построчным выводом областей через метод Вывести() или построителем отчёта. Для Excel обычно формируют табличный документ и сохраняют его методом Записать() с типом файла XLSX. Прямой выгрузки объекта в файл нет.
Есть ли ограничение на количество строк в таблице значений?
Жёсткого ограничения в платформе нет — предел определяется доступной оперативной памятью сервера или клиента. На практике таблицы в сотни тысяч строк работают, но операции без индексов и свёртки по многим колонкам начинают заметно тормозить, поэтому большие объёмы лучше обрабатывать запросами.
Как добавить колонку в уже заполненную таблицу?
Метод Колонки.Добавить() работает в любой момент — новая колонка появится у всех существующих строк со значением Неопределено (или пустым значением заданного типа). После добавления колонку можно заполнить в цикле по строкам.