Разработка и Конфигурация · 11 мин
Как преобразовать таблицу значений в табличный документ в 1С
Пошаговая инструкция по выводу таблицы значений в табличный документ 1С: построение макета, заполнение областей, примеры кода, типичные ошибки и проверка результата.
Таблица значений в 1С — удобная структура для промежуточной обработки данных, но показать её пользователю или отправить на печать напрямую нельзя. Для визуализации служит табличный документ: он поддерживает форматирование, группировки, итоги, печать и сохранение в Excel или PDF. Задача разработчика — перенести строки и колонки из таблицы значений в ячейки табличного документа.
Существует два базовых подхода: вывод через макет с именованными областями и программное заполнение ячеек без макета. Первый способ предпочтителен для печатных форм и отчётов, где важен внешний вид. Второй подходит для быстрого служебного вывода, когда достаточно «как есть» показать содержимое таблицы.
Ниже разобраны оба способа с готовыми примерами кода, различия для управляемых и обычных форм, проверка результата и типичные ошибки, из-за которых документ выводится пустым или с обрезанными данными.
Что понадобится перед началом работы
Для преобразования нужны три вещи: заполненная таблица значений с известной структурой колонок, объект типа ТабличныйДокумент и решение о способе вывода — через макет или программно. Структуру колонок таблицы можно посмотреть в отладчике: остановитесь на строке после заполнения таблицы и проверьте коллекцию Колонки — имена колонок понадобятся при обращении к значениям.
Табличный документ создаётся конструктором Новый ТабличныйДокумент. Если документ будет показан пользователю на форме, дополнительно потребуется реквизит формы с типом ТабличныйДокумент и элемент формы «Поле табличного документа», связанный с этим реквизитом. Для печати без показа достаточно локальной переменной.
Способ 1. Вывод через макет с областями
Макет создаётся в конфигураторе: у объекта (обработки, отчёта, документа) добавьте макет типа «Табличный документ». В макете выделите строки-шаблоны и задайте им имена областей через свойство «Имя» — обычно это «Шапка», «Строка», «Подвал». В ячейках, куда должны попасть данные, укажите параметры в квадратных скобках, например [Номенклатура], и установите свойство ячейки «Заполнение» в значение «Параметр».
Код вывода выглядит так: получаем макет, получаем из него области, заполняем параметры и выводим. Параметры области удобно заполнять методом Заполнить, передавая строку таблицы значений — имена колонок должны совпадать с именами параметров в макете.
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТЗ);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьПодвал);
Признак правильной настройки: при изменении данных в таблице значений документ перестраивается без правки макета, а форматирование (шрифты, границы, цвета) остаётся стабильным, потому что задано один раз в шаблоне.
- 1Создайте макет типа Табличный документ и задайте области Шапка, Строка, Подвал
- 2В ячейках области Строка пропишите параметры [ИмяКолонки] и установите заполнение Параметр
- 3В коде создайте ТабличныйДокумент и получите макет методом ПолучитьМакет
- 4Выведите шапку, затем в цикле по строкам таблицы заполняйте параметры области и выводите её
- 5Выведите подвал и покажите документ или отправьте на печать
- 6Проверьте, что все строки выведены и итоги совпадают с данными таблицы
Способ 2. Программный вывод без макета
Когда макет избыточен — например, нужно быстро показать результат служебной обработки — ячейки заполняются напрямую методом Область с указанием координат. Нумерация строк и колонок начинается с единицы.
ТабДок = Новый ТабличныйДокумент;
// Шапка из имён колонок
НомерКолонки = 0;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
НомерКолонки = НомерКолонки + 1;
ТабДок.Область(1, НомерКолонки).Текст = Колонка.Имя;
КонецЦикла;
// Данные
НомерСтроки = 1;
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
НомерСтроки = НомерСтроки + 1;
НомерКолонки = 0;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
НомерКолонки = НомерКолонки + 1;
ТабДок.Область(НомерСтроки, НомерКолонки).Текст =
Строка(СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
КонецЦикла;
Обратите внимание на преобразование значения в строку: свойство Текст принимает только строки. Если записать в ячейку число или дату через свойство Текст без преобразования, платформа выполнит неявное приведение, но для контроля формата лучше использовать функцию Формат. Для типизированного вывода вместо Текст используйте свойство ТабДок.Область(...).Значение — тогда числа останутся числами и будут корректно экспортироваться в Excel.
Сравнение способов
Подходит для печатных форм и отчётов пользователям. Форматирование в шаблоне, код короче. Требует синхронизации имён параметров и колонок.
Подходит для служебного просмотра и универсальных процедур. Не нужен макет, структура берётся из самой таблицы. Форматирование придётся задавать кодом.
Подходит, когда нужна группировка, отборы и настройки пользователем. Таблица значений передаётся как внешний источник данных. Сложнее в настройке.
Вывод на управляемой форме и в обычном приложении
В управляемом приложении табличный документ формируется на сервере, а показывается через реквизит формы. Добавьте реквизит формы типа ТабличныйДокумент, перетащите его в дерево элементов формы — получится поле табличного документа. В серверной процедуре заполните этот реквизит как обычную переменную: ТабличныйДокументНаФорме.Очистить(); затем вывод области. После окончания серверного вызова форма отобразит результат автоматически.
В обычном приложении элемент формы «ПолеТабличногоДокумента» доступен напрямую, и вывод выполняется в него без промежуточного реквизита. Код построения самого документа при этом идентичен — отличается только способ доставки результата на экран.
Важная деталь управляемых форм: если таблица значений хранится в реквизите формы, на сервере она доступна как ДанныеФормыКоллекция. Перед передачей в процедуру построения преобразуйте её в таблицу значений методом Выгрузить, иначе обращение по именам колонок в цикле может вести себя неожиданно.
Третий вариант: вывод через СКД
Если таблица значений — результат сложной обработки, а пользователю нужны отборы, сортировки и группировки, таблицу можно передать в схему компоновки данных как внешний набор. В схеме создаётся источник данных типа «Объект», описываются поля, затем в коде таблица передаётся через ПроцессорКомпоновкиДанных с коллекцией внешних наборов.
Этот путь оправдан, когда простой вывод уже не закрывает потребности: пользователи просят менять порядок колонок, фильтровать строки, строить итоги по группам. Для разового вывода «как есть» СКД — избыточное усложнение.
Проверка результата и типичные ошибки
После построения документа проверьте три вещи: количество выведенных строк данных равно количеству строк таблицы значений, итоговые суммы в подвале совпадают с итогом по колонке таблицы, при экспорте в Excel числа остаются числами, а не превращаются в текст. Быстрый способ сверки — вычислить ТаблицаЗначений.Итог("Сумма") и сравнить с итогом в документе.
Отдельная группа проблем — производительность. Построчный вывод области с тысячами строк работает медленно, потому что каждый вызов Вывести модифицирует документ. Для больших таблиц используйте метод НачатьАвтогруппировкуСтрок только при необходимости группировок, а основной приём ускорения — вывод через СКД или сокращение объёма данных перед выводом.
Как проверить результат
Равно количеству строк таблицы значений
Строк меньше — проверьте условия в цикле и отборы
Совпадает с ТаблицаЗначений.Итог по колонке
Расходится — проверьте заполнение параметров и типы данных
Числа и даты сохраняют тип, доступны формулы
Все ячейки текстовые — данные писались через свойство Текст
Документ перестраивается без дублей
Строки добавляются к прежним — документ не очищался
Ограничения и меры предосторожности
Табличный документ хранится целиком в памяти. При выводе таблиц в десятки тысяч строк с насыщенным форматированием возможно заметное потребление памяти на сервере и «подвисание» клиента при отображении. Для таких объёмов показывайте пользователю отчёт на СКД с постраничным просмотром или выгружайте данные в файл без показа на экране.
При работе с реальными базами тестируйте изменения кода на копии. Ошибка в процедуре печати не портит данные, но может сорвать выдачу документов контрагентам, если доработка попадёт в рабочую базу без проверки. Перед изменением типовой печатной формы сохраните исходный вариант макета и кода.
FAQ
Можно ли вывести таблицу значений в табличный документ одной командой?
Готовой команды «преобразовать» в платформе нет, но для служебных задач пишут универсальную процедуру из 15–20 строк, которая строит шапку из коллекции Колонки и выводит строки в цикле. Такой код из раздела о программном выводе легко сделать общей процедурой и вызывать для любой таблицы.
Почему в документе пустые ячейки, хотя таблица заполнена?
Чаще всего имя параметра в макете не совпадает с именем колонки таблицы значений — метод Заполнить сопоставляет по именам и молча пропускает несовпадения. Вторая причина: в ячейке макета не установлено свойство заполнения «Параметр», тогда вместо значения выводится сам текст [ИмяПараметра].
Как вывести в документ только часть колонок таблицы?
При выводе через макет лишние колонки просто не используются — в макете размещаются параметры только нужных полей. При программном выводе замените цикл по коллекции Колонки на явный список имён нужных колонок и обращайтесь к строке по этим именам.
Как сохранить полученный табличный документ в Excel?
Используйте метод Записать с указанием типа файла: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Чтобы числа и даты корректно распознавались в Excel, записывайте их в ячейки через свойство Значение, а не как текст.
Что делать, если таблица значений находится в реквизите управляемой формы?
В серверной процедуре преобразуйте реквизит в таблицу значений через РеквизитФормыВЗначение("ИмяРеквизита") или метод Выгрузить у объекта ДанныеФормыКоллекция. Дальше работайте с полученной таблицей обычным способом, а результат запишите в реквизит формы типа ТабличныйДокумент.
Как добавить в документ нумерацию строк?
В макете добавьте в область Строка параметр [НомерСтроки], а в цикле заведите счётчик и записывайте его в параметры области перед выводом: ОбластьСтрока.Параметры.НомерСтроки = НомерСтроки;. При программном выводе просто заполняйте первую колонку значением счётчика.
Что важно запомнить
Преобразование сводится к циклу: шапка — строки с заполнением параметров — подвал. Для печатных форм используйте макет с областями и метод Заполнить, для служебного вывода — прямое заполнение ячеек. Следите за совпадением имён параметров и колонок, очищайте документ перед повторным формированием и проверяйте итоги сверкой с таблицей значений.