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