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

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

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

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

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

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

Ниже разобраны оба способа с готовыми примерами кода, различия для управляемых и обычных форм, проверка результата и типичные ошибки, из-за которых документ выводится пустым или с обрезанными данными.

Что понадобится перед началом работы

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

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

Способ 1. Вывод через макет с областями

Макет создаётся в конфигураторе: у объекта (обработки, отчёта, документа) добавьте макет типа «Табличный документ». В макете выделите строки-шаблоны и задайте им имена областей через свойство «Имя» — обычно это «Шапка», «Строка», «Подвал». В ячейках, куда должны попасть данные, укажите параметры в квадратных скобках, например [Номенклатура], и установите свойство ячейки «Заполнение» в значение «Параметр».

Код вывода выглядит так: получаем макет, получаем из него области, заполняем параметры и выводим. Параметры области удобно заполнять методом Заполнить, передавая строку таблицы значений — имена колонок должны совпадать с именами параметров в макете.

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

Макет = ПолучитьМакет("Макет");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

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

ОбластьСтрока.Параметры.Заполнить(СтрокаТЗ);

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

ТабДок.Вывести(ОбластьПодвал);

Признак правильной настройки: при изменении данных в таблице значений документ перестраивается без правки макета, а форматирование (шрифты, границы, цвета) остаётся стабильным, потому что задано один раз в шаблоне.

Порядок действий с макетом
  1. 1
    Создайте макет типа Табличный документ и задайте области Шапка, Строка, Подвал
  2. 2
    В ячейках области Строка пропишите параметры [ИмяКолонки] и установите заполнение Параметр
  3. 3
    В коде создайте ТабличныйДокумент и получите макет методом ПолучитьМакет
  4. 4
    Выведите шапку, затем в цикле по строкам таблицы заполняйте параметры области и выводите её
  5. 5
    Выведите подвал и покажите документ или отправьте на печать
  6. 6
    Проверьте, что все строки выведены и итоги совпадают с данными таблицы

Способ 2. Программный вывод без макета

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

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

// Шапка из имён колонок

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

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

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

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

КонецЦикла;

// Данные

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

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

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

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

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

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

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

Строка(СтрокаТЗ[Колонка.Имя]);

КонецЦикла;

КонецЦикла;

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

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

Вывод через макет

Подходит для печатных форм и отчётов пользователям. Форматирование в шаблоне, код короче. Требует синхронизации имён параметров и колонок.

Программное заполнение

Подходит для служебного просмотра и универсальных процедур. Не нужен макет, структура берётся из самой таблицы. Форматирование придётся задавать кодом.

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

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

Вывод на управляемой форме и в обычном приложении

В управляемом приложении табличный документ формируется на сервере, а показывается через реквизит формы. Добавьте реквизит формы типа ТабличныйДокумент, перетащите его в дерево элементов формы — получится поле табличного документа. В серверной процедуре заполните этот реквизит как обычную переменную: ТабличныйДокументНаФорме.Очистить(); затем вывод области. После окончания серверного вызова форма отобразит результат автоматически.

В обычном приложении элемент формы «ПолеТабличногоДокумента» доступен напрямую, и вывод выполняется в него без промежуточного реквизита. Код построения самого документа при этом идентичен — отличается только способ доставки результата на экран.

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

Третий вариант: вывод через СКД

Если таблица значений — результат сложной обработки, а пользователю нужны отборы, сортировки и группировки, таблицу можно передать в схему компоновки данных как внешний набор. В схеме создаётся источник данных типа «Объект», описываются поля, затем в коде таблица передаётся через ПроцессорКомпоновкиДанных с коллекцией внешних наборов.

Этот путь оправдан, когда простой вывод уже не закрывает потребности: пользователи просят менять порядок колонок, фильтровать строки, строить итоги по группам. Для разового вывода «как есть» СКД — избыточное усложнение.

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

После построения документа проверьте три вещи: количество выведенных строк данных равно количеству строк таблицы значений, итоговые суммы в подвале совпадают с итогом по колонке таблицы, при экспорте в Excel числа остаются числами, а не превращаются в текст. Быстрый способ сверки — вычислить ТаблицаЗначений.Итог("Сумма") и сравнить с итогом в документе.

Типичные ошибки
01
Имя параметра в макете не совпадает с именем колонки таблицы — ячейки выводятся пустыми без сообщения об ошибке
02
В ячейке макета забыли установить заполнение Параметр — вместо значения выводится текст [ИмяПараметра]
03
Область Строка получена один раз, но параметры не очищаются между итерациями — в пустые поля подтягиваются значения предыдущей строки
04
Запись чисел через свойство Текст — при экспорте в Excel суммы становятся текстом и не участвуют в формулах
05
Вызов ПолучитьМакет на клиенте в управляемом приложении — ошибка выполнения метода
06
Вывод в реквизит формы без предварительного Очистить — при повторном формировании строки дублируются

Отдельная группа проблем — производительность. Построчный вывод области с тысячами строк работает медленно, потому что каждый вызов Вывести модифицирует документ. Для больших таблиц используйте метод НачатьАвтогруппировкуСтрок только при необходимости группировок, а основной приём ускорения — вывод через СКД или сокращение объёма данных перед выводом.

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

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

Число строк данных в документе
Норма

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

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

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

Итоговая сумма в подвале
Норма

Совпадает с ТаблицаЗначений.Итог по колонке

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

Расходится — проверьте заполнение параметров и типы данных

Экспорт в Excel
Норма

Числа и даты сохраняют тип, доступны формулы

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

Все ячейки текстовые — данные писались через свойство Текст

Повторное формирование
Норма

Документ перестраивается без дублей

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

Строки добавляются к прежним — документ не очищался

Ограничения и меры предосторожности

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

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

FAQ

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

Готовой команды «преобразовать» в платформе нет, но для служебных задач пишут универсальную процедуру из 15–20 строк, которая строит шапку из коллекции Колонки и выводит строки в цикле. Такой код из раздела о программном выводе легко сделать общей процедурой и вызывать для любой таблицы.

Почему в документе пустые ячейки, хотя таблица заполнена?

Чаще всего имя параметра в макете не совпадает с именем колонки таблицы значений — метод Заполнить сопоставляет по именам и молча пропускает несовпадения. Вторая причина: в ячейке макета не установлено свойство заполнения «Параметр», тогда вместо значения выводится сам текст [ИмяПараметра].

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

При выводе через макет лишние колонки просто не используются — в макете размещаются параметры только нужных полей. При программном выводе замените цикл по коллекции Колонки на явный список имён нужных колонок и обращайтесь к строке по этим именам.

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

Используйте метод Записать с указанием типа файла: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Чтобы числа и даты корректно распознавались в Excel, записывайте их в ячейки через свойство Значение, а не как текст.

Что делать, если таблица значений находится в реквизите управляемой формы?

В серверной процедуре преобразуйте реквизит в таблицу значений через РеквизитФормыВЗначение("ИмяРеквизита") или метод Выгрузить у объекта ДанныеФормыКоллекция. Дальше работайте с полученной таблицей обычным способом, а результат запишите в реквизит формы типа ТабличныйДокумент.

Как добавить в документ нумерацию строк?

В макете добавьте в область Строка параметр [НомерСтроки], а в цикле заведите счётчик и записывайте его в параметры области перед выводом: ОбластьСтрока.Параметры.НомерСтроки = НомерСтроки;. При программном выводе просто заполняйте первую колонку значением счётчика.

Итог

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

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