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

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

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

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

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

Разработчик создаёт таблицу значений вручную через конструктор Новый ТаблицаЗначений, либо получает готовую как результат выполнения запроса или выгрузки из другой таблицы. Дальше с ней работают: добавляют колонки и строки, сортируют, ищут значения, сворачивают дубли и передают в формы и отчёты.

Ниже разобран полный цикл работы: от создания пустой таблицы до типовых операций и частых ошибок. Примеры кода подходят для управляемых и обычных форм на платформе 1С:Предприятие 8.3.

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

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

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

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

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

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

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

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

Заполнение таблицы строками

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

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

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

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

НоваяСтрока.Сумма = 1500;

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

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

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

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

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

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

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

"ВЫБРАТЬ

| Номенклатура,

| СУММА(Количество) КАК Количество

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки

|СГРУППИРОВАТЬ ПО

| Номенклатура";

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

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

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

Основные операции: поиск, сортировка, свёртка

После заполнения с таблицей выполняют типовые операции. Наиболее используемые собраны ниже.

Сортировка. Метод Сортировать("Сумма Убыв, Номенклатура") упорядочивает строки по одной или нескольким колонкам. Направление задаётся ключевыми словами «Возр» и «Убыв».

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

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

Итоги. ТЗ.Итог("Сумма") возвращает сумму по числовой колонке без изменения таблицы. Это быстрый способ получить контрольное число для проверки.

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

Ручное создание

Полный контроль над структурой и типами; подходит для промежуточных расчётов, но требует больше кода

Выгрузка из запроса

Быстро и безопасно по типам; структура жёстко привязана к полям запроса

Выгрузка табличной части

Документ.Товары.Выгрузить() — готовая копия табличной части; изменения не попадают обратно в документ автоматически

Загрузка из внешнего файла

Через построитель отчёта или чтение Excel/CSV; требует контроля типов после импорта

Вывод таблицы на форму и в отчёт

Чтобы пользователь увидел таблицу значений, её размещают в реквизите формы. В управляемой форме создают реквизит типа «ТаблицаЗначений» с подчинёнными реквизитами-колонками, добавляют на форму табличное поле и заполняют реквизит программно через ЗначениеВРеквизитФормы() или прямое присваивание в обработчике на сервере.

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

В СКД (системе компоновки данных) таблицу значений можно передать как внешний набор данных через объект «ВнешниеНаборыДанных» в процедуре ПриКомпоновкеРезультата. Это позволяет строить полноценные отчёты с настройками по данным, полученным не запросом, а программно.

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

Частые ошибки и ограничения

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

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

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

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

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

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

Структура таблицы
Норма

ТЗ.Колонки.Количество() соответствует ожиданию, типы заданы

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

Колонок ноль или типы «произвольные» там, где нужна строгая типизация

Наполнение
Норма

ТЗ.Количество() больше нуля, итоги сходятся с источником

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

Таблица пуста — проверьте условия запроса или цикл заполнения

Поиск
Норма

Найти() возвращает строку с ожидаемыми значениями

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

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

FAQ

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

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

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

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

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

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

Как объединить две таблицы значений?

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

Почему Сортировать() работает непредсказуемо?

Чаще всего причина в смешанных типах значений в колонке без явного описания типов: числа, строки и Неопределено сравниваются по особым правилам. Задайте колонке строгое описание типов при создании — порядок сортировки станет детерминированным.

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

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

Итог

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

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