Как вывести логотип на каждой странице табличного документа в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Способ 1: Использование свойства ПовторятьПриПечатиСтроки

Это самый эффективный и простой способ, который позволяет автоматизировать процесс дублирования шапки документа (включая картинки) на каждом листе без написания сложного кода. Рассмотрим алгоритм его настройки.

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

Разберем по шагам настройку графического объекта в макете:

  1. Нажмите правой кнопкой мыши на картинку в макете и выберите пункт «Свойства».
  2. Найдите параметр «Размещение». Установите его в значение Перемещать вместе с ячейками. Это критически важно: если установлено значение Не перемещать, платформа зафиксирует картинку на координатах первого листа, и она не будет дублироваться при печати последующих страниц.
  3. Убедитесь, что границы картинки не выходят за пределы строк, которые вы планируете повторять. Если край логотипа выступает хотя бы на один пиксель в область, которая не входит в повторение, картинка может обрезаться или не выводиться вовсе.

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


ТабДок = Новый ТабличныйДокумент;
// ... Код формирования документа ...
// Указываем область строк, которые должны повторяться
ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область(1, , 3); 

Обратите внимание на ошибку, упомянутую в обсуждении: «Использование прямоугольных областей недопустимо». Это происходит, если вы пытаетесь присвоить свойству ПовторятьПриПечатиСтроки область, состоящую из конкретных ячеек (например, R1C1:R3C5). Платформа требует передачи области, включающей строки целиком. Поэтому в методе Область() мы опускаем индексы колонок.

Способ 2: Программный контроль через ПроверитьВывод

Если структура отчета сложная или логотип должен меняться в зависимости от условий, автоматическое повторение строк может не подойти. В этом случае мы будем использовать метод ПроверитьВывод(). Этот метод позволяет заранее узнать, поместится ли следующая область на текущий лист бумаги с учетом текущих настроек принтера и полей.

Рассмотрим логику работы этого метода. Представим, что у нас есть основной цикл вывода строк данных. Перед выводом каждой новой строки мы должны проверить: если мы выведем логотип и следующую строку данных, не превысим ли мы размер страницы?

Пример программной реализации:


// Создаем массив областей для проверки
МассивОбластей = Новый Массив;
ОбластьЛоготип = Макет.ПолучитьОбласть("ШапкаСтраницы");
ОбластьСтрока  = Макет.ПолучитьОбласть("СтрокаДанных");

МассивОбластей.Добавить(ОбластьЛоготип);
МассивОбластей.Добавить(ОбластьСтрока);

// В цикле перебора данных
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
    // Заполняем параметры области строки
    ОбластьСтрока.Параметры.Заполнить(СтрокаТЗ);
    
    // Проверяем, поместится ли логотип + данные на текущую страницу
    Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
        // Если не помещается, принудительно переходим на новый лист
        ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        // Выводим логотип в начале новой страницы
        ТабДок.Вывести(ОбластьЛоготип);
    КонецЕсли;
    
    // Выводим основную строку данных
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Проанализируем ситуацию: почему важно проверять именно массив областей? Если проверять только одну строку данных, 1С может решить, что она помещается в самый низ страницы. Но места для логотипа на следующей странице уже не останется, или логотип оторвется от данных. Проверка массива гарантирует, что связка «Логотип + Данные» всегда будет выглядеть корректно.

Способ 3: Использование колонтитулов

Часто звучит предложение использовать стандартные верхние или нижние колонтитулы табличного документа. Однако здесь есть существенное ограничение: стандартные колонтитулы в 1С поддерживают только текст. Вы можете вывести туда номер страницы, дату или произвольную строку через свойства ВерхнийКолонтитул, но вставить туда объект типа Рисунок напрямую невозможно.

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


ТабДок.ВерхнийКолонтитул.Выводить = Истина;
ТабДок.ВерхнийКолонтитул.ТекстСлева = "ООО «Ромашка»";
ТабДок.ВерхнийКолонтитул.НачальнаяСтраница = 1;

Проблемы «капризности» платформы и пути их решения

В процессе работы программисты иногда сталкиваются с тем, что код настроен верно, но картинка то пропадает, то появляется. Выясним причины такого поведения:

  1. Кэширование графики: Платформа 1С может некорректно отрисовывать графические объекты при предварительном просмотре, если сессия пользователя длится долго. Иногда помогает очистка локального кэша, но для стабильной работы лучше программно форсировать настройки печати.
  2. Масштабирование: Всегда устанавливайте свойство АвтоМасштаб = Истина. Если документ не влезает по ширине, 1С может начать дробить его на части, что приведет к непредсказуемому поведению повторяющихся строк с картинками.
  3. Формат изображений: Проанализируем типы файлов. Прозрачные PNG часто вызывают проблемы при печати через терминальный сервер или на старых моделях принтеров. Для максимально стабильного результата рекомендуется использовать JPG или BMP с белым фоном вместо прозрачности.
  4. Поля страницы: Метод ПроверитьВывод() ориентируется на настройки принтера по умолчанию. Если у пользователя в настройках установлены огромные поля, программная проверка может срабатывать раньше времени, оставляя пустое место. Рекомендуется жестко задавать поля в коде:

ТабДок.ПолеСверху = 10; // в миллиметрах
ТабДок.ПолеСнизу  = 10;
ТабДок.ПолеСлева  = 20;
ТабДок.ПолеСправа = 10;

Резюме

Для большинства задач идеальным решением будет комбинация правильно настроенного макета и свойства ПовторятьПриПечатиСтроки. Это минимизирует объем кода и нагрузку на систему. Если же отчет обладает сложной динамической структурой, используйте метод ПроверитьВывод(), не забывая о предварительной установке параметров страницы и проверке массива областей. Мы рассмотрели основные инструменты, которые помогут вам сделать ваши печатные формы профессиональными и соответствующими корпоративному стилю.

← На главную