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

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

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

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

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

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

Создание таблицы значений и описание колонок

Объект создаётся одной строкой кода. Сразу после создания таблица пустая: в ней нет ни колонок, ни строк, поэтому следующий шаг — описать структуру.

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

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

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

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

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

Для типизации используется объект ОписаниеТипов. Он ограничивает допустимые значения колонки и защищает от ошибок при сортировке и итогах: попытка сложить строку с числом вызовет ошибку исполнения.

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

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

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

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

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

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

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

НоваяСтрока.Номенклатура = "Товар А";

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

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

Типичный сценарий — заполнение таблицы в цикле: при обходе выборки из запроса, при чтении файла или при переборе массива. В этом случае строка создаётся внутри цикла, а значения берутся из текущего элемента источника.

Пока Выборка.Следующий() Цикл

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

ЗаполнитьЗначенияСвойств(СтрокаТЗ, Выборка);

КонецЦикла;

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

Создание таблицы из результата запроса

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

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

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

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

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

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

Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

"ВЫБРАТЬ

| Таб.Номенклатура КАК Номенклатура,

| Таб.Количество КАК Количество

|ПОМЕСТИТЬ ВТ_Данные

|ИЗ

| &ТЗ КАК Таб";

Запрос.УстановитьПараметр("ТЗ", ТЗ);

Запрос.Выполнить();

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

Обработка: сортировка, поиск, свёртка и итоги

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

ТЗ.Сортировать("Цена Убыв, Номенклатура Возр");

Свёртка группирует строки по указанным колонкам и суммирует числовые поля. Это аналог группировки в запросе, но выполняется в памяти:

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

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

Нужна одна строка по значениюНайти()

Вернёт строку или Неопределено, если совпадений нет

Нужны все строки по условиюНайтиСтроки()

Вернёт массив строк по отбору через структуру

Нужна сумма по колонкеИтог()

Работает только с числовыми колонками

Нужна группировка с суммамиСвернуть()

Изменяет саму таблицу, удаляя детальные строки

Копирование, очистка и передача таблицы

Присваивание ТЗ2 = ТЗ не создаёт копию — обе переменные будут указывать на один объект, и изменение одной затронет другую. Для независимой копии используется метод Скопировать(), который умеет дополнительно отбирать строки и колонки:

Отбор = Новый Структура("Номенклатура", ИскомыйТовар);

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

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

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

Типичные ошибки при работе с таблицей значений

Большинство проблем у начинающих разработчиков связано с немногими повторяющимися причинами. Знание их заранее экономит время отладки.

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

Типичные ошибки
01
Присваивание ТЗ2 = ТЗ вместо Скопировать() — обе переменные ссылаются на один объект, правки дублируются
02
Свёртка исходной таблицы, когда детальные данные ещё нужны — работайте с копией
03
Сравнение результата Найти() без проверки на Неопределено — ошибка при обращении к полям строки
04
Попытка передать таблицу значений на клиент напрямую — используйте реквизит формы
05
Смешение типов в одной колонке — сортировка и итоги работают непредсказуемо

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

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

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

Сообщить(СтрокаТЗ.Номенклатура.Наименование + " — " + СтрокаТЗ.Количество);

КонецЦикла;

В конфигураторе таблицу значений можно посмотреть визуально: в режиме отладки через «Вычислить выражение» (Shift+F9) таблица отображается в виде сетки со строками и колонками. Это самый наглядный способ проверить структуру и данные до передачи таблицы в дальнейшую обработку.

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

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

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

ТЗ.Количество() больше нуля и совпадает с ожиданием

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

Ноль строк — проверьте источник данных и условия цикла

Структура колонок
Норма

Все нужные колонки есть, типы заданы явно

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

Обращение к колонке вызывает ошибку «Поле не обнаружено»

Итоги
Норма

Итог по числовой колонке сходится с контрольным значением

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

Итог нулевой или искажён — проверьте типы и свёртку

Частые вопросы о таблице значений

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

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

Можно ли создать таблицу значений на клиенте?

В тонком и веб-клиенте объект ТаблицаЗначений недоступен напрямую. Таблицу создают и заполняют на сервере, а на клиент передают через реквизит формы или массив структур. В толстом клиенте объект доступен полностью.

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

Проще всего скопировать таблицу с нужными колонками и свернуть её без указания суммируемых колонок: ТЗ.Свернуть("Колонка1, Колонка2"). Строки с одинаковыми значениями перечисленных колонок объединятся в одну.

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

Переберите строки в цикле и для каждой создайте структуру, заполнив её значениями колонок, затем добавьте структуру в массив. Такой массив можно передавать между клиентом и сервером и сериализовать в JSON.

Сохраняется ли таблица значений в базе данных?

Нет, объект существует только в памяти во время выполнения кода. Чтобы сохранить данные, их нужно записать в регистр, справочник или документ либо сериализовать таблицу через ЗначениеВСтрокуВнутр() и сохранить как строку.

Как отсортировать таблицу по колонке со смешанными типами?

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

Итог

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

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