Как выполнить процедуру печати внешней печатной формы в фоновом режиме?

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

Разберем ситуацию, когда внешняя печатная форма (ВПФ) требует длительного времени на выполнение (например, из-за парсинга журнала регистрации за несколько лет), из-за чего пользователь вынужден ждать завершения операции, теряя возможность работать в программе. Рассмотрим, как организовать фоновое выполнение такой задачи, сохранив удобство использования.

Основные ограничения и архитектура решения

Важно понимать, что платформа 1С не позволяет просто так «перекинуть» выполнение кода из модуля объекта ВПФ в фоновое задание. Фоновое задание — это серверный процесс, который работает независимо от сеанса пользователя. Основные выводы, к которым мы пришли в процессе анализа:

  1. Фоновое задание может вызывать только экспортные процедуры из общих модулей.
  2. Для запуска длительных операций в типовых конфигурациях на БСП существует подсистема ДлительныеОперации.
  3. Непосредственный вывод табличного документа на принтер в фоновом режиме требует либо интерактивного участия, либо настройки сервера печати (консольных утилит), если требуется полная автоматизация без участия пользователя.

Шаг 1: Использование механизма длительных операций БСП

Для корректного запуска фонового процесса воспользуемся программным интерфейсом БСП. Чтобы это работало для ВПФ, нам потребуется небольшой клиентский код в форме, из которой вызывается печать. Если у ВПФ нет своей формы, рекомендуется добавить простую форму управления или вызывать её из формы документа через механизм дополнительных отчетов и обработок.

Рассмотрим, как запустить процесс через ДополнительныеОтчетыИОбработкиКлиент:


// Пример запуска длительной операции из модуля формы
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Формирование печатной формы...'");
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект);

ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Параметры.ИдентификаторКоманды, ПараметрыКоманды, Обработчик);

После завершения фонового задания необходимо обработать результат:


&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт
    Если Операция.Статус = "Выполнено" Тогда
        // Результат получен, можно выводить пользователю
        ПоказатьОповещениеПользователя("Успешно", , "Печать завершена", БиблиотекаКартинок.Успешно32);
    Иначе
        ВызватьИсключение Операция.КраткоеПредставлениеОшибки;
    КонецЕсли;
КонецПроцедуры

Шаг 2: Настройка безопасного режима

При выполнении внешних обработок в фоне часто возникает ошибка Установлен безопасный режим. Это связано с тем, что БСП по умолчанию блокирует опасные действия для внешних модулей. Чтобы решение заработало, необходимо в справочнике ДополнительныеОтчетыИОбработки открыть элемент соответствующей ВПФ и отключить «Безопасный режим». Будьте осторожны: это открывает возможность для выполнения произвольного серверного кода.

Шаг 3: Оптимизация работы с журналом регистрации

Главная причина «тормозов» в вашем случае — парсинг огромного массива данных из журнала регистрации. Даже перенос выполнения в фон не уберет высокую нагрузку на диск и процессор сервера. Рассмотрим более эффективный путь:

  1. Создайте регистр сведений, который будет хранить «дубликат» необходимых данных из ЖР.
  2. Настройте регламентное задание, которое будет выполняться, например, раз в час, догружая новые события из ЖР в ваш регистр.
  3. Перепишите код печатной формы так, чтобы она делала выборку не из ВыгрузитьЖурналРегистрации, а из вашего регистра сведений.

Это превратит запрос, который выполняется 10 минут, в операцию, занимающую доли секунды. Это лучшее решение, так как оно снимает нагрузку с сервера 1С и исключает блокировки таблиц базы данных при чтении логов.

Шаг 4: Автоматизация печати на сервере

Если цель — не просто подготовить табличный документ, а именно отправить его на физический принтер в фоне, то используйте консольные утилиты для печати PDF-файлов. Суть метода:

Таким образом, мы объединяем асинхронный запуск процесса (через БСП), оптимизированную выборку данных (через кэширующий регистр) и автоматизированную систему вывода на печать. Это позволит пользователю продолжать работу в системе, пока тяжелая печатная форма формируется и отправляется на печать в фоновом режиме.

← На главную