При формировании печатных форм договоров, актов или коммерческих предложений часто возникает задача: разместить подпись руководителя или логотип компании на каждой странице документа. Стандартные свойства колонтитулов в 1С долгое время поддерживали только текстовые данные и спецсимволы (номер страницы, дата и т.д.), что вынуждало разработчиков прибегать к сложным ухищрениям. Однако с развитием платформы ситуация изменилась.
В этой статье мы подробно разберем, как программно добавить изображение в колонтитул, почему оно может не отображаться и какие альтернативные способы существуют для конфигураций на старых режимах совместимости.
Начиная с версии платформы 8.3.15, свойства колонтитулов табличного документа (ВерхнийКолонтитул и НижнийКолонтитул) получили поддержку объекта ФорматированнаяСтрока. Это позволяет комбинировать текст с разными шрифтами, цветами и, что самое важное, вставлять объекты типа Картинка.
Разберем по шагам, как это реализовать в коде. Предположим, у нас есть картинка подписи в общих картинках конфигурации (БиблиотекаКартинок.ПодписьРуководителя).
// Создаем массив для формирования сложной строки
МассивЧастей = Новый Массив;
// Добавляем текст с определенным оформлением
ШрифтТекста = Новый Шрифт("Arial", 10, Истина); // Жирный шрифт
МассивЧастей.Добавить(Новый ФорматированнаяСтрока("ПОСТАВЩИК: ", ШрифтТекста));
// Добавляем саму картинку из библиотеки картинок
МассивЧастей.Добавить(БиблиотекаКартинок.ПодписьРуководителя);
// Добавляем расшифровку подписи
МассивЧастей.Добавить(" /Иванов И.И./");
// Собираем итоговую форматированную строку
ИтоговыйКолонтитул = Новый ФорматированнаяСтрока(МассивЧастей);
// Устанавливаем в табличный документ
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСлева = ИтоговыйКолонтитул;
ТабДок.РазмерКолонтитулаСнизу = 20; // Убедитесь, что места достаточно для картинки
Важный нюанс: если ваша картинка хранится не в метаданных (Библиотека картинок), а в справочнике или файле, вы можете загрузить её динамически, получив объект Картинка из двоичных данных или из хранилища значений. Для реализации подобного функционала в типовых конфигурациях можно использовать пример внешней печатной формы с выводом факсимиле и подписей на БСП.
Часто программисты сталкиваются с ситуацией: платформа установлена современная (например, 8.3.22), код написан верно, но в колонтитуле вместо картинки выводится пустое место или просто текст. Проанализируем причину этой проблемы.
Основным ограничителем здесь выступает Режим совместимости конфигурации. Если в свойствах вашего корня конфигурации установлен режим совместимости ниже 8.3.15, то даже на самой новой платформе механизм ФорматированнаяСтрока в колонтитулах работать не будет. Платформа будет имитировать поведение старых версий, где колонтитул принимал только тип Строка.
Чтобы проверить это, выполним следующие действия:
Если там указано "8.3.14" или ниже, использование картинок в стандартных колонтитулах невозможно без изменения этого свойства. Внимание: изменение режима совместимости в рабочей базе — это серьезный шаг, требующий полного тестирования всей системы, так как многие механизмы могут начать работать иначе. Пакетный запуск таких проверок для группы баз можно выполнить с помощью программы для автоматического тестирования и обновления 1С.
Если изменить режим совместимости нельзя, а подписи на каждой странице необходимы, рассмотрим способ "ручного" контроля вывода страниц. Суть метода заключается в том, чтобы перед выводом каждой строки основной части документа проверять, поместится ли она на текущий лист вместе с областью "подвала".
Разберем алгоритм работы с методом ПроверитьВывод():
// Подготовим область подвала из макета (где размещена картинка)
ОбластьПодвала = Макет.ПолучитьОбласть("ПодвалСПодписью");
// Массив для проверки вывода
ПроверяемыеОбласти = Новый Массив;
ПроверяемыеОбласти.Добавить(ОбластьСтроки); // Очередная строка данных
ПроверяемыеОбласти.Добавить(ОбластьПодвала); // Наш имитированный колонтитул
// В цикле вывода данных договора:
Для Каждого СтрокаДанных Из СписокСтрок Цикл
// Заполняем область данных...
// Проверяем, поместится ли строка ВМЕСТЕ с подвалом на текущую страницу
Если Не ТабДок.ПроверитьВывод(ПроверяемыеОбласти) Тогда
// Если не влезает, выводим подвал на текущей странице
ТабДок.Вывести(ОбластьПодвала);
// Переходим на новую страницу
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьСтроки);
КонецЦикла;
// В самом конце документа также выводим последний подвал
ТабДок.Вывести(ОбластьПодвала);
При использовании этого метода стоит помнить о нескольких моментах:
ПроверитьВывод() может давать погрешность, если в параметрах страницы установлено "По ширине листа". Рекомендуется зафиксировать масштаб (например, 100%).Рассмотрим еще одну ситуацию: нам нужно расположить подпись в конкретных координатах на каждой странице. Для этого мы можем использовать коллекцию Рисунки табличного документа.
Каждый рисунок (объект РисунокТабличногоДокумента) может содержать картинку и иметь привязку к ячейкам или абсолютные координаты. Проанализируем пример кода:
// Добавляем рисунок в табличный документ
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = ПодписьКартинка; // Объект типа Картинка
Рисунок.ГраницаСверху = Ложь;
Рисунок.ГраницаСнизу = Ложь;
Рисунок.ГраницаСлева = Ложь;
Рисунок.ГраницаСправа = Ложь;
// Устанавливаем размер и положение
// Привязываем к конкретной области (например, к подвалу)
Рисунок.Расположить(ТабДок.Область("R10C2:R12C5"));
Главная сложность здесь — расчет номера строки (R10) для каждой страницы. Вам все равно придется использовать логику из Метода 2, чтобы понимать, на какой строке заканчивается текущий лист, и вставлять туда рисунок программно.
Мы рассмотрели три основных подхода к решению задачи. Выбор метода зависит от ваших технических условий:
ФорматированнаяСтрока в свойствах колонтитула. Работает быстро, автоматически повторяется на всех листах, включая новые страницы при печати. Требует платформы и режима совместимости 8.3.15+.ПроверитьВывод(). Позволяет полностью контролировать внешний вид, но требует написания сложного алгоритма пагинации.Рисунки. Хорошо подходит, когда подпись должна стоять в строго определенном месте относительно сетки документа.Помните, что при сохранении документа в формат XLS (старый формат Excel) картинки из колонтитулов могут не перенестись. Для гарантированного сохранения визуального оформления рекомендуется использовать форматы PDF или XLSX.