Есть внешняя печатная форма (ВПФ).
Соответственно, зарегистрированная в Справочнике.ДополнительныеОтчетыИОбработки.
БСП: 3.0.1

ВПФ - не имеет формы. Весь функционал реализован в "Модуле объекта"

ВОПРОС: Можно ли организовать (и как) выполнение процедуры Печать фоново?

```1c
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
    КоллекцияПечатныхФорм,
    УказатьНаименованиеКомандыПечати(),
    УказатьНаименованиеВнешнейПечатнойФормы(),
    ПечатьФормы(МассивОбъектов));

    КонецПроцедуры
```

З.Ы. Конкретнее - Можно ли это организовать без формы, без общего модуля.
А из модуля объекта ВПФ
З.Ы.Ы. Наличие прогресс-бара - приветствуется...
---
Вот "Рыба".
Возвращается табличный документ.
Я его просто показываю. При желании можете вывести в окно печати как другие печатные формы.
---
Для печати нужен интерактивный вход пользователя, в серверном контексте он не используется, поэтому я, для себя, воспользовался консольной утилитой печати, примерный алгоритм настройки печати такой, (для клиент-серверного варианта):

1. Дать пользователю USR1CV8 право локального входа (можно временно, можно, оставить для дальнейших настроек)
2. Войти под пользователем USR1CV8 и установить ему нужный, для печати, принтер
3. Если требуются нестандартные размеры печати (как в моем случае) настроить дополнительные пользовательские размеры печати.
С предварительной подготовкой, все*.

* Найти / скачать / установить понравившуюся утилиту консольной печати (мой пример ниже)

Создать в конфигурации модуль с серверным контекстом, ниже, пример такого модуля ("ПечатьСервер"):

```1c
    Функция ПечатьЭтикеткиСервер(структура_ПараметрыПечати, массив_ИндексыПечатаемыхСтрок) Экспорт
    тд_ТД = Новый ТабличныйДокумент;

    //........................

    ИмяПринтера = "print"; //Имя как в ОС видно пользователю USR1CV8
    тд_ТД.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    тд_ТД.РазмерСтраницы ="Custom";
    тд_ТД.ВысотаСтраницы = 60;
    тд_ТД.ШиринаСтраницы = 100;
    ДоступныйКаталог = КаталогВременныхФайлов();
    ИмяФайлаПДФ = "111";
    ИмяФайла = ?(Прав(ДоступныйКаталог,1) = "\", ДоступныйКаталог, ДоступныйКаталог + "\") + ИмяФайлаПДФ + ".pdf";
    тд_ТД.Записать(тек_ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
    ИмяШаблонПечати = "100шx60в"; //Имя шаблона печати, которое, задавалось для принтера в его свойствах
    строка_Приложение = ""c:\Program Files (x86)\1cv8\cmd_pdf_to_printer\pdfprint.exe"" + " -printer" + " "" + ИмяПринтера + СтрЗаменить("" -paper "100шx60в" -scale 100 ", "100шx60в", ИмяШаблонПечати) + ИмяФайла;
    КодВозврата = Неопределено;
    ЗапуститьПриложение(тек_Приложение, , Истина, КодВозврата);
    строка_ИмяФайлаПринтера = ИмяФайла;

    Возврат строка_ИмяФайлаПринтера;
    КонецФункции
```
---
Для печати нужен интерактивный вход пользователя

Для печати ВПФ пользователь должен выбрать пункт из меню "Печать", т.е. интерактивно войти...

З.Ы. Спасибо за информацию, но у меня уже есть ВПФ которая всё делает как мне надо, просто время её работы от 2 до 10 минут хотелось бы разрешить пользователю что нибудь делать ещё...
---
Ок.

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

Потому что она "парсит" журнал регистрации за несколько лет...
---
Это не значит, что в коде нельзя ничего оптимизировать.
---
Это не значит, что в коде нельзя ничего оптимизировать

```1c
    Фильтр = Новый Структура;

    Фильтр.Вставить("ДатаНачала", ДатаОбъекта);
    Фильтр.Вставить("ДатаОкончания", ТекущаяДата());

    МассивСобытий = Новый Массив;
    МассивСобытий.Добавить("_$Data$_.New");
    МассивСобытий.Добавить("_$Data$_.Update");
    МассивСобытий.Добавить("_$Data$_.Post");
    МассивСобытий.Добавить("_$Data$_.Unpost");
    МассивСобытий.Добавить("_$Data$_.Delete");
    Фильтр.Вставить("Событие",МассивСобытий);

    Фильтр.Вставить("Метаданные",Ссылка.Метаданные());

    Фильтр.Вставить("СтатусТранзакции",СтатусТранзакцииЗаписиЖурналаРегистрации.Зафиксирована);

    СтрокаКолонокЖурналаРегистрации = "Дата,ИмяПользователя,ПредставлениеСобытия,Данные";

    ТаблицаСобытий = Новый ТаблицаЗначений;

    Попытка
    ВыгрузитьЖурналРегистрации(ТаблицаСобытий,Фильтр,СтрокаКолонокЖурналаРегистрации);
    исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
```

Маэсто - прошу...

З.Ы. При условии существенного прироста быстродействия работа будет оплачена $m. Например - 30 $m.
---
З.Ы. При условии существенного прироста быстродействия работа будет оплачена $m. Например - 30 $m.
Для такого рода задачи (регулярное наси чтение ЖР) я бы сделал хранение данных (дубль) в таком виде, чтобы это занимало до нескольких секунд.
И использовал регламентное задание, чтобы синхронизировать (догрузить) данные в "копию".
---
Эта задача (с использованием данной ВПФ) решается крайне редко и нерегулярно...

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

З.Ы. Можно переписать полностью весь отчет для выполнения его в фоне, но т.к. он (как писалось выше) редко используется, и появился данный вопрос:
МОЖНО ЛИ ЗАПУСТИТЬ ВПФ ФОНОВО????
Из подключаемой (для ВПФ "стандартной" команды) "ПЕЧАТЬ"...
---
Можно
---
Можно

Спасибо!

Очень информативно...
---
Так еще не получилось что-ли?
---
не получилось что-ли?

Пока и не брался т.к. пока не представляю как, да и в этой теме пока не увидел как...
---
Если в конфигурации есть подсистема БСП Варианты отчетов, то как вариант - можно предложить переделать ВПФ на отчет.
Отчет по умолчанию умеет формироваться в фоновом режиме.
В отчете сделать СКД с внешним набором данных, добавить параметр для указания ссылок.
А далее в модуле объекта в ПриКомпоновкеРезультата формировать печатную форму стандартным образом, не используя СКД, параметры получать из настроек компоновки.
---
Я об этом думал в самом начале, но не хочу переписывать всё...
---
Вот "Рыба".
Возвращается табличный документ.
Я его просто показываю. При желании можете вывести в окно печати как другие печатные формы.
---
Спасибо!
Пока 1$m.

Посмотрю, отправлю остальное...
---
Можно ссылку на обработку получать из параметров, а не искать :)

```1c
    Параметры.ДополнительнаяОбработкаСсылка;
```
---
Поправил
---
Параметры.ДополнительнаяОбработкаСсылка;

 papami отдал 1$m
---
Вы так и не показали замер производительности.
Возможно, что дальше в коде есть проблемные места.
---
Поверьте - приведенный код "тот тормоз" который меня интересует, остальное: "такая мелочь"...
Так что замер производительности я не буду выкладывать...

Вопрос всё тот же: Как запустить выполнения кода из ВПФ фоново, без формы...
Из стандартной процедуры Печать.

Подзадача за которую вы не взялись - оптимизировать обработку журнала регистрации
---
Если вам интересна оптимизация формы - сделайте замер производительности, выделите места, которые долго выполняются, выложите замер и код.
Тогда вполне возможно, что что-то получится улучшить.
---
Смотрите (18)
---
Замер производительности покажите еще пожалуйста.
---
Глянь сюда: https://infostart.ru/public/274721/ (я когда-то давно рисовал) или в похожую - их достаточно. Может, поможет.
ЗЫ. Хотя нет, сюда не смотри :) Если тебе без своего прогресс-бара, то поищи другой пример. Там все гораздо проще делается. Вот что-то из этой серии: https://infostart.ru/1c/articles/1352398/
---
Вот что-то из этой серии: https://infostart.ru/1c/articles/1352398/

Порадовал (1) комент http://forum.infostart.ru/forum24/topic253724/message2566834/#message2566834
Автором оказался Я.

З.Ы, Цеплять к внешней обработке общий модуль - "не комильфо"...
---
З.Ы, Цеплять к внешней обработке общий модуль - "не комильфо"...
Без общего модуля не обойтись никак.
Ибо изначально в фоне можно выполнить только экспортную процедуру общего модуля. А все остальное - это фокусы с Выполнить() через такую процедуру.
---
А это решение вообще рабочее? Сталкивался с ЖР и часто зависания были, что рейд-диски на 100% загружены были, базы лагали, юзеры жаловались - и это стоило только обратиться к ЖР за большой период или со специфическими отборами. Журнал вроде lgd был.
наверное, поэтому мы используем внешний ЖР.
Полагаю, этой "печатной форме" категорически не рекомендуется запуск при параллельной работе/в разных сеансах.
---
Ну без фона запусков ВПН было больше 100
Зависаний не наблюдал...

З.Ы. Если переделаю в фоновое... Попробую не забыть и отписаться...
Но это чуть позже, сейчас есть задачи "срачнее"... ;-)

З.Ы.Ы. Посмотрел у меня журнал: .lgp
---
Очень странно, почему нет лагов) Наверняка они есть, просто все молчат)
---
Наверняка они есть, просто все молчат)

Ну пару десятков запусков я наблюдал...
"Полёт норамальный"...
---
Лично я бы просто вызвал модуль управления печатью через длительную операцию и передал бы туда достаточное количество параметров.
---
Можно немного "разжевать"?

З.Ы. У меня вроде в этой ситуации нет клиентского контекста...
---
а зачем нужен клиентский контекст? Печать обычно берет данные из базы, а не из формы. Особеннт ВПФ.
---
Я с длительными операциями ещё не сталкивался - может что и представляю неправильно...
А доступа к документации нет ;-(
ИТС: Длительные операции на сервере
---
А доступа к документации нет ;-(
ИТС: Длительные операции на сервере ИТС - это не документация? Или как раз к этой статье доступа и нет?
---
Фоновое выполнение длительных операций
Для того чтобы длительные операции дополнительного объекта запускались в фоновом режиме, необходимо запустить выполнение команды в фоновом задании и после его завершения принять результат.

Программный интерфейс, помогающий запускать длительные операции в фоне, представлен следующими процедурами:

1. В общем модуле ДополнительныеОтчетыИОбработкиКлиент: процедуры ВыполнитьКомандуВФоне и ПараметрыВыполненияКомандыВФоне.

2. В общем модуле ДополнительныеОтчетыИОбработки: ВыполнитьКомандуИзФормыВнешнегоОбъекта и ВыполнитьКоманду.

Рассмотрим подключение по шагам.

Шаг 1. В форме дополнительной обработки добавить ключевые параметры:

● ДополнительнаяОбработкаСсылка типа СправочникСсылка.ДополнительныеОтчетыИОбработки для хранения ссылки внешнего объекта;

● ИдентификаторКоманды типа Строка для хранения идентификатора выполняемой команды.

Шаг 2. Запустить длительную операцию при помощи кода:

```1c
    ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);

    ПараметрыКоманды.СопровождающийТекст = НСтр("ru = '<Вставить представление выполняемой команды...>'");

    Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);

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

Шаг 3. Добавить процедуру для приемки результата:

```1c
    &НаКлиенте

    Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт

    // Обработка результата.

    Если Операция.Статус = "Выполнено" Тогда

    ПоказатьОповещениеПользователя(НСтр("ru = 'Успешное завершение'"), , СопровождающийТекст, БиблиотекаКартинок.Успешно32);

    Иначе

    ВызватьИсключение Операция.КраткоеПредставлениеОшибки;

    КонецЕсли;

    КонецПроцедуры
```

Шаг 4. В модуле объекта добавить обработчик команды Вызов серверного метода по шаблону, приведенному в разделе Вариант запуска «Вызов серверного метода».

В демонстрационной базе БСП данная возможность представлена в обработках Демо: Управление полнотекстовым поиском, Демо: Загрузка номенклатуры из прайс-листа (профили безопасности), Демо: Обработка заполнения и Демо: Создание связанных объектов в справочнике Дополнительные отчеты и обработки.
---
Спасибо.

Это я знаю, но по умолчанию ВПФ не имеет "формы"...

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

по поводу прогресс бара, - а в каком окне вы планируете за ним наблюдать?
для этого нужна форма, в своей внешней обработке?

как бы действия такие
запускаете свою обработку в Фоне, получаете его ИД
запускаете форму с прогрессом баром, в ней по ИД фонового задания получаете его данные и показываете прогресс бар

(пока писал ответ,, в принципе уже все и насоветовали)