При разработке печатных форм в среде 1С:Предприятие 8.3 часто возникает задача размещения водяного знака или логотипа компании строго по центру листа, причем так, чтобы изображение находилось «за текстом». Разберем, почему стандартные механизмы могут работать не так, как ожидается, и проанализируем наиболее эффективные способы решения этой задачи.
Многие разработчики начинают решение задачи с использования свойства ФоноваяКартинка табличного документа. Рассмотрим типичный пример кода, который часто применяется в таких случаях:
ТабДок.ФоноваяКартинка = БиблиотекаКартинок.ЛоготипКомпании;
ТабДок.ФиксированныйФон = Истина;
При использовании этого метода мы сталкиваемся с тем, что в режиме «Предварительный просмотр» или при обычной прокрутке документа на экране логотип может «плавать» или перемещаться вместе с прокруткой, несмотря на установленный флаг ФиксированныйФон. Выясним причину такого поведения: свойство ФиксированныйФон в первую очередь предназначено для интерактивной работы пользователя с отчетами на экране (например, в дашбордах), чтобы подложка оставалась статичной относительно границ окна. Однако печатная форма — это объект, который должен быть четко разделен на страницы при выводе на принтер.
Важный нюанс: при выводе на печать свойство ФоноваяКартинка может игнорироваться некоторыми драйверами принтеров или масштабироваться некорректно, так как 1С рассматривает фон табличного документа как элемент оформления экранной формы, а не как контент страницы.
Более надежным способом размещения изображения за текстом является добавление объекта типа «Рисунок» в коллекцию Рисунки табличного документа. Проанализируем ситуацию: чтобы картинка не перекрывала текст, нам необходимо управлять ее Z-порядком (слоями) и прозрачностью.
Рассмотрим по шагам, как программно добавить логотип и поместить его на задний план:
Порядок так, чтобы объект ушел за текстовые ячейки.Пример реализации на встроенном языке:
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = БиблиотекаКартинок.CMR;
// Указываем координаты (в миллиметрах или через привязку к ячейкам)
Рисунок.Верх = 50;
Рисунок.Лево = 40;
Рисунок.Ширина = 100;
Рисунок.Высота = 100;
// Устанавливаем вывод на задний план
Рисунок.Порядок = ПорядокОбъектаТабличногоДокумента.ПереместитьНазад;
// Разрешаем печать данного объекта
Рисунок.ВыводитьНаПечать = Истина;
Однако простого перемещения «назад» часто недостаточно. Если у ячеек табличного документа установлен белый фон (узор), они полностью перекроют рисунок, даже если он находится на заднем плане. Чтобы текст «пропускал» сквозь себя картинку, необходимо убедиться, что у ячеек макета свойство Узор установлено в значение Без узора (прозрачно).
Выясним причину, по которой рисунки иногда все равно перекрывают текст, даже если они отправлены на задний план. Это часто связано с форматом самого изображения. Если вы используете формат JPEG, он не поддерживает прозрачность, и белый фон картинки будет закрывать сетку документа.
Рекомендуется использовать формат PNG с альфа-каналом. В этом случае области вокруг логотипа будут действительно прозрачными. Для версий платформы, начиная с 8.3.14, отличным выбором будет формат SVG, который является векторным и идеально масштабируется без потери качества при печати на любых принтерах.
Посмотрим на настройки объекта Рисунок, которые критичны для правильного отображения:
ТипРазмещенияТекста.Перекрывать, если это касается взаимодействия с соседними областями.Иногда программный код написан верно, но при печати на одном принтере картинка оказывается за текстом, а на другом — перед ним. Проанализируем этот технический парадокс. Проблема кроется в языке описания страниц, который использует драйвер принтера:
Практический совет: если вы не можете контролировать настройки принтера у клиента, ориентируйтесь на формирование документа в формате PDF. Платформа 1С при сохранении в PDF самостоятельно выполняет рендеринг слоев, и итоговый файл обычно выглядит одинаково на всех устройствах.
Если ваша задача — сделать именно «водяной знак», который повторяется на каждой странице, рассмотрим вариант использования колонтитулов. К сожалению, стандартные колонтитулы 1С поддерживают только текст и простые параметры вроде [&НомерСтраницы]. Поэтому для графического логотипа по центру листа мы вынуждены использовать метод с Рисунки.Добавить(), но рассчитывать координаты для каждой страницы вручную.
Для этого в цикле вывода секций документа можно использовать метод ПроверитьВывод(). Как только система сообщает, что новая секция не влезает на текущий лист, мы фиксируем конец страницы и добавляем объект рисунка в координаты центра текущего сформированного листа.
Проанализируем пример логики:
// Перед выводом каждой новой строки проверяем, не наступил ли конец страницы
МассивСекций = Новый Массив;
МассивСекций.Добавить(ОбластьСтрока);
Если НЕ ТабДок.ПроверитьВывод(МассивСекций) Тогда
// Здесь логика добавления рисунка на текущую заполненную страницу
ДобавитьЛоготипНаСтраницу(ТабДок, НомерТекущейСтраницы);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Подводя итог, можно сказать, что для достижения идеального результата в печатных формах 1С 8.3 следует комбинировать программное управление коллекцией Рисунки, использование PNG/SVG с прозрачностью и обязательную проверку прозрачности фона (узора) самих ячеек табличного документа. Метод с ФоноваяКартинка лучше оставить для экранных форм и мониторов руководителя. Для реализации вывода графических элементов в современных конфигурациях можно использовать пример внешней печатной формы с выводом печати и подписей на БСП 3.1.10.