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

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

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

Как вывести таблицу значений в табличный документ 1С: метод Вывести, макеты, области, построитель отчёта. Рабочие примеры кода и разбор типичных ошибок.

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

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

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

Как устроен вывод: табличный документ, макет и области

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

Область — это прямоугольный фрагмент макета или уже существующего табличного документа. В типовом сценарии разработчик создаёт макет (в конфигураторе или программно), в котором описаны области: «Шапка», «Строка», «Подвал». Ячейки области могут содержать фиксированный текст, параметры вида [ИмяПараметра] или шаблоны.

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

Простой способ: перебор строк таблицы значений в цикле

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

// ТЗ — таблица значений с колонками Номенклатура, Количество, Цена

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

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

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

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

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

Для Каждого СтрокаТЗ Из ТЗ Цикл

ОбластьСтрока.Параметры.Номенклатура = СтрокаТЗ.Номенклатура;

ОбластьСтрока.Параметры.Количество = СтрокаТЗ.Количество;

ОбластьСтрока.Параметры.Цена = СтрокаТЗ.Цена;

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

КонецЦикла;

ТабДок.Показать("Результат");

Обратите внимание: область «Строка» получается из макета один раз, до цикла. Получать область внутри цикла — распространённая ошибка, замедляющая вывод на больших таблицах. Объект области при выводе копируется, поэтому переиспользование одной переменной корректно.

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

Порядок действий при выводе через макет
  1. 1
    Создайте макет табличного документа с областями Шапка, Строка и при необходимости Подвал
  2. 2
    В ячейках области Строка задайте параметры через свойство Заполнение = Параметр
  3. 3
    Получите макет и области в коде, область строки — один раз до цикла
  4. 4
    Переберите таблицу значений, заполняя параметры области и вызывая ТабДок.Вывести()
  5. 5
    Покажите результат методом Показать() или сохраните в файл методом Записать()

Вывод без макета: прямое обращение к ячейкам

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

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

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

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

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

КонецЦикла;

// Данные

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

Для Каждого СтрокаТЗ Из ТЗ Цикл

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

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

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

КонецЦикла;

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

КонецЦикла;

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

Вывод через построитель отчёта

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

Построитель = Новый ПостроительОтчета;

Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);

Построитель.ЗаполнитьНастройки();

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

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

ТабДок.Показать("Отчёт");

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

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

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

Цикл + макет с областями

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

Прямое обращение к ячейкам

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

Построитель отчёта

Группировки, итоги и типовое оформление из коробки. Избыточен для простых таблиц, менее гибкая настройка шаблона.

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

Максимальная гибкость настроек для пользователя. Сложнее в реализации: нужно программно формировать набор данных и макет компоновки.

Вывод через СКД с внешним источником данных

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

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

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

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

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

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

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

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

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

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

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

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

Выбирайте СКД, когда отчёт будет развиваться и пользователям понадобится гибкая настройка. Для разовой печатной формы это лишняя сложность.

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

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

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

Типичные ошибки
01
Получение области макета внутри цикла — лишние обращения к макету и замедление вывода на больших таблицах
02
Несовпадение имён параметров в макете и в коде — параметр остаётся пустым, ячейка выводится без данных
03
Вывод ссылочных значений без приведения — вместо наименования в ячейке может оказаться нечитаемое представление
04
Отсутствие обработки пустой таблицы значений — пользователь видит шапку без строк и не понимает, сработал ли отчёт
05
Попытка передать таблицу значений напрямую в ТабДок.Вывести() — метод ожидает область или построитель, а не таблицу значений
Контрольные точки

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

Совпадение данных
Норма

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

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

Строки пропущены или продублированы — проверяйте логику цикла и вызовы Вывести()

Заполнение параметров
Норма

Все ячейки области заполнены значениями

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

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

Пустая таблица значений
Норма

Выводится понятное сообщение об отсутствии данных

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

Показывается только шапка без пояснений

Итоги в подвале
Норма

Суммы совпадают с ТЗ.Итог() по соответствующим колонкам

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

Итоги расходятся — ошибка в накоплении или в формуле подвала

Сохранение и выгрузка результата

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

ТабДок.Записать("C:\Отчеты\Выгрузка.xlsx",

ТипФайлаТабличногоДокумента.XLSX);

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

FAQ

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

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

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

Чаще всего имя параметра в макете не совпадает с именем в коде с точностью до регистра, либо у ячейки в макете свойство «Заполнение» установлено в «Текст» вместо «Параметр». Откройте макет, выделите ячейку и проверьте свойство Заполнение и имя параметра.

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

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

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

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

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

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

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

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

Итог

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

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