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