Разберем ситуацию, когда внешняя печатная форма (ВПФ) требует длительного времени на выполнение (например, из-за парсинга журнала регистрации за несколько лет), из-за чего пользователь вынужден ждать завершения операции, теряя возможность работать в программе. Рассмотрим, как организовать фоновое выполнение такой задачи, сохранив удобство использования.
Важно понимать, что платформа 1С не позволяет просто так «перекинуть» выполнение кода из модуля объекта ВПФ в фоновое задание. Фоновое задание — это серверный процесс, который работает независимо от сеанса пользователя. Основные выводы, к которым мы пришли в процессе анализа:
ДлительныеОперации.Для корректного запуска фонового процесса воспользуемся программным интерфейсом БСП. Чтобы это работало для ВПФ, нам потребуется небольшой клиентский код в форме, из которой вызывается печать. Если у ВПФ нет своей формы, рекомендуется добавить простую форму управления или вызывать её из формы документа через механизм дополнительных отчетов и обработок.
Рассмотрим, как запустить процесс через ДополнительныеОтчетыИОбработкиКлиент:
// Пример запуска длительной операции из модуля формы
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Формирование печатной формы...'");
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Параметры.ИдентификаторКоманды, ПараметрыКоманды, Обработчик);
После завершения фонового задания необходимо обработать результат:
&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт
Если Операция.Статус = "Выполнено" Тогда
// Результат получен, можно выводить пользователю
ПоказатьОповещениеПользователя("Успешно", , "Печать завершена", БиблиотекаКартинок.Успешно32);
Иначе
ВызватьИсключение Операция.КраткоеПредставлениеОшибки;
КонецЕсли;
КонецПроцедуры
При выполнении внешних обработок в фоне часто возникает ошибка Установлен безопасный режим. Это связано с тем, что БСП по умолчанию блокирует опасные действия для внешних модулей. Чтобы решение заработало, необходимо в справочнике ДополнительныеОтчетыИОбработки открыть элемент соответствующей ВПФ и отключить «Безопасный режим». Будьте осторожны: это открывает возможность для выполнения произвольного серверного кода.
Главная причина «тормозов» в вашем случае — парсинг огромного массива данных из журнала регистрации. Даже перенос выполнения в фон не уберет высокую нагрузку на диск и процессор сервера. Рассмотрим более эффективный путь:
ВыгрузитьЖурналРегистрации, а из вашего регистра сведений.Это превратит запрос, который выполняется 10 минут, в операцию, занимающую доли секунды. Это лучшее решение, так как оно снимает нагрузку с сервера 1С и исключает блокировки таблиц базы данных при чтении логов.
Если цель — не просто подготовить табличный документ, а именно отправить его на физический принтер в фоне, то используйте консольные утилиты для печати PDF-файлов. Суть метода:
ТабличныйДокумент в PDF на сервере: тд_ТД.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF).ЗапуститьПриложение.USR1CV8), имеет право доступа к принтеру в операционной системе.Таким образом, мы объединяем асинхронный запуск процесса (через БСП), оптимизированную выборку данных (через кэширующий регистр) и автоматизированную систему вывода на печать. Это позволит пользователю продолжать работу в системе, пока тяжелая печатная форма формируется и отправляется на печать в фоновом режиме.