Как запустить приложение на клиенте из модуля менеджера и вывести PDF в табличный документ?

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

При разработке сложных печатных форм в 1С программисты часто сталкиваются с ситуацией, когда стандартных средств платформы недостаточно. Типичный пример — необходимость конвертации PDF-файла в картинку для последующего вывода в ТабличныйДокумент. Основная сложность заключается в том, что печать в современных конфигурациях (особенно на базе БСП) происходит в модуле менеджера на стороне сервера, а внешние утилиты или пути к файлам часто доступны только на стороне клиента. В этой статье мы подробно разберем, почему метод ЗапуститьПриложение() не работает так, как ожидается, и рассмотрим эффективные стратегии решения этой задачи.

Почему сервер «не видит» клиентское приложение?

Прежде всего, проанализируем ситуацию. Когда код выполняется в модуле менеджера, он работает в контексте службы сервера 1С:Предприятие. Попытка вызвать ЗапуститьПриложение() с путем вроде "C:\Program Files\MyApp\app.exe" приведет к тому, что система будет искать этот файл на физическом сервере, а не на компьютере пользователя. Кроме того, серверная служба обычно работает под технической учетной записью (например, USR1CV8), у которой нет доступа к рабочему столу пользователя и его локальным папкам.

Рассмотрим по шагам основные способы обхода этого ограничения.

Решение 1: Перенос логики на сторону сервера

Самый прямой путь — сделать так, чтобы серверу не нужно было «обращаться к клиенту». Если вам необходимо использовать стороннюю утилиту (например, ImageMagick или Ghostscript для конвертации PDF), ее следует установить непосредственно на сервер 1С.

Важные нюансы при установке ПО на сервер:

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

Пример вызова на сервере может выглядеть так:


Команда = """" + ПутьКПрограммеНаСервере + """ convert """ + ПутьКФайлуPDF + """ """ + ПутьКРезультату + """";
ЗапуститьПриложение(Команда, , Истина); // Ждем завершения выполнения

Решение 2: Использование возможностей БСП (архитектурный подход)

Если мы работаем с Библиотекой стандартных подсистем (БСП), то процесс формирования печатной формы можно перехватить на клиенте до того, как управление уйдет на сервер. Проанализируем, как это сделать без «хаков».

Выясним причину: модуль менеджера вызывается из общей формы печати. Мы можем вмешаться в процесс в модуле команды печати или в процедуре УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.

Алгоритм действий:

  1. На клиенте, перед вызовом печати, запускаем конвертацию PDF в картинку с помощью ЗапуститьПриложение().
  2. Помещаем полученную картинку во ВременноеХранилище с помощью метода ПоместитьВоВременноеХранилище().
  3. Передаем полученный АдресХранилища в параметры печати.
  4. В модуле менеджера извлекаем картинку из хранилища и вставляем в ТабличныйДокумент.

Рассмотрим пример кода на клиенте:


// На клиенте
АдресКартинки = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьККонвертированнойКартинке));
ПараметрыПечати.Вставить("АдресКартинки", АдресКартинки);
// Далее вызываем стандартную печать БСП, передавая эти параметры

Решение 3: Система взаимодействия (современный метод)

Если база использует Систему взаимодействия, мы можем организовать обратную связь «Сервер -> Клиент». Это позволяет серверу отправить запрос клиентскому приложению на выполнение определенного действия.

Проанализируем схему:

Это сложный, но наиболее гибкий путь для асинхронной работы.

Решение 4: Использование Native API и объекта ДокументPDF

Начиная с версии платформы 8.3.16, в 1С появился встроенный объект ДокументPDF. Разберем, как он может помочь. Хотя он не умеет напрямую «рендерить» страницу в Картинку, он позволяет работать с метаданными документа прямо на сервере без вызова внешних приложений.

Однако для полноценной визуализации лучше использовать внешние компоненты (Native API), которые работают внутри адресного пространства сервера. Библиотеки вроде PDFium позволяют конвертировать PDF в массив байтов (изображение) без создания временных файлов и запуска сторонних .exe.

Пример структуры кода при использовании внешней компоненты:


ПодключитьВнешнююКомпоненту("ОбщийМакет.КонвертерPDF", "PDFLib", ТипВнешнейКомпоненты.Native);
Компонента = Новый("AddIn.PDFLib.Renderer");
КартинкаДанные = Компонента.RenderPageToPNG(ДанныеPDF, НомерСтраницы);
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(КартинкаДанные);

Решение 5: Использование COM-объектов и .NET

На Windows-серверах эффективным решением является использование библиотек .NET через COM-обертку. Это позволяет избежать проблем с правами интерактивного запуска приложений. Мы можем использовать библиотеки Magick.NET или аналогичные.

Почему это лучше, чем ЗапуститьПриложение? Когда мы вызываем внешний .exe, операционная система создает новый процесс, тратит ресурсы на его инициализацию и передачу параметров через командную строку. При использовании COM-объекта или Native API вызов происходит практически мгновенно, а данные передаются напрямую в памяти (через ДвоичныеДанные).

Подведем итоги

Мы рассмотрели несколько стратегий решения проблемы. Выбор конкретного метода зависит от ваших полномочий в системе:

  1. Если вы имеете доступ к администрированию сервера — устанавливайте софт на сервер и настраивайте права для пользователя USR1CV8.
  2. Если вы ограничены рамками конфигурации — перестраивайте архитектуру печати в БСП, подготавливая данные на стороне клиента и передавая их на сервер через временное хранилище.
  3. Для высоконагруженных систем — используйте внешние компоненты (Native API), чтобы исключить запуск сторонних процессов и повысить стабильность сервера.

Помните, что архитектурно правильный код в 1С всегда разделяет подготовку данных (сервер) и взаимодействие с оборудованием или локальными файлами пользователя (клиент). Старайтесь избегать «хаков» с обработчиками ожидания, отдавая предпочтение штатным механизмам БСП и платформы.

← На главную