Выполнение ВПФ фоново

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

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

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

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


З.Ы. Конкретнее - Можно ли это организовать без формы, без общего модуля.
А из модуля объекта ВПФ
З.Ы.Ы. Наличие прогресс-бара - приветствуется...
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
33. papami 56 10.11.21 16:49 Сейчас в теме +1 $m
(30) Вот "Рыба".
Возвращается табличный документ.
Я его просто показываю. При желании можете вывести в окно печати как другие печатные формы.
Прикрепленные файлы:
ВПФ_Фоном.epf
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. djvu 145 04.11.21 13:51 Сейчас в теме
(1)

Для печати нужен интерактивный вход пользователя, в серверном контексте он не используется, поэтому я, для себя, воспользовался консольной утилитой печати, примерный алгоритм настройки печати такой, (для клиент-серверного варианта):

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

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

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

Функция ПечатьЭтикеткиСервер(структура_ПараметрыПечати, массив_ИндексыПечатаемыхСтрок) Экспорт
        тд_ТД = Новый ТабличныйДокумент;
        
//........................
        
        ИмяПринтера = "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в", ИмяШаблонПечати) + ИмяФайла;  
       КодВозврата = Неопределено; 
       ЗапуститьПриложение(тек_Приложение, , Истина, КодВозврата);
       строка_ИмяФайлаПринтера =  ИмяФайла;      

        Возврат строка_ИмяФайлаПринтера;	
КонецФункции
Показать
3. AnryMc 849 04.11.21 13:56 Сейчас в теме
(2)
Для печати нужен интерактивный вход пользователя


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

З.Ы. Спасибо за информацию, но у меня уже есть ВПФ которая всё делает как мне надо, просто время её работы от 2 до 10 минут хотелось бы разрешить пользователю что нибудь делать ещё...
6. djvu 145 04.11.21 14:35 Сейчас в теме
(3)

Ок.

Просто, в приведенном примере интерактивный вход не обязателен (основная цель, отказ от интерактивного входа), а функцию можно вызывать из фонового/регламентного задания (побочный эффект)
13. papami 56 09.11.21 17:23 Сейчас в теме
(3) Может лучше разобраться почему ВПФ занимает так много времени, не?
Sashares; +1 Ответить
14. Sashares 35 09.11.21 17:33 Сейчас в теме
15. AnryMc 849 09.11.21 17:51 Сейчас в теме
(13)
Может лучше разобраться почему ВПФ занимает так много времени, не?


Потому что она "парсит" журнал регистрации за несколько лет...
16. Sashares 35 09.11.21 17:53 Сейчас в теме
(15)Это не значит, что в коде нельзя ничего оптимизировать.
18. AnryMc 849 09.11.21 18:29 Сейчас в теме
(16)
Это не значит, что в коде нельзя ничего оптимизировать


		Фильтр  =  Новый Структура;
		
		Фильтр.Вставить("ДатаНачала", ДатаОбъекта);
		Фильтр.Вставить("ДатаОкончания", ТекущаяДата());
					
		МассивСобытий = Новый Массив;
		МассивСобытий.Добавить("_$Data$_.New");
		МассивСобытий.Добавить("_$Data$_.Update");
		МассивСобытий.Добавить("_$Data$_.Post");
		МассивСобытий.Добавить("_$Data$_.Unpost");
		МассивСобытий.Добавить("_$Data$_.Delete");
		Фильтр.Вставить("Событие",МассивСобытий);
			
		Фильтр.Вставить("Метаданные",Ссылка.Метаданные());
			
		Фильтр.Вставить("СтатусТранзакции",СтатусТранзакцииЗаписиЖурналаРегистрации.Зафиксирована);
		
		СтрокаКолонокЖурналаРегистрации = "Дата,ИмяПользователя,ПредставлениеСобытия,Данные";
		
		ТаблицаСобытий = Новый ТаблицаЗначений;
		
		Попытка
			ВыгрузитьЖурналРегистрации(ТаблицаСобытий,Фильтр,СтрокаКолонокЖурналаРегистрации);
		исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
Показать


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

З.Ы. При условии существенного прироста быстродействия работа будет оплачена $m. Например - 30 $m.
21. papami 56 09.11.21 18:43 Сейчас в теме
(18)
З.Ы. При условии существенного прироста быстродействия работа будет оплачена $m. Например - 30 $m.

Для такого рода задачи (регулярное наси чтение ЖР) я бы сделал хранение данных (дубль) в таком виде, чтобы это занимало до нескольких секунд.
И использовал регламентное задание, чтобы синхронизировать (догрузить) данные в "копию".
22. AnryMc 849 10.11.21 09:49 Сейчас в теме
(21)
Эта задача (с использованием данной ВПФ) решается крайне редко и нерегулярно...

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

З.Ы. Можно переписать полностью весь отчет для выполнения его в фоне, но т.к. он (как писалось выше) редко используется, и появился данный вопрос:
МОЖНО ЛИ ЗАПУСТИТЬ ВПФ ФОНОВО????
Из подключаемой (для ВПФ "стандартной" команды) "ПЕЧАТЬ"...
23. papami 56 10.11.21 10:07 Сейчас в теме +20 $m
24. AnryMc 849 10.11.21 11:18 Сейчас в теме
(23)
Можно


Спасибо!

Очень информативно...
25. papami 56 10.11.21 12:38 Сейчас в теме
(24) Так еще не получилось что-ли?
26. AnryMc 849 10.11.21 12:49 Сейчас в теме
(25)
не получилось что-ли?


Пока и не брался т.к. пока не представляю как, да и в этой теме пока не увидел как...
27. Sashares 35 10.11.21 13:11 Сейчас в теме
(26)Если в конфигурации есть подсистема БСП Варианты отчетов, то как вариант - можно предложить переделать ВПФ на отчет.
Отчет по умолчанию умеет формироваться в фоновом режиме.
В отчете сделать СКД с внешним набором данных, добавить параметр для указания ссылок.
А далее в модуле объекта в ПриКомпоновкеРезультата формировать печатную форму стандартным образом, не используя СКД, параметры получать из настроек компоновки.
30. AnryMc 849 10.11.21 13:35 Сейчас в теме
(27)
Я об этом думал в самом начале, но не хочу переписывать всё...
33. papami 56 10.11.21 16:49 Сейчас в теме +1 $m
(30) Вот "Рыба".
Возвращается табличный документ.
Я его просто показываю. При желании можете вывести в окно печати как другие печатные формы.
Прикрепленные файлы:
ВПФ_Фоном.epf
34. AnryMc 849 10.11.21 16:53 Сейчас в теме
(33)
Спасибо!
Пока 1$m.

Посмотрю, отправлю остальное...
38. triviumfan 94 10.11.21 18:02 Сейчас в теме +1 $m
(33) Можно ссылку на обработку получать из параметров, а не искать :)
Параметры.ДополнительнаяОбработкаСсылка;
AnryMc; papami; +2 Ответить
39. papami 56 10.11.21 18:05 Сейчас в теме
(38)

Поправил
Прикрепленные файлы:
ВПФ_Фоном.epf
40. AnryMc 849 10.11.21 18:21 Сейчас в теме
(38)
Параметры.ДополнительнаяОбработкаСсылка;


papami отдал 1$m
28. Sashares 35 10.11.21 13:13 Сейчас в теме
(18)Вы так и не показали замер производительности.
Возможно, что дальше в коде есть проблемные места.
32. AnryMc 849 10.11.21 13:49 Сейчас в теме
(28)

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

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

Подзадача за которую вы не взялись - оптимизировать обработку журнала регистрации
17. Sashares 35 09.11.21 18:27 Сейчас в теме
(15)Если вам интересна оптимизация формы - сделайте замер производительности, выделите места, которые долго выполняются, выложите замер и код.
Тогда вполне возможно, что что-то получится улучшить.
19. AnryMc 849 09.11.21 18:30 Сейчас в теме
20. Sashares 35 09.11.21 18:32 Сейчас в теме
(19) Замер производительности покажите еще пожалуйста.
9. herfis 505 04.11.21 17:33 Сейчас в теме
(1) Глянь сюда: https://infostart.ru/public/274721/ (я когда-то давно рисовал) или в похожую - их достаточно. Может, поможет.
ЗЫ. Хотя нет, сюда не смотри :) Если тебе без своего прогресс-бара, то поищи другой пример. Там все гораздо проще делается. Вот что-то из этой серии: https://infostart.ru/1c/articles/1352398/
10. AnryMc 849 04.11.21 17:50 Сейчас в теме
(9)
Вот что-то из этой серии: https://infostart.ru/1c/articles/1352398/


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

З.Ы, Цеплять к внешней обработке общий модуль - "не комильфо"...
12. herfis 505 05.11.21 12:39 Сейчас в теме
(10)
З.Ы, Цеплять к внешней обработке общий модуль - "не комильфо"...

Без общего модуля не обойтись никак.
Ибо изначально в фоне можно выполнить только экспортную процедуру общего модуля. А все остальное - это фокусы с Выполнить() через такую процедуру.
41. triviumfan 94 10.11.21 18:23 Сейчас в теме
(1) А это решение вообще рабочее? Сталкивался с ЖР и часто зависания были, что рейд-диски на 100% загружены были, базы лагали, юзеры жаловались - и это стоило только обратиться к ЖР за большой период или со специфическими отборами. Журнал вроде lgd был.
наверное, поэтому мы используем внешний ЖР.
Полагаю, этой "печатной форме" категорически не рекомендуется запуск при параллельной работе/в разных сеансах.
42. AnryMc 849 10.11.21 18:25 Сейчас в теме
(41)

Ну без фона запусков ВПН было больше 100
Зависаний не наблюдал...

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

З.Ы.Ы. Посмотрел у меня журнал: .lgp
43. triviumfan 94 10.11.21 19:58 Сейчас в теме
(42) Очень странно, почему нет лагов) Наверняка они есть, просто все молчат)
44. AnryMc 849 11.11.21 09:31 Сейчас в теме
(43)
Наверняка они есть, просто все молчат)


Ну пару десятков запусков я наблюдал...
"Полёт норамальный"...
4. starik-2005 3051 04.11.21 14:14 Сейчас в теме
Лично я бы просто вызвал модуль управления печатью через длительную операцию и передал бы туда достаточное количество параметров.
5. AnryMc 849 04.11.21 14:26 Сейчас в теме
(4)
Можно немного "разжевать"?

З.Ы. У меня вроде в этой ситуации нет клиентского контекста...
7. starik-2005 3051 04.11.21 14:35 Сейчас в теме
(5) а зачем нужен клиентский контекст? Печать обычно берет данные из базы, а не из формы. Особеннт ВПФ.
8. AnryMc 849 04.11.21 14:44 Сейчас в теме
(7) Я с длительными операциями ещё не сталкивался - может что и представляю неправильно...
А доступа к документации нет ;-(
ИТС: Длительные операции на сервере
11. ishelper 05.11.21 00:04 Сейчас в теме
(8)
А доступа к документации нет ;-(
ИТС: Длительные операции на сервере
ИТС - это не документация? Или как раз к этой статье доступа и нет?
29. vadim1011985 101 10.11.21 13:24 Сейчас в теме +1 $m
Фоновое выполнение длительных операций
Для того чтобы длительные операции дополнительного объекта запускались в фоновом режиме, необходимо запустить выполнение команды в фоновом задании и после его завершения принять результат.

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

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

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

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

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

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

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

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

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

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

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

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


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

&НаКлиенте

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

   

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

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

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

    Иначе

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

    КонецЕсли;

   

КонецПроцедуры
Показать

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

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

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

З.Ы. Вы меня почти убедили что решить "без привязки" к форме у пользователя нельзя, ещё правда есть форма из которой "вызывается" ВПФ, но можно ли на сервере в команде ВПФ "поймать" форму владелец и привязать к ней обработчик ожидания я пока не представляю как...
З.Ы.Ы. Вторая проблема - использование общего модуля, т.е. должен существовать "общий функционал" который выполнит фоново обработку из ВПФ.
Есть БСП, но как "привязать" ВПФ я пока не представляю...
35. AnryMc 849 10.11.21 17:00 Сейчас в теме
(33)
Пришлось отключить "безопасный режим", т.к.
Установлен безопасный режим. Выполнение операции запрещено
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(98)}: ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(131)}: ИмяОбработки = ПодключитьВнешнююОбработку(Ссылка);
{ОбщийМодуль.ДлительныеОперации.Модуль(625)}: Обработка = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки").ОбъектВнешнейОбработки(Ссылка);
{(1)}:ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры[0],Параметры[1])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4892)}: Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{ОбщийМодуль.ДлительныеОперации.Модуль(719)}: ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыПроцедуры);
{ОбщийМодуль.ДлительныеОперации.Модуль(710)}: ВыполнитьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);

по причине:
Ошибка подключения внешних метаданных
по причине:
Установлен безопасный режим. Выполнение операции запрещено
Показать
37. papami 56 10.11.21 17:16 Сейчас в теме
(35) Возможно, я на зарплате пробовал
36. soft_wind 10.11.21 17:16 Сейчас в теме
(18) если в базе есть какая-то БСП, то внешние обработки/отчеты, можно запускать в фоновом режиме
если БСП нет, то необходимо доработать какой либо общий модуль - без этого ни как

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

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

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

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