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

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

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

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

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


З.Ы. Конкретнее - Можно ли это организовать без формы, без общего модуля.
А из модуля объекта ВПФ
З.Ы.Ы. Наличие прогресс-бара - приветствуется...
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. djvu 142 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 846 04.11.21 13:56 Сейчас в теме
(2)
Для печати нужен интерактивный вход пользователя


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

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

Ок.

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


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


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


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

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

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

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

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


Спасибо!

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


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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

&НаКлиенте

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

   

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

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

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

    Иначе

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

    КонецЕсли;

   

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

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

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

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

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

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

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

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

(пока писал ответ,, в принципе уже все и насоветовали)
Оставьте свое сообщение
Вакансии
Аналитик 1C
Москва
зарплата от 200 000 руб. до 240 000 руб.
Полный день

Ведущий аналитик группы поддержки 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Аналитик группы поддержки 1С
Москва
зарплата от 160 000 руб. до 250 000 руб.
Полный день

Аналитик
Москва
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб.
Полный день