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

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

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

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

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

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

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

Чем таблица значений отличается от других табличных объектов 1С

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

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

Что выбрать для хранения данных

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

Временные данные в памяти, нужна гибкая обработка: сортировка, свёртка, поиск. Не сохраняется в базу.

Табличная часть объекта

Данные принадлежат документу или справочнику и должны храниться в базе вместе с ним.

Запрос

Большие объёмы данных из базы, фильтрация и соединения средствами СУБД — быстрее, чем перебор в памяти.

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

Иерархические данные с подчинёнными строками, например для вывода в виде дерева на форме.

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

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

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

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

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

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

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

Как добавлять строки и заполнять данные

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

Для Каждого Элемент Из МассивДанных Цикл

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

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

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

КонецЦикла;

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

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

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

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

НайденныеСтроки = Таблица.НайтиСтроки(Отбор);

Для Каждого Строка Из НайденныеСтроки Цикл

// обработка строки

КонецЦикла;

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

Типичные ошибки
01
Удаление строк внутри цикла перебора таблицы — индексы смещаются, часть строк пропускается. Удаляйте с конца (обратный цикл) или собирайте строки в массив и удаляйте после цикла.
02
Поиск по колонке без индекса в таблице на десятки тысяч строк внутри цикла — время работы растёт квадратично. Добавьте индекс или перенесите логику в запрос.
03
Присваивание таблицы другой переменной вместо Скопировать() — обе переменные указывают на один объект, и правка одной ломает данные другой.

Свёртка, итоги и группировка данных

Метод Свернуть("Номенклатура", "Количество") группирует строки по указанным колонкам и суммирует числовые колонки из второго параметра. Это аналог группировки в запросе, выполняемый в памяти. После свёртки в таблице остаются только колонки группировки и суммируемые колонки — остальные удаляются, поэтому перед свёрткой часто делают копию таблицы.

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

Перед свёрткой проверьте, что суммируемые колонки типизированы как числа. Если колонка без типа и в ней встречаются значения Неопределено, итог может оказаться неожиданным. Лучше заранее заполнить пустые значения нулями.
ПЗ
Практическое замечание

Выгрузка таблицы в запрос и передача на форму

Один из самых полезных приёмов — передать готовую таблицу значений в запрос как параметр и соединить её с данными базы. Для этого таблицу помещают во временную таблицу через конструкцию ВЫБРАТЬ ... ПОМЕСТИТЬ с источником &Таблица. Так можно, например, получить актуальные цены для списка номенклатуры, собранного в коде.

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

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

"ВЫБРАТЬ Т.Номенклатура, Т.Количество

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

|ИЗ &Таблица КАК Т";

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

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

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

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

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

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

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

Количество строк после загрузки
Норма

Совпадает с количеством записей в источнике (файле, выборке)

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

Строк меньше или больше — проверьте условия цикла и фильтры

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

Заданы явно через ОписаниеТипов, сортировка работает корректно

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

Смешанные типы, сортировка чисел идёт как строки

Итог по суммовой колонке
Норма

Совпадает с контрольной суммой источника

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

Расхождение — ищите пропущенные строки или значения Неопределено

Часто задаваемые вопросы

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

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

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

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

Как удалить все строки таблицы?

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

Почему НайтиСтроки возвращает пустой массив, хотя значение есть?

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

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

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

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

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

Итог

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

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