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