Табличный макет печатной формы в конфигураторе 1С 8.3: от пустого листа до вывода из кода

· 10 мин

Содержание

Чтобы добавить таблицу в макет 1С, создайте у объекта макет типа «Табличный документ» (вкладка Макеты → Добавить), нарисуйте в нём шапку и одну строку таблицы, задайте рамки и параметры ячеек, а затем дайте этим строкам имена через Таблица → Имена → Назначить имя. Сама таблица собирается при печати: код берёт именованную строку из макета и выводит её столько раз, сколько строк в документе.

Отсюда главное отличие от Excel. В макете не рисуют таблицу на все 50 позиций накладной. Рисуют одну строку-образец, а размножает её код. Механизм общий для платформы 8.3 и одинаков для Бухгалтерии, ЗУП, УТ и собственных конфигураций: меняется только объект, к которому привязан макет.

Где создать макет под таблицу в конфигураторе

Макет живёт либо внутри конкретного объекта, либо в общих макетах. Выбор зависит от того, кто будет его печатать.

Где создатьКогда выбираютКак получить из кода
Макет документа или справочникаПечатная форма одного объекта: накладная, акт, карточкаДокументы.ИмяДокумента.ПолучитьМакет("Имя")
Макет обработки или отчётаВнешняя печатная форма, своя обработкаПолучитьМакет("Имя") в модуле объекта обработки
Общий макетБланк нужен нескольким объектамПолучитьОбщийМакет("Имя")

Порядок для макета объекта:

  1. Откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. В дереве найдите нужный документ или обработку, откройте окно редактирования объекта.
  3. Перейдите на вкладку Макеты и нажмите Добавить.
  4. В конструкторе макета укажите имя латиницей или кириллицей без пробелов, например ПФ_MXL_Накладная, и тип Табличный документ.
  5. Нажмите Готово — откроется пустой лист с сеткой.

Для общего макета путь короче: в дереве конфигурации раскройте Общие → Общие макеты, щёлкните правой кнопкой и выберите Добавить.

Если бланк уже есть в Excel, откройте файл .xls в конфигураторе через Файл → Открыть, выделите ячейки и вставьте их в макет. Рамки, шрифты и ширины колонок обычно переносятся, после этого остаётся расставить параметры и имена областей.

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

Как вставить таблицу в макет: колонки, строки и рамки

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

Разметка колонок

Сначала решите, сколько колонок будет в таблице и какая у них ширина. Для накладной типичный набор такой:

  • 🔢 № — узкая колонка, 4–5 символов;
  • 📦 Товар — самая широкая, 35–45 символов;
  • 📏 Количество и единица — по 8–10;
  • 💰 Цена и сумма — по 12–14.

Ширину меняют перетаскиванием границы в заголовке колонки. Точное значение задают в свойствах колонки: выделите заголовок колонки и нажмите Alt+Enter, откроется палитра свойств с полем ширины.

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

Строки таблицы

Для табличной части нужны минимум две строки макета:

  1. Шапка таблицы — названия колонок: «№», «Товар», «Кол-во», «Цена», «Сумма».
  2. Строка таблицы — одна строка с ячейками под значения.

Часто добавляют третью — подвал с итогом «Всего» и суммой прописью. Строки вставляют через контекстное меню заголовка строки или переносят выделение мышью.

Рамки

Выделите шапку и строку таблицы целиком, затем в палитре свойств (Alt+Enter) задайте линии границ: слева, сверху, справа и снизу. Для шапки обычно ставят сплошную линию потолще, для строк — тонкую. На панели редактора есть и кнопка рамок с готовыми вариантами: все границы, внешняя рамка, без рамки.

Рамку задают каждой строке-образцу отдельно, включая подвал — иначе после вывода таблица окажется без нижней линии или без боковых границ у итога.

Объединение ячеек и оформление шапки таблицы

Объединение нужно в двух местах: в широких колонках и в многоуровневой шапке, где над «Количество» и «Сумма» стоит общий заголовок «Отгружено».

Как объединить:

  1. Выделите прямоугольник ячеек.
  2. Выберите Таблица → Объединить или кнопку объединения на панели редактора.
  3. Чтобы разбить обратно, выделите объединённую ячейку и выполните ту же команду ещё раз.

Что настроить в свойствах ячейки:

  • 🔤 Шрифт — для шапки полужирный, размер 8–9; для строк обычный 8.
  • ↔️ Горизонтальное положение — текст влево, числа вправо, номер по центру.
  • ↕️ Вертикальное положение — по центру для шапки из двух строк.
  • 📐 Размещение текста — Переносить, если название товара может быть длинным. Иначе текст обрежется или уедет в соседнюю ячейку.
  • 🔢 Формат — для сумм ЧДЦ=2, тогда 1500 выведется как 1 500,00.

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

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

Параметры и шаблоны в ячейках табличного макета

Ячейка макета может содержать три вида заполнения. Это свойство Заполнение в палитре свойств.

ЗаполнениеЧто в ячейкеПример
ТекстПостоянная надпись«Наименование товара»
ПараметрЗначение подставляется из кода целикомПараметр Номенклатура
ШаблонТекст со вставками в квадратных скобкахНакладная № [Номер] от [Дата]

Для строки таблицы почти всегда выбирают Параметр. В поле Параметр пишут имя, по которому код обратится к ячейке: НомерСтроки, Номенклатура, Количество, Цена, Сумма.

Удобно называть параметры так же, как реквизиты табличной части документа. Тогда строку заполняет одна команда Параметры.Заполнить(СтрокаТЧ), без присвоения каждого поля вручную.

Шаблон уместен в шапке документа, где надпись и данные идут в одной ячейке. Частая ошибка: текст [Номер] набран в ячейке с заполнением Текст — тогда он так и напечатается со скобками.

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

Именованные области: как код находит таблицу в макете

Без имён код не отличит шапку от строки. Имя области — то, что связывает рисунок макета с программой.

Как назначить имя

  1. Выделите заголовки строк, которые входят в область: например, две строки шапки таблицы.
  2. Выберите Таблица → Имена → Назначить имя.
  3. Введите имя: ШапкаТаблицы. Пробелы недопустимы.
  4. Повторите для Шапка, Строка, Подвал.

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

Вывод таблицы из кода

Пример функции для модуля менеджера документа. Она собирает печатную форму накладной с табличной частью Товары:

Функция ПечатьНакладной(ДокументСсылка) Экспорт

	ТабДок = Новый ТабличныйДокумент;
	ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Накладная";

	Макет = Документы.РасходнаяНакладная.ПолучитьМакет("ПФ_MXL_Накладная");
	ОбластьШапка        = Макет.ПолучитьОбласть("Шапка");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьСтрока       = Макет.ПолучитьОбласть("Строка");
	ОбластьПодвал       = Макет.ПолучитьОбласть("Подвал");

	ОбластьШапка.Параметры.Номер = ДокументСсылка.Номер;
	ОбластьШапка.Параметры.Дата  = Формат(ДокументСсылка.Дата, "ДЛФ=D");
	ТабДок.Вывести(ОбластьШапка);
	ТабДок.Вывести(ОбластьШапкаТаблицы);

	Для Каждого СтрокаТЧ Из ДокументСсылка.Товары Цикл
		ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
		ОбластьСтрока.Параметры.Расшифровка = СтрокаТЧ.Номенклатура;
		ТабДок.Вывести(ОбластьСтрока);
	КонецЦикла;

	ОбластьПодвал.Параметры.Итого = ДокументСсылка.Товары.Итог("Сумма");
	ТабДок.Вывести(ОбластьПодвал);

	Возврат ТабДок;

КонецФункции

Заполнить(СтрокаТЧ) подставит все параметры, чьи имена совпали с колонками табличной части, включая НомерСтроки. Параметры, которым пары не нашлось, останутся пустыми, ошибки не будет.

Последняя строка цикла предполагает, что в свойстве Расшифровка ячейки «Товар» указан параметр Расшифровка. Если расшифровка не нужна, строку уберите.

Для реальной печатной формы данные лучше получить одним запросом, а не обращаться к реквизитам через точку от ссылки: на документе в 300 строк разница в скорости заметна.

Чтобы показать результат пользователю, на клиенте вызывают ТабДок.Показать() или передают документ в общую процедуру печати конфигурации, если она на БСП.

Таблица с переменным числом колонок

Иногда заранее неизвестно, сколько колонок будет: размеры одежды, месяцы периода, склады. Тогда имена дают не только строкам, но и колонкам.

  1. Выделите заголовки колонок с повторяемой колонкой и назначьте имя, например Размер.
  2. Колонки с наименованием товара назовите Товар.
  3. Строки по-прежнему называются ШапкаТаблицы и Строка.

Область на пересечении получают через вертикальную черту, а выводят вправо методом Присоединить:

ОбластьТовар  = Макет.ПолучитьОбласть("Строка|Товар");
ОбластьРазмер = Макет.ПолучитьОбласть("Строка|Размер");

ОбластьТовар.Параметры.Номенклатура = СтрокаДанных.Номенклатура;
ТабДок.Вывести(ОбластьТовар);

Для Каждого Размер Из СписокРазмеров Цикл
	ОбластьРазмер.Параметры.Количество = КоличествоПоРазмеру(СтрокаДанных, Размер);
	ТабДок.Присоединить(ОбластьРазмер);
КонецЦикла;

Вывести начинает новую строку, Присоединить дописывает область справа от последней выведенной. Шапку таблицы собирают так же: сначала ШапкаТаблицы|Товар, затем в цикле ШапкаТаблицы|Размер.

Функцию КоличествоПоРазмеру вы пишете под свои данные: обычно это поиск в таблице значений, полученной запросом.

Поля страницы, ориентация и перенос шапки на новый лист

Настройки печати, сделанные в самом макете, не переносятся в новый табличный документ при выводе областей. Поля и ориентацию задают в коде, сразу после создания ТабДок:

ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ПолеСлева  = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу  = 10;
ТабДок.АвтоМасштаб = Истина;

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

КлючПараметровПечати из примера выше запоминает настройки, которые пользователь сам поменял в окне параметров страницы. В следующий раз форма откроется с ними. Ключ должен быть уникальным для каждой печатной формы.

Повтор шапки таблицы на каждом листе

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

МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьСтрока);

Если Не ТабДок.ПроверитьВывод(МассивПроверки) Тогда
	ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
	ТабДок.Вывести(ОбластьШапкаТаблицы);
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);

Этот фрагмент ставят внутрь цикла вместо простого ТабДок.Вывести(ОбластьСтрока). Чтобы подвал не остался один на последней странице, перед его выводом сделайте такую же проверку для пары «последняя строка + подвал».

Результат проверяйте не в макете, а в готовой форме через Файл → Предварительный просмотр: разрывы страниц видны только там.

Если макет типовой: расширение и пользовательский режим

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

Изменение в пользовательском режиме. В конфигурациях на БСП, например в Бухгалтерии 3.0, откройте Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. Найдите макет, откройте его на редактирование, добавьте колонку или поменяйте оформление. Изменённый макет хранится в базе отдельно и переживает обновление конфигурации .

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

Расширение конфигурации . Если нужна новая колонка с данными, которых нет в типовом коде, делают расширение: заимствуют объект, добавляют в расширение свой макет с таблицей и свою процедуру печати. Расширения появились в платформе 8.3.6. Загрузка файла .cfe и применение изменений — отдельные шаги: после загрузки расширение нужно обновить в базе.

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

Ошибки при выводе таблицы из макета

Большинство проблем видно сразу при первой печати. Найдите свой симптом:

Диагностика: выберите симптом

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