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

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

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

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

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

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

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

Что такое объект ТабличныйДокумент и когда он нужен

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

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

Создание документа программно без макета

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

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

ТабДок.Область("R1C1").Текст = "Номенклатура";

ТабДок.Область("R1C2").Текст = "Количество";

ТабДок.Область("R1C1:R1C2").Шрифт = Новый Шрифт(, , Истина);

ТабДок.Область("R2C1").Текст = "Кирпич М-150";

ТабДок.Область("R2C2").Текст = 120;

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

Адресация ячеек идёт в стиле R1C1: R2C3 — строка 2, колонка 3. Диапазон задаётся двоеточием: R1C1:R1C5. К области применяют свойства оформления — шрифт, цвет фона, границы, выравнивание. Метод Показать() открывает документ пользователю в отдельном окне.

bsl
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("R1C1").Текст = "Заголовок";
ТабДок.Показать();

Создание макета: области и параметры

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

Ключевое понятие — область макета. Выделяют строки или прямоугольник и через меню «Таблица → Имена → Назначить имя» дают области имя: Шапка, Строка, Подвал. Программно область получают методом ПолучитьОбласть("Строка") и выводят в документ.

Ячейки бывают трёх типов заполнения: текст (фиксированная строка), параметр (подставляется из кода, имя указывается в квадратных скобках, например [Номенклатура]) и шаблон (смесь текста и параметров: Акт № [Номер] от [Дата]). Тип задаётся в свойствах ячейки макета.

Порядок создания макета
  1. 1
    В конфигураторе добавьте макет типа «Табличный документ» у нужного объекта
  2. 2
    Нарисуйте шапку, строку данных и подвал, задайте рамки и шрифты
  3. 3
    Выделите строки шапки и назначьте имя области «Шапка»
  4. 4
    Аналогично создайте области «Строка» и «Подвал»
  5. 5
    В ячейках, куда подставляются данные, укажите параметры в квадратных скобках и тип заполнения «Параметр»

Заполнение документа данными из запроса

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

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

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

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

ОбластьШапка.Параметры.Период = Формат(ДатаОтчета, "ДЛФ=D");

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

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

КонецЦикла;

ТабДок.Показать();

Обратите внимание на метод Параметры.Заполнить(Выборка): он переносит в параметры области все поля выборки, имена которых совпадают с именами параметров. Это избавляет от ручного присваивания каждого поля. Если имена не совпадают — задайте параметр явно: ОбластьСтрока.Параметры.Сумма = Выборка.СуммаПродажи;.

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

Оформление: рамки, шрифты, автоотступ и повтор шапки

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

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

Для аккуратного разбиения на страницы используют связку ПроверитьВывод() и ВывестиГоризонтальныйРазделительСтраниц(): перед выводом очередной строки проверяют, поместится ли она вместе с подвалом, и при необходимости вставляют разрыв страницы.

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

Вывод результата: экран, печать, файл

Готовый табличный документ показывают методом Показать("Заголовок"), отправляют на принтер методом Напечатать() или сохраняют методом Записать(ИмяФайла, ТипФайла). Поддерживаются форматы MXL (родной формат 1С), XLSX, PDF, HTML, ODS и другие.

ТабДок.Записать("C:\Отчеты\Прайс.xlsx", ТипФайлаТабличногоДокумента.XLSX);

ТабДок.Записать("C:\Отчеты\Акт.pdf", ТипФайлаТабличногоДокумента.PDF);

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

Сравнение вариантов вывода

Показать()

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

Напечатать()

Сразу отправка на принтер без предпросмотра. Уместно для этикеток и пакетной печати, но ошибку вёрстки пользователь увидит поздно.

Записать()

Сохранение в файл MXL, XLSX или PDF. Подходит для отправки по почте и обмена с внешними системами.

Проверка результата и отладка

Перед передачей печатной формы в работу проверьте три вещи: все параметры подставились (нет пустых ячеек и строк с квадратными скобками), итоги в подвале сходятся с данными источника, документ корректно разбивается на страницы при печати. Для проверки итогов удобно сравнить сумму в подвале с результатом того же запроса с итоговой функцией СУММА().

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

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

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

Параметры в выведенном документе
Норма

Все ячейки заполнены значениями, нет фрагментов вида [ИмяПараметра]

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

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

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

Сумма совпадает с итогом запроса по той же выборке

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

Расхождение — не все строки выведены или параметры не очищались

Разбиение на страницы
Норма

Шапка повторяется на каждой странице, строки не обрезаны

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

Шапка только на первой странице, строки разорваны пополам

Частые вопросы

Чем табличный документ отличается от таблицы значений?

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

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

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

Почему вместо значения выводится текст [Номенклатура]?

У ячейки макета тип заполнения установлен «Текст» вместо «Параметр» или «Шаблон». Откройте макет, выделите ячейку и в палитре свойств измените заполнение. Также проверьте, что имя параметра в коде совпадает с именем в макете.

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

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

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

Методом Записать с типом файла XLSX: ТабДок.Записать("ПутьКФайлу.xlsx", ТипФайлаТабличногоДокумента.XLSX). Учтите, что сложное оформление и объединения ячеек могут переноситься с искажениями — для выгрузок используйте простую структуру.

Как сделать, чтобы шапка печаталась на каждой странице?

Задайте свойство ПовторятьПриПечатиСтроки у табличного документа, указав область со строками шапки, например: ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область("R1:R3"). Проверить результат можно в предварительном просмотре печати.