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