При формировании печатных форм часто возникает задача брендирования документов, когда логотип компании должен отображаться в верхней части каждого печатного листа. В платформе 1С:Предприятие существует несколько способов реализации этой задачи: от простых настроек свойств ТабличныйДокумент до сложного программного управления выводом. В этой статье мы подробно разберем все доступные варианты, проанализируем их преимущества и возможные трудности.
Это самый эффективный и простой способ, который позволяет автоматизировать процесс дублирования шапки документа (включая картинки) на каждом листе без написания сложного кода. Рассмотрим алгоритм его настройки.
Прежде всего, нам необходимо подготовить макет. В макете создается область (например, с именем ШапкаСтраницы), в которую помещается логотип. Важный нюанс: для того чтобы картинка корректно отображалась на каждой странице при использовании этого метода, необходимо правильно настроить ее свойства.
Разберем по шагам настройку графического объекта в макете:
Перемещать вместе с ячейками. Это критически важно: если установлено значение Не перемещать, платформа зафиксирует картинку на координатах первого листа, и она не будет дублироваться при печати последующих страниц.Теперь проанализируем, как программно назначить эти строки для повторения. Допустим, наш логотип расположен в первых трех строках макета. Код будет выглядеть следующим образом:
ТабДок = Новый ТабличныйДокумент;
// ... Код формирования документа ...
// Указываем область строк, которые должны повторяться
ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область(1, , 3);
Обратите внимание на ошибку, упомянутую в обсуждении: «Использование прямоугольных областей недопустимо». Это происходит, если вы пытаетесь присвоить свойству ПовторятьПриПечатиСтроки область, состоящую из конкретных ячеек (например, R1C1:R3C5). Платформа требует передачи области, включающей строки целиком. Поэтому в методе Область() мы опускаем индексы колонок.
Если структура отчета сложная или логотип должен меняться в зависимости от условий, автоматическое повторение строк может не подойти. В этом случае мы будем использовать метод ПроверитьВывод(). Этот метод позволяет заранее узнать, поместится ли следующая область на текущий лист бумаги с учетом текущих настроек принтера и полей.
Рассмотрим логику работы этого метода. Представим, что у нас есть основной цикл вывода строк данных. Перед выводом каждой новой строки мы должны проверить: если мы выведем логотип и следующую строку данных, не превысим ли мы размер страницы?
Пример программной реализации:
// Создаем массив областей для проверки
МассивОбластей = Новый Массив;
ОбластьЛоготип = Макет.ПолучитьОбласть("ШапкаСтраницы");
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаДанных");
МассивОбластей.Добавить(ОбластьЛоготип);
МассивОбластей.Добавить(ОбластьСтрока);
// В цикле перебора данных
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
// Заполняем параметры области строки
ОбластьСтрока.Параметры.Заполнить(СтрокаТЗ);
// Проверяем, поместится ли логотип + данные на текущую страницу
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
// Если не помещается, принудительно переходим на новый лист
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Выводим логотип в начале новой страницы
ТабДок.Вывести(ОбластьЛоготип);
КонецЕсли;
// Выводим основную строку данных
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Проанализируем ситуацию: почему важно проверять именно массив областей? Если проверять только одну строку данных, 1С может решить, что она помещается в самый низ страницы. Но места для логотипа на следующей странице уже не останется, или логотип оторвется от данных. Проверка массива гарантирует, что связка «Логотип + Данные» всегда будет выглядеть корректно.
Часто звучит предложение использовать стандартные верхние или нижние колонтитулы табличного документа. Однако здесь есть существенное ограничение: стандартные колонтитулы в 1С поддерживают только текст. Вы можете вывести туда номер страницы, дату или произвольную строку через свойства ВерхнийКолонтитул, но вставить туда объект типа Рисунок напрямую невозможно.
Тем не менее, если ваша задача допускает использование текстового логотипа (названия компании определенным шрифтом), это самый экономный с точки зрения ресурсов способ:
ТабДок.ВерхнийКолонтитул.Выводить = Истина;
ТабДок.ВерхнийКолонтитул.ТекстСлева = "ООО «Ромашка»";
ТабДок.ВерхнийКолонтитул.НачальнаяСтраница = 1;
В процессе работы программисты иногда сталкиваются с тем, что код настроен верно, но картинка то пропадает, то появляется. Выясним причины такого поведения:
АвтоМасштаб = Истина. Если документ не влезает по ширине, 1С может начать дробить его на части, что приведет к непредсказуемому поведению повторяющихся строк с картинками.PNG часто вызывают проблемы при печати через терминальный сервер или на старых моделях принтеров. Для максимально стабильного результата рекомендуется использовать JPG или BMP с белым фоном вместо прозрачности.ПроверитьВывод() ориентируется на настройки принтера по умолчанию. Если у пользователя в настройках установлены огромные поля, программная проверка может срабатывать раньше времени, оставляя пустое место. Рекомендуется жестко задавать поля в коде:
ТабДок.ПолеСверху = 10; // в миллиметрах
ТабДок.ПолеСнизу = 10;
ТабДок.ПолеСлева = 20;
ТабДок.ПолеСправа = 10;
Для большинства задач идеальным решением будет комбинация правильно настроенного макета и свойства ПовторятьПриПечатиСтроки. Это минимизирует объем кода и нагрузку на систему. Если же отчет обладает сложной динамической структурой, используйте метод ПроверитьВывод(), не забывая о предварительной установке параметров страницы и проверке массива областей. Мы рассмотрели основные инструменты, которые помогут вам сделать ваши печатные формы профессиональными и соответствующими корпоративному стилю.