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

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

Таблица значений в 1С: способы вывода с примерами кода

Как вывести таблицу значений в 1С: отображение на форме, вывод в табличный документ, СКД и консоль. Примеры кода, типичные ошибки и ответы на вопросы.

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

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

Что такое таблица значений и почему её не видно без вывода

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

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

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

Основной способ показать таблицу пользователю — добавить реквизит формы с типом «ТаблицаЗначений» и перетащить его в дерево элементов формы. Платформа автоматически создаст табличное поле с колонками. Этот вариант подходит для управляемых форм в типовых и самописных конфигурациях.

Программно реквизит создаётся через метод ИзменитьРеквизиты(). Сначала формируется массив добавляемых реквизитов, затем — колонок таблицы, после чего программно создаётся элемент формы и привязывается к данным.

// Добавляем реквизит формы

МассивРеквизитов = Новый Массив;

МассивРеквизитов.Добавить(Новый РеквизитФормы("ТЗ", Новый ОписаниеТипов("ТаблицаЗначений")));

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТЗ"));

КонецЦикла;

ИзменитьРеквизиты(МассивРеквизитов);

// Создаём элемент формы

ЭлементТаблица = Элементы.Добавить("ТЗ", Тип("ТаблицаФормы"));

ЭлементТаблица.ПутьКДанным = "ТЗ";

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

ЭлементКолонка = Элементы.Добавить("ТЗ_" + Колонка.Имя, Тип("ПолеФормы"), ЭлементТаблица);

ЭлементКолонка.ПутьКДанным = "ТЗ." + Колонка.Имя;

КонецЦикла;

// Загружаем данные

ЗначениеВРеквизитФормы(ТаблицаДанных, "ТЗ");

Обратите внимание на последнюю строку: простое присваивание ТЗ = ТаблицаДанных не сработает, потому что реквизит формы — это данные формы, а не объект встроенного языка. Перенос выполняется через ЗначениеВРеквизитФормы().

Порядок действий для вывода на форму
  1. 1
    Добавьте реквизит формы типа «ТаблицаЗначений» и реквизиты-колонки к нему
  2. 2
    Вызовите ИзменитьРеквизиты() с сформированным массивом
  3. 3
    Создайте элемент «ТаблицаФормы» и поля колонок с путями к данным
  4. 4
    Перенесите данные через ЗначениеВРеквизитФормы()
  5. 5
    Откройте форму и проверьте, что строки и колонки отображаются

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

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

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл

ТекстСтроки = "";

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

ТекстСтроки = ТекстСтроки + " | " + Строка(СтрокаТЗ[Колонка.Имя]);

КонецЦикла;

Сообщить(ТекстСтроки);

КонецЦикла;

Для больших таблиц такой вывод перегружает окно сообщений. Практичнее выводить первые 10–20 строк или формировать строку через разделитель и выводить одним сообщением. Ещё один вариант отладки — временно выгрузить таблицу в табличный документ и показать его методом Показать().

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

Табличный документ — универсальный способ показать данные и подготовить их к печати. Создаётся макет с областями «Шапка» и «Строка», затем в цикле области выводятся с заполнением параметров. Либо можно обойтись без макета, заполняя ячейки напрямую.

ТабДок = Новый ТабличныйДокумент;

// Шапка

НомерКолонки = 1;

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

ТабДок.Область(1, НомерКолонки).Текст = Колонка.Имя;

НомерКолонки = НомерКолонки + 1;

КонецЦикла;

// Данные

НомерСтроки = 2;

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл

НомерКолонки = 1;

Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл

ТабДок.Область(НомерСтроки, НомерКолонки).Текст = СтрокаТЗ[Колонка.Имя];

НомерКолонки = НомерКолонки + 1;

КонецЦикла;

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

ТабДок.Показать("Результат выгрузки");

Этот приём часто используют как «бед man's консоль»: одной процедурой любую таблицу значений можно показать на экране без создания форм и макетов. Для печатных форм документов лучше использовать макет с именованными областями — так проще управлять оформлением и повторением шапки на каждой странице.

Универсальную процедуру вывода любой таблицы значений в табличный документ удобно держать в общем модуле. Она экономит время при отладке: одна строка вызова — и содержимое таблицы на экране.
ПЗ
Практическое замечание

Вывод через СКД и отчёт

Если таблица значений формируется программно (не запросом к базе), её можно вывести в отчёт на СКД как внешний набор данных. Для этого в схеме компоновки создаётся источник данных типа «Объект», а в модуле объекта отчёта таблица передаётся в процессор компоновки.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ВнешниеНаборы = Новый Структура("ТаблицаДанных", СформироватьТаблицу());

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,

КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(Макет, ВнешниеНаборы, ДанныеРасшифровки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры;

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

Сравнение способов вывода

Сообщить() в цикле

Для отладки. Мгновенно, но без структуры и неудобно на больших объёмах

Реквизит формы

Для интерактивной работы пользователя. Требует настройки формы, зато данные можно редактировать

Табличный документ

Для просмотра и печати. Универсально, но без интерактивности

СКД с внешним набором

Для отчётов с настройками. Сложнее в реализации, но гибче для пользователя

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

Наиболее частая проблема — попытка присвоить таблицу значений реквизиту формы напрямую. Платформа выдаст ошибку несоответствия типов, потому что на клиенте таблица представлена как ДанныеФормыКоллекция. Правильный путь — ЗначениеВРеквизитФормы() на сервере.

Вторая группа ошибок связана с контекстом выполнения. Объект ТаблицаЗначений недоступен в тонком и веб-клиенте на клиентской стороне: создавать и заполнять его нужно в серверной процедуре, а на клиент передавать через реквизит формы. Ещё одна ловушка — имена колонок с пробелами или спецсимволами: обращение СтрокаТЗ[Колонка.Имя] такие имена допускает, а вот путь к данным элемента формы с ними не собрать.

Типичные ошибки
01
Прямое присваивание ТЗ реквизиту формы — ошибка типов; нужен ЗначениеВРеквизитФормы()
02
Создание ТаблицаЗначений на клиенте в тонком клиенте — объект недоступен, работайте на сервере
03
Вывод миллионов строк через Сообщить() — зависание сеанса; ограничивайте количество строк
04
Имена колонок с пробелами — ломают путь к данным элементов формы; используйте только буквы, цифры и подчёркивания

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

После вывода на форму убедитесь, что количество строк в табличном поле совпадает с ТаблицаДанных.Количество(), а типы колонок не «съехали»: даты отображаются как даты, числа — с нужной точностью. Если колонка пустая, чаще всего причина в несовпадении имени колонки и пути к данным элемента формы.

Для табличного документа проверьте итоговые области и поведение при печати: ширину колонок, перенос строк, повторение шапки. Для СКД — откройте настройки отчёта и убедитесь, что отборы и группировки применяются к внешнему набору корректно.

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

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

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

Совпадает с ТаблицаДанных.Количество()

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

Строк меньше или таблица пустая — проверьте ЗначениеВРеквизитФормы

Значения в колонках
Норма

Данные соответствуют типам колонок

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

Пустые ячейки — несовпадение имён колонок и путей к данным

Производительность
Норма

Форма открывается быстро

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

Зависание — слишком много строк, нужен отбор или динамический список

Итог

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

Таблица значений не отображается сама по себе. Для отладки используйте Сообщить() или табличный документ, для интерфейса — реквизит формы с ЗначениеВРеквизитФормы(), для отчётов — СКД с внешним набором данных. Создавайте таблицу только на сервере.

Частые вопросы

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

Остановитесь на точке останова после заполнения таблицы, выделите переменную и нажмите «Вычислить выражение» (Shift+F9). В окне результата для таблицы значений есть кнопка просмотра содержимого в виде таблицы — это самый быстрый способ без изменения кода.

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

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

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

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

Почему на форме колонки таблицы отображаются в другом порядке?

Порядок колонок определяется порядком добавления элементов формы, а не порядком колонок в таблице значений. Если элементы создаются программно, добавляйте поля в цикле по колонкам — тогда порядок совпадёт.

Как вывести таблицу значений в Excel?

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