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

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

Таблица значений в 1С: что это и как с ней работать

Таблица значений в 1С: что это за объект, как создать, заполнить, перебрать и отсортировать строки. Примеры кода, типичные ошибки и ответы на вопросы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как заполнить таблицу строками

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

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

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

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

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

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

Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, Количество ИЗ Документ.Реализация.Товары");

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

Также строки можно скопировать из другой таблицы методом Загрузить() или добавить выборку строк методом ВыгрузитьКолонку() и ЗагрузитьКолонку() для работы с отдельными колонками.

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

Перебор строк, поиск и сортировка

Стандартный способ обхода таблицы — цикл Для Каждого. Внутри цикла доступны значения текущей строки по именам колонок:

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

Сообщить(Строка.Номенклатура);

КонецЦикла;

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

Сортировка выполняется методом Сортировать() с указанием колонок и направления: ТЗ.Сортировать("Цена Убыв, Номенклатура Возр"). После сортировки меняется физический порядок строк, поэтому сохранённые ранее индексы строк становятся недействительными.

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

Свёртка и итоги: как сгруппировать данные

Метод Свернуть() группирует строки по указанным колонкам и суммирует числовые значения. Например, ТЗ.Свернуть("Номенклатура", "Количество,Сумма") оставит по одной строке на каждый товар с суммарными количеством и суммой. Это аналог группировки в запросе, но выполняется уже в памяти.

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

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

Когда таблица значений не подходит: альтернативы

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

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

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

Сравнение инструментов

Таблица значений

Универсальная обработка в памяти: сортировка, свёртка, поиск. Ограничение — весь объём загружается в память.

Выборка из запроса

Построчное чтение данных из базы, экономит память. Не поддерживает произвольную сортировку и модификацию строк.

Дерево значений

Подходит для иерархических данных с группами. Избыточно для плоских списков.

Массив структур

Лёгкий формат для передачи между клиентом и сервером. Нет встроенных методов сортировки и свёртки.

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

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

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

Также не стоит забывать, что метод Найти() чувствителен к типу значения. Поиск строки «5» по числовой колонке со значением 5 не даст результата — типы должны совпадать.

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

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

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

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

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

Ноль строк или явно больше, чем должно быть — проверьте источник данных

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

Значения в колонках соответствуют заявленным типам, итоги считаются корректно

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

Итог равен нулю при заполненных строках — вероятно, колонка строкового типа

Результат свёртки
Норма

По одной строке на каждое уникальное сочетание колонок группировки

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

Дублирующиеся строки групп — колонки группировки указаны неверно

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

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

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

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

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

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

Напрямую нет — объект живёт только в памяти. Для сохранения используют сериализацию: преобразование в XML, JSON или помещение в хранилище значения. При следующем сеансе данные восстанавливают из сохранённого формата.

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

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

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

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

Итог

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

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