Как в 1С добавить QR-код на каждую страницу Excel-файла при печати?

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

При организации электронного документооборота и печати присоединенных файлов часто возникает задача заверения каждой страницы документа штампом электронной цифровой подписи (ЭЦП) или QR-кодом идентификации. Если для внутренних печатных форм 1С или документов Microsoft Word задача решается типовыми средствами платформы достаточно просто, то обработка таблиц Excel требует особого подхода.

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

Решение через колонтитулы страницы в Microsoft Excel

Для того чтобы изображение (QR-код) автоматически отображалось на каждой странице без необходимости вручную пересчитывать границы страниц и переверстывать строки документа, оптимально использовать колонтитулы (верхний или нижний). В объектной модели Excel за настройку параметров страницы отвечает свойство PageSetup.

Проанализируем основные требования и типичные ошибки при программной настройке колонтитулов из 1С:

  1. Передача физического пути к картинке: Свойство CenterFooterPicture.Filename (или RightFooterPicture.Filename) принимает исключительно абсолютный путь к файлу на локальном диске. Если передать навигационную ссылку 1С вида e1cib/tempstorage/... или двоичные данные, Excel выдаст ошибку COM-объекта. Картинку необходимо предварительно выгрузить из временного хранилища на диск.
  2. Обязательный тег вывода графики &G: Чтобы Excel отобразил картинку, заданной через свойство Filename, в строковом значении колонтитула (например, CenterFooter или RightFooter) обязательно должен присутствовать служебный макрос &G. Без него изображение не появится на листе.

Пример программного кода в 1С

Посмотрим на практическую реализацию процедуры, которая извлекает Excel-файл и изображение QR-кода из временного хранилища, помещает QR-код и поясняющий текст в нижний колонтитул и сохраняет результат:


Процедура ДобавитьКолонтитулВФайлXLS(АдресФайлаВХранилище, АдресКартинкиВХранилище, ПараметрыПодписи)
    // 1. Выгружаем Excel-документ на диск во временный каталог
    ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
    ИмяФайлаExcel = КаталогВременныхФайлов() + "temp_doc.xlsx";
    ИмяФайлаРезультат = КаталогВременныхФайлов() + "temp_doc_out.xlsx";
    ДвоичныеДанныеФайла.Записать(ИмяФайлаExcel);

    // 2. Выгружаем изображение QR-кода на диск
    ИмяФайлаQR = КаталогВременныхФайлов() + "qr_stamp.png";
    ДвоичныеДанныеQR = ПолучитьИзВременногоХранилища(АдресКартинкиВХранилище);
    ДвоичныеДанныеQR.Записать(ИмяФайлаQR);

    // 3. Открываем приложение Excel через COM-соединение
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
        ВызватьИсключение "Не удалось инициализировать COM-объект Excel.Application: " + ОписаниеОшибки();
    КонецПопытки;

    Попытка
        Excel.DisplayAlerts = 0;
        Книга = Excel.Workbooks.Open(ИмяФайлаExcel);
        
        // Обрабатываем первый лист книги (или организуем цикл по всем листам)
        ExcelЛист = Книга.Worksheets(1);
        
        // Настраиваем вывод текста и изображения
        ТекстПодписи = "Документ подписан ЭЦП: " + СокрЛП(ПараметрыПодписи.КомуВыдан) + " (" + СокрЛП(ПараметрыПодписи.Отпечаток) + ")";
        
        // Размещаем текст в левой части нижнего колонтитула
        ExcelЛист.PageSetup.LeftFooter = ТекстПодписи;
        
        // Назначаем файл картинки для правой части нижнего колонтитула
        ExcelЛист.PageSetup.RightFooterPicture.Filename = ИмяФайлаQR;
        
        // Задаем масштаб картинки (сохраняем пропорции и ограничиваем высоту)
        ExcelЛист.PageSetup.RightFooterPicture.LockAspectRatio = Истина;
        ExcelЛист.PageSetup.RightFooterPicture.Height = 45; // Высота в пунктах
        
        // Активируем вывод графического объекта через служебный тег &G
        ExcelЛист.PageSetup.RightFooter = "&G";
        
        // Сохраняем изменения и закрываем книгу
        Книга.SaveAs(ИмяФайлаРезультат);
        Книга.Close(Ложь);
    Исключение
        Excel.Quit();
        ВызватьИсключение "Ошибка при модификации Excel-файла: " + ОписаниеОшибки();
    КонецПопытки;

    Excel.Quit();

    // 4. Помещаем модифицированный файл обратно во временное хранилище
    МодифицированныеДанные = Новый ДвоичныеДанные(ИмяФайлаРезультат);
    ПоместитьВоВременноеХранилище(МодифицированныеДанные, АдресФайлаВХранилище);

    // Удаляем временные файлы
    УдалитьФайлы(ИмяФайлаExcel);
    УдалитьФайлы(ИмяФайлаРезультат);
    УдалитьФайлы(ИмяФайлаQR);
КонецПроцедуры

Особенности работы COM-объекта на стороне сервера

При выполнении подобного кода на сервере 1С или в фоновом задании важно учитывать системные ограничения:

  1. Наличие принтера по умолчанию: Объект PageSetup обращается к параметрам драйвера печати. Если у системной учетной записи службы usr1cv8 не настроен принтер по умолчанию, вызов методов PageSetup завершится исключением.
  2. Системные каталоги рабочего стола: Для корректной работы Microsoft Office под неинтерактивными службами Windows требуется наличие папок C:\Windows\System32\config\systemprofile\Desktop и C:\Windows\SysWOW64\config\systemprofile\Desktop с правами на запись для пользователя службы 1С.

Альтернативные способы решения задачи

Если использование COM-объекта Excel невозможно (например, на серверах под управлением Linux или в облачной инфраструктуре), рассмотрим другие подходы:

  1. Загрузка в ТабличныйДокумент: С помощью метода ТабличныйДокумент.Прочитать(ИмяФайла) загружаем Excel-файл во внутренний объект 1С. Далее настраиваем повторяющиеся при печати строки с помощью свойства ПовторятьПриПечатиСтроки или управляем выводом страниц через метод ПроверитьВывод, вставляя QR-код в конец каждого сформированного листа.
  2. Конвертация в формат PDF: Преобразуем входящий Excel-файл в формат PDF. После этого накладываем QR-код как графический штамп (watermark) в заданные координаты каждой страницы и отправляем на печать итоговый PDF-документ.
← На главную