Запуск фонового задания во внешней обработке. Отключение предупреждений защиты от опасных действий в фоновом задании

24.08.19

Разработка - Универсальные функции

Как запустить фоновое задание из модуля внешней обработки используя БСП. Как отключить безопасный режим и сообщения защиты от опасных действий независимо от профиля безопасности пользователя в фоновом задании во внешней обработке.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ДемоДлительнаяОперация
.epf 10,96Kb
98
98 Скачать (2 SM) Купить за 2 150 руб.

1. Как запустить фоновое задание из модуля внешней обработки используя БСП

 

После тщетных попыток запустить в фоне процедуру модуля объекта внешней обработки, я все-таки решил глубже копнуть все механизмы длительных операций БСП. Все процедуры выполнения кода в фоне из подсистемы "Длительные операции" работают на сервере. То есть все происходит так: берется внешняя обработка, хранящаяся в справочнике "ДополнительныеОтчетыИОбработки", разворачивается на сервере (вот тут ключевой момент) и из этого экземпляра обработки выполняются указанные процедуры / функции модуля объекта (см. процедуру "ЗапуститьФоновоеЗаданиеСКонтекстомКлиента" модуля "ДлительныеОперации" БСП 3.х). Если вы вызываете ту же самую обработку из "файл-открыть", то БСП тупо пытается запустить указанные методы из обработки на сервере, в то время как обработка находится на клиенте.

 

Выходом было создать копию внешней обработки на сервере и запустить процедуру ее (копии) модуля объекта в фоне. Для этого, при открытии формы я помещал обработку во временное хранилище и тут же создавал копию на сервере в временном файле. Имя файла на сервере хранил в реквизите формы.

&НаКлиенте
Процедура ПриОткрытии(Отказ)

    Если ЭтоВнешняяОбработка() Тогда
        ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайлаОбработки", ЭтотОбъект);
        НачатьПомещениеФайлов(ОписаниеОповещения, ИмяФайлаОбработки(), Ложь, УникальныйИдентификатор);
    КонецЕсли;

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

&НаКлиенте
Процедура ОбработатьРезультатПомещенияФайлаОбработки(ПомещенныеФайлы, ОбработчикЗавершения) Экспорт

	Если ПомещенныеФайлы <> Неопределено Тогда
		// Создаем копию текущией обработки на сервере
		ХранениеФайлаОбработки = КопияОбработкиНаСервере(ПомещенныеФайлы[0].Хранение);
	КонецЕсли;

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

&НаСервере
Функция КопияОбработкиНаСервере(Хранение)

	Результат = ПолучитьИмяВременногоФайла();
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Хранение);
	ДвоичныеДанные.Записать(Результат);
	
	Возврат Результат;

КонецФункции
	
&НаСервере
Функция ИмяФайлаОбработки()

	Возврат РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
	
КонецФункции

&НаСервере
Функция ЭтоВнешняяОбработка()
	
	ЧастиИмени = СтрРазделить(РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя(), ".");
	Возврат (ВРег(ЧастиИмени[0]) = "ВНЕШНЯЯОБРАБОТКА")
	
КонецФункции

Ну вот, собственно и все. Осталось только правильно вызвать процедуру из модуля объекта копии обработки на сервере.

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


&НаСервере
Функция НачатьВыполнениеФоновогоЗаданияНаСервере()
	
	ПараметрыВыполненияОбработки = Новый Структура;
	// Здесь указываете параметры, передаваемые в процедуру, выполняемую в фоне
	// ....
	// ...

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

 

2. Как отключить безопасный режим и сообщения защиты от опасных действий независимо от профиля безопасности пользователя в фоновом задании во внешней обработке

 

Ниже приведенный способ, используемый мной, не является идеальным, но прекрасно работает и используется мной уже не один год.

Я думаю, что многим приходилось сталкиваться с тем, что на сервере надо было подтвердить разрешение на запуск com-соединения. И все выключали защиту от опасных действий в профиле пользователя, чего делать не рекомендуется. Я пошел другим путем. Создаю две экспортные процедуры в модуле объекта внешней обработки: одна - непосредственно функция, которая будет выполнять необходимые действия и другая, которая вызовет первую с отключенным контролем прав доступа профиля.

Выглядит это так:

Функция ОбработкаДанных(...) Экспорт

	...	

КонецФункции

Процедура ОбработкаДанныхВФоне(Параметры, АдресРезультата) Экспорт

	ЧастиИмени = СтрРазделить(ЭтотОбъект.Метаданные().ПолноеИмя(), ".");
	ЭтоВнешняяОбработка = (ВРег(ЧастиИмени[0]) = "ВНЕШНЯЯОБРАБОТКА");
	Если ЭтоВнешняяОбработка Тогда 
		ОбработкаОбъект = ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла, Ложь, ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
		Результат = ОбработкаОбъект.ОбработкаДанных(...);
	Иначе
		Результат = ОбработкаДанных(...);
	КонецЕсли;

	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры

То есть, я создал еще один экземпляр самой себя без контроля прав (не в безопасном режиме и с отключением предупреждений защиты от опасных действий).

Пример использования, созданный из обработки демонстрационной конфигурации БСП прилагается (создавалась на платформе 8.3.13.1513, совместима с любой платформой 8.3, которая поддерживает БСП 3.0 и старше)

 

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

 

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20124    dimanich70    81    

144

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4091    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18059    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    5502    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14730    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. jONES1979 26.08.19 09:17 Сейчас в теме
"капнуть" -> "копнуть"
VladC#; maksa2005; CITRUM; anna110297; Dmitri93; +5 Ответить
2. BenGunn 253 26.08.19 11:53 Сейчас в теме
(1) Это так важно? Ну не грамотный!
uralkit@uralkit.ru; alul; IVC_goal; user651117_denis1; Dream_kz; jONES1979; +6 7 Ответить
3. jONES1979 26.08.19 15:21 Сейчас в теме
(2) "не грамотный" -> "неграмотный"
Но теперь-то грамотный! А грамотность - это первое впечатление! И отсутствие подсознательного раздражения от читаемого текста.
...
Я забыл что оказывается здесь нельзя почистить комменты. Ну тогда сорри, в другой раз в личку напишу)
ivprovotorov; CITRUM; Cthulhu; Dmitri93; HEKPOH; kuzyara; +6 1 Ответить
4. BenGunn 253 26.08.19 16:04 Сейчас в теме
(3) Мне гораздо больше нравится мысль, что подобное еще никто не делал (если даже и сделал, то не говорит об этом).
user1270109; romankoav; jONES1979; +3 Ответить
5. BenGunn 253 26.08.19 16:10 Сейчас в теме
(3)
«Неграмотный» или «не грамотный»: слитно или раздельно?
Если коротко, то пишется слитно, когда утверждается безграмотность, и пишется раздельно, когда отрицается грамотность.

Он неграмотный. (Утверждается безграмотность).

Он не грамотный. (Отрицается грамотность).

(Этот принцип действует и для наречия «неграмотно»).
yuriye; user651117_denis1; hottion; +3 Ответить
7. BenGunn 253 27.08.19 00:39 Сейчас в теме
(3) Да ну, нафиг! Посмотрел твой профиль... Да ты, оказывается, флудер! Сказать только ради того, чтобы сказать?! Отличная позиция! А не хочешь сделать что-нибудь полезное? Ну, кроме того, что раздувать щеки с умным видом?!
uralkit@uralkit.ru; Casey1984; kovgard; user651117_denis1; Summer_13; mai_k; jONES1979; +7 2 Ответить
9. jONES1979 27.08.19 06:23 Сейчас в теме
(7) Зачем переходить на личности, вам скучно? За полезное на работе деньги платят, а не звёздочки в интернете. Форум - это по определению место для общения, что позволяет отвлечься. Кого первого-то на флудеразм пробило? Поправили бы свою опечатку и копали дальше,.. а не капали.

За статью спасибо, кстати. С моей помощью теперь она чуть ли не идеальна))
VladC#; Dmitri93; +2 Ответить
10. BenGunn 253 27.08.19 08:25 Сейчас в теме
(9)

Ну я говорю, флудер!

Кстати, где ты здесь видишь форум? Здесь специалисты делятся знаниями, а не ищут орфографические ошибки. Теми самыми знаниями, кстати, которые кто-нибудь использует в той самой работе, за которую деньги платят. А судя по тому, что пишешь в коментах, тебе еще очень далеко до такого уровня... Поищи развлекуху где-нибудь на Фейсбуке, там таких как ты любят
uralkit@uralkit.ru; jONES1979; +2 Ответить
11. jONES1979 27.08.19 08:55 Сейчас в теме
(10)
- К чему эти ярлыки? Не опускайтесь до моего уровня!
- Форум написано вверху.
- Я не искал ошибок, они сами бросаются в глаза и сбивают восприятие.
- За знания я никогда не устану говорить спасибо! Спасибо!
Прикрепленные файлы:
mrChOP93; +1 Ответить
26. alul 24.11.21 10:19 Сейчас в теме
(3) обожаю здесь лингвистов ошибившихся с форумом по русскому языку...
Вам дают бесплатно технологию, так они как "затычка в бочке" полезли набивать себе цену как "затычке" вместо того чтоб сказать "спасибо"
25. user1619033 16.11.21 05:33 Сейчас в теме
(1) Учитывая то что во всём 1с все разработчики не грамотные и не знают о существовании буквы Ё, все остальные буквы в 1С можно так же писать какие вздумается. Тотальная безграмотность приветствуется компанией 1С. :(
ivprovotorov; +1 Ответить
6. PerlAmutor 155 26.08.19 21:23 Сейчас в теме
Спасибо. Довольно интересные трюки.
8. BenGunn 253 27.08.19 00:49 Сейчас в теме
12. Oldsad 27.08.19 10:41 Сейчас в теме
13. fomix 33 15.11.19 11:08 Сейчас в теме
1. Изменились параметры процедуры "НачатьПомещениеФайлов", поэтому код процедуры "ПриОткрытии" будет таким (по крайней мере для 1С:Предприятие 8.3 (8.3.12.1685), БП 3.0):

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

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


2. Выполнения скрипта из COMОбъект("WScript.Shell") требует особых прав и без подтверждения такого действия на сервере не работает! Соответственно, ваша обработка не отрабатывает и каждый раз вываливается запрос на подтверждение((( Можно просто поставить вместо этого цикл.
14. BenGunn 253 16.11.19 17:12 Сейчас в теме
(13) Уточни, пожалуйста, что имелось в виду по п.2
17. fomix 33 18.11.19 19:06 Сейчас в теме
(14) При попытке выполнить скрипт, 1с-ка стандартно спрашивает "...пытается выполнить вызов команды WScript.Shell. Подтверждаете? Да/Нет". Отвечаешь Да и по-новой вываливается этот диалог и так до посинения. Ну тебе это нужно было для "тормоза", поэтому в реальной жизни вряд ли кому-то пригодится. Так что, не заморачивайся!
18. BenGunn 253 19.11.19 09:18 Сейчас в теме
(17) Точно! Фоновое задание при таком подходе запускается от имени DefUser, соответственно, COM объекты создаются только в безопасном профиле.... Ёкрныйбабай! Сам на этом споткнулся! Есть предложения по решению вопроса? (Ну, кроме того, что включать процедуру фонового задания в конфу)?
15. BenGunn 253 16.11.19 17:14 Сейчас в теме
(13) По п.1, тестировалось на 8.3.13.1513. Что на более ранних релизах, сказать не могу. На поздних работает
16. fomix 33 18.11.19 19:02 Сейчас в теме
(15) Платформа тут не при чем! В последнем релизе БП 3.0 (и скорее всего и в других конфигурациях тоже!) изменился вызов команды "НачатьПомещениеФайлов"
19. BenGunn 253 19.11.19 09:21 Сейчас в теме
(16) Ничё не понял... При чем тут вообще БП?

Глобальный контекст (Global context)
НачатьПомещениеФайлов (BeginPuttingFiles)
Синтаксис:
НачатьПомещениеФайлов(<ОписаниеОповещенияОЗавершении>, <ПомещаемыеФайлы>, <Интерактивно>, <УникальныйИдентификаторФормы>, <ОписаниеОповещенияПередНачаломПомещенияФайлов>)
20. fomix 33 21.11.19 14:47 Сейчас в теме
(19) Насчет БП точно - я не прав! Платформа 8.3.15.1700:
Все верно про синтаксис:
НачатьПомещениеФайлов(<ОписаниеОповещенияОЗавершении>, <ПомещаемыеФайлы>, <Интерактивно>, <УникальныйИдентификаторФормы>, <ОписаниеОповещенияПередНачаломПомещенияФайлов>)

Но у вас параметр: <ПомещаемыеФайлы> = РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла (тип строка). Так не работает!
А вот как я написал:
ОписаниеФайлаВО = Новый ОписаниеПередаваемогоФайла(ИмяФайлаОбработки());
ПомещаемыеФайлы = Новый Массив;
ПомещаемыеФайлы.Добавить(ОписаниеФайлаВО)

работает..
33. dakork 36 05.02.24 12:05 Сейчас в теме
(20)Ошибка при вызове метода контекста (НачатьПомещениеФайлов)
{ВнешняяОбработка.Сверка.Форма.Форма.Форма(1519)}:НачатьПомещениеФайлов(ОписаниеОповещения, ПомещаемыеФайлы,, Ложь, УникальныйИдентификатор);
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(390)}:ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыОбработки, Форма);
{Справочник.ДополнительныеОтчетыИОбработки.Форма.ФормаЭлемента.Форма(968)}:ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, ЭтотОбъект, ВыполняемаяКоманда.ОбъектыНазначения);
{Справочник.ДополнительныеОтчетыИОбработки.Форма.ФормаЭлемента.Форма(476)}:ВыполнитьОбработкуОповещения(Обработчик, "ПродолжитьБезЗаписи");

по причине:
Каталог не обнаружен 'e1cib\tempstorage\b18a373a-53fc-4ea8-96b0-b3a6f299ffe4'. 3(0x00000003): Системе не удается найти указанный путь.
21. Turbokey 52 17.07.20 08:25 Сейчас в теме
Код немного разочаровал. Хотелось увидеть пример реализации отображения хода длительного процесса, а не простое окно ожидания. Публикация https://infostart.ru/public/1207439/ более поучительна.
22. BenGunn 253 18.07.20 19:13 Сейчас в теме
Цель публикации - демонстрация запуска фонового задания из внешней обработки. А вопрос отображения хода выполнения - уровень знания БСП разработчиком; для этого и без меня создано предостаточно демок и написано описаний
ArchAhper; alul; andew; +3 Ответить
23. Al777 12.11.21 12:22 Сейчас в теме
Здесь описан метод запуска фонового задания во внешней обработке (через Файл - Открыть), который действительно работает. Почему-то в других публикациях на инфостарте описаны нерабочие методы. Спасибо за публикацию. Всё замечательно работает.
24. burgomister 59 14.11.21 19:33 Сейчас в теме
Подтверждаю. Работает на последних версиях платформы и конфигурациях БП, ЗУП и УТ.
27. triviumfan 97 18.08.22 14:39 Сейчас в теме
Слишком мудрёно. Почему не используется ДлительныеОперации.ПрочитатьПрогресс() - не понятно, хотя в тоже время использует ДлительныеОперации.СообщитьПрогресс().
Также не понятно накой черт WS использовать.
Но как ни странно, но вроде как это единственная рабочая версия на этом ресурсе. Я в шоке =\
28. ВасяЧ 02.03.23 08:48 Сейчас в теме
От души благодарю за отличную статью! Счастья и здоровья, добрый человек!
29. Astarot 6 03.03.23 15:13 Сейчас в теме
Спасибо, удобно. Раньше подключал обработку с вызовом серверного метода. А тут удобно можно на форме заполнять свои параметры и с ними запускать обработку
30. Va_dim 20.06.23 11:25 Сейчас в теме
По первому пункту - на больших объемах данных, при запуске нескольких фоновых заданий параллельно, будет вываливаться ошибка: "Файл не обнаружен...". Видимо, потому что сервер удаляет помещенную обработку из кэша примерно через +-20 мин.
31. ElenkaLisenka 25 11.01.24 17:15 Сейчас в теме
Здравствуйте, спасибо за обработку, воспользовалась процедурами, чтоб во внешней обработке потестировать фоновое задание, а теперь решила внешнюю обработку подключить к базе, при открытии выдается ошибка:

Ошибка при вызове метода контекста (НачатьПомещениеФайлов)
{ВнешняяОбработка.ЗагрузкаДанных.Форма.Форма.Форма(30)}: НачатьПомещениеФайлов(ОписаниеОповещения, ИмяФайлаОбработки(), Ложь, УникальныйИдентификатор);
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(391)}: ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыОбработки, Форма);
{Справочник.ДополнительныеОтчетыИОбработки.Форма.ФормаЭлемента.Форма(1030)}: ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, ЭтотОбъект, ВыполняемаяКоманда.ОбъектыНазначения);
{Справочник.ДополнительныеОтчетыИОбработки.Форма.ФормаЭлемента.Форма(528)}: ВыполнитьОбработкуОповещения(Обработчик, "ПродолжитьБезЗаписи");
по причине:
В неинтерактивном режиме требуется указать путь к файлу-источнику.

Подскажите, пожалуйста, что нужно дописать, чтоб и ваш код оставить, для возможности тестирования в будущем и чтоб она работала будучи подключенной в базу.
32. olenaNT 90 29.01.24 14:10 Сейчас в теме
Та же проблема
(31)
НачатьПомещениеФайлов
35. dakork 36 07.02.24 16:01 Сейчас в теме
(31)
(32)
(34)
а вообще я прошелся по нескольким статьям Инфостарта и сделал для себя работающее решение (может сэкономит кому-нибудь время):

На форме добавил реквизит ОбъектСсылка с типом "СправочникСсылка.ДополнительныеОтчетыИОбработки"

При создании формы присваиваю значение Ссылки, если обработка подключена к подсистеме доп. обработок:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ИмяФайла = РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
	
	Если НЕ СтрНайти(ИмяФайла, ".epf") Тогда //обработка подключена
	   ОбъектСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Сверка");
	КонецЕсли;
КонецПроцедуры
Показать


При открытии, если это не подключенный вариант обработки, то помещаю копию обработки на сервер

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

&НаСервере
Функция ИмяФайлаОбработки()
	
	ИмяФайла = РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
	Возврат ИмяФайла;
	
КонецФункции

&НаКлиенте
Процедура ОбработатьРезультатПомещенияФайлаОбработки(ПомещенныеФайлы, ОбработчикЗавершения) Экспорт

	Если ПомещенныеФайлы <> Неопределено Тогда
		// Создаем копию текущией обработки на сервере
		ХранениеФайлаОбработки = КопияОбработкиНаСервере(ПомещенныеФайлы[0].Хранение);
	КонецЕсли;

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

&НаСервере
Функция КопияОбработкиНаСервере(Хранение)

	Результат = ПолучитьИмяВременногоФайла();
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Хранение);
	ДвоичныеДанные.Записать(Результат);
	
	Возврат Результат;

КонецФункции
Показать


в функцию на клиенте передаю свои доп. параметры "ПараметрыЗапуска" и обрабатываю результат

&НаКлиенте
Функция НапечататьНаКлиенте()
	ПараметрыЗапуска = Новый Структура;
	//...заполняю эти параметры нужными данными
	//...выполняю фоновое задание	
	НачатьВыполнениеФоновогоЗадания(ПараметрыЗапуска);
КонецФункции

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


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


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


Естественно, что часть кода немного сократил/изменил, чтобы не нагружать, но основная суть тут должна быть понятна.
Dmitri93; +1 Ответить
34. dakork 36 07.02.24 15:18 Сейчас в теме
Оставьте свое сообщение