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