Актуальность и проблема конвертации в среде 1С:Предприятие
В платформе 1С:Предприятие сформированные табличные документы (отчеты) могут быть сохранены в различные стандартные форматы: XLS, HTML, MXL, PDF и другие. Эти форматы неудобны для использования в качестве иллюстраций в автоматизированных процессах, таких как:
- Вставка изображений отчетов в генерируемые программно документы (Word, HTML);
- Отправка скриншотов отчетов через HTTP-сервисы;
- Автоматическая публикация отчетов на внешних ресурсах (сайтах, порталах).
Традиционный подход к получению графического представления отчета (например, PNG) включает следующие шаги: формирование отчета в режиме "Предприятие", выполнение скриншота экрана или его части, вставка изображения в документ.
Проблема при реализации программной конвертации графики в 1С — это необходимость установки внешних компонентов на клиентские или серверные машины, что часто недопустимо или трудоемко в корпоративной среде.
Предлагаю решение, реализующее механизм, который не требует предварительной установки дополнительных программ и компонент в операционную систему. Все необходимые утилиты выгружаются из макетов конфигурации во временный каталог непосредственно перед выполнением операции.
Описание реализации
Разработанное решение представляет собой внешнюю обработку, которая может быть встроена в любую конфигурацию 1С, либо вы можете использовать код в своих модулях.
Программно формируем отчет. Табличный документ сохраняем в PDF-формат.
Конвертируем из PDF в PNG, используя утилиту ImageMagick, все необходимые исполняемые файлы загружены в макеты обработки как двоичные данные.
Макеты выгружаются во временный каталог, выполняем командой ЗапуститьПриложение(), полученный PNG-файл возвращаем как двоичные данные.
Для реализации механизма были использованы портативные дистрибутивы:
ImageMagick (v7.1.2-8 portable): Основной инструмент для обработки изображений. Ссылка на дистрибутив: https://imagemagick.org/archive/binaries/ImageMagick-7.1.2-8-portable-Q16-x64.7z
Ghostscript (например, v10.0.6.0): Необходимая зависимость для ImageMagick при работе с PDF-файлами. Дистрибутив: https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10060/gs10060w32.exe
Процедуры и функции
Модуль формы обработки
Для демонстрации исполняемых отчетов используем схемы компоновки, которые также прикреплены как макеты в обработку. Доступны два отчета. Формируем список выбора для поля на форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// формирование списка отчетов конфигурации
Элементы.Отчет.СписокВыбора.Очистить();
НовоеЗначение = Элементы.Отчет.СписокВыбора.Добавить();
НовоеЗначение.Значение = "ОтчетВыручкаТаблица";
НовоеЗначение = Элементы.Отчет.СписокВыбора.Добавить();
НовоеЗначение.Значение = "ОтчетВыручкаДиаграмма";
КонецПроцедуры
Тело процедуры на клиенте, вызывается по кнопке "Сформировать"
&НаКлиенте
Процедура Сформировать(Команда)
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
// получаем имя каталога временных файлов, продолжаем выполнение
ОбратныйВызов = Новый ОписаниеОповещения("ПолучитьКаталогВременныхФайловЗавершение", ЭтотОбъект, , "ВыполнитьПриОшибке", ЭтотОбъект);
НачатьПолучениеКаталогаВременныхФайлов(ОбратныйВызов);
КонецПроцедуры
Продолжаем выполнение:
&НаКлиенте
Процедура ПолучитьКаталогВременныхФайловЗавершение(ИмяКаталогаВременныхФайлов, ДополнительныеПараметры) Экспорт
КаталогВременныхФайлов = ИмяКаталогаВременныхФайлов;
// получаемем изображение, pdf
Результат = СформироватьНаСервере();
// записываем файлы во временную папку
ИмяФайлаPNG = КаталогВременныхФайлов + Отчет + ".png";
Результат.ДвоичныеДанныеИзображение.Записать(ИмяФайлаPNG);
ИмяФайлаPDF = КаталогВременныхФайлов + Отчет + ".pdf";
Результат.ДвоичныеДанныеPDF.Записать(ИмяФайлаPDF);
// информирование о результатах
Сообщить("Выполнена конвертация. Источник/Приемник:");
Сообщить(ИмяФайлаPDF);
Сообщить(ИмяФайлаPNG);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПриОшибке(ИнформациОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
КонецПроцедуры
Формируем отчет на сервере, получаем изображение, выводим имена полученных файлов:
&НаСервере
Функция СформироватьНаСервере()
// программное формирование отчета
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
СхемаСКД = ОбработкаОбъект.ПолучитьМакет(Отчет);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаСКД, СхемаСКД.НастройкиПоУмолчанию);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// сохранение табличного документа в pdf
ИмяФайлаPDF = КаталогВременныхФайлов()+ Отчет + ".pdf";
ТабличныйДокумент.Записать(ИмяФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
// конвертация pdf в png
ДвоичныеДанные = ОбработкаОбъект.КонвертироватьВДвоичныеДанные(ИмяФайлаPDF);
ИмяФайлаPNG = КаталогВременныхФайлов()+ Отчет + ".png";
ДвоичныеДанные.Записать(ИмяФайлаPNG);
// информирование о результатах
Сообщить("Выполнена конвертация. Источник/Приемник:");
Сообщить(ИмяФайлаPDF);
Сообщить(ИмяФайлаPNG);
КонецФункции
Модуль объекта
// Конвертация pdf файла в формат png.
//
// Параметры:
// ИмяФайла - Строка - Полное имя файла источника
//
// Возвращаемое значение:
// Двоичные данные конвертированного pdf файал в формат png.
//
Функция КонвертироватьВДвоичныеДанные(ИмяФайла) Экспорт
// --- 1. Определение и подготовка путей ---
КорневойКаталог = КаталогВременныхФайлов();
ПутьВременнойПапки = КорневойКаталог + "IM_Temp_" + Новый УникальныйИдентификатор() + "\";
СоздатьКаталог(ПутьВременнойПапки);
ПутьВременныхФайлов = ПутьВременнойПапки;
ИмяФайлаИсточника = ИмяФайла;
ИмяФайлаПриемника = ПутьВременныхФайлов + "output_" + Новый УникальныйИдентификатор() + ".png";
ИсполняемыеФайлы = Новый Массив();
ИсполняемыеФайлы.Добавить("delegates_xml");
ИсполняемыеФайлы.Добавить("gsdll64_dll");
ИсполняемыеФайлы.Добавить("gswin64c_exe");
ИсполняемыеФайлы.Добавить("magick_exe");
// --- 2. Выгрузка исполняемых файлов из макетов ---
Для Каждого ИмяМакета Из ИсполняемыеФайлы Цикл
ИмяФайлаУтилиты = СтрЗаменить(ИмяМакета, "_", ".");
ПолныйПутьУтилиты = ПутьВременныхФайлов + ИмяФайлаУтилиты;
Макет = ПолучитьМакет(ИмяМакета);
Макет.Записать(ПолныйПутьУтилиты);
КонецЦикла;
// --- 3. Формирование и запуск команды ImageMagick ---
// Полный путь к magick.exe во временной папке
КомандаMagick = ПутьВременныхФайлов + "magick.exe";
// Формирование параметров команды
ПараметрыКоманды =
"-density 200 " +
" " + ИмяФайлаИсточника + " " +
"-trim " +
"-border 10x10 " +
" " + ИмяФайлаПриемника + " ";
// Полная строка команды
ПолнаяКоманда = КомандаMagick + " " + ПараметрыКоманды;
// Запуск приложения с ожиданием завершения
КодВозврата = Неопределено;
ЗапуститьПриложение(ПолнаяКоманда, ПутьВременныхФайлов, Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ВызватьИсключение "Ошибка конвертации. Команда завершилась с кодом: " + КодВозврата;
КонецЕсли;
// --- 4. Получение результата и очистка ---
ФайлПриемник = Новый Файл(ИмяФайлаПриемника);
Если ФайлПриемник.Существует() Тогда
// Читаем полученный PNG-файл как двоичные данные
ДвоичныеДанныеИзображения = Новый ДвоичныеДанные(ИмяФайлаПриемника);
// Удаление всех временных файлов утилит и результата
Для Каждого ИмяМакета Из ИсполняемыеФайлы Цикл
УдалитьФайлы(ПутьВременныхФайлов, СтрЗаменить(ИмяМакета, "_", "."));
КонецЦикла;
УдалитьФайлы(ПутьВременныхФайлов, ИмяФайлаПриемника);
УдалитьФайлы(ПутьВременнойПапки);
Возврат ДвоичныеДанныеИзображения;
Иначе
ВызватьИсключение "Ошибка: Файл-результат конвертации не найден (" + ИмяФайлаПриемника + ")";
КонецЕсли;
Возврат Неопределено;
КонецФункции
Демонстрация работы
Выбираем отчет на форме, нажимаем "Сформировать". В окне сообщений путь к сформированным файлам.
Пример отчета, сформированного в режиме пользователя:

Изображения в Word после Вставка->Иллюстрации->Рисунки:

Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.186.21
Вступайте в нашу телеграмм-группу Инфостарт
