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

24.08.19

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

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

Файлы

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

Наименование Скачано Купить файл
ДемоДлительнаяОперация
.epf 10,96Kb
113 2 150 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

 

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

 

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

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

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

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

	...	

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

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

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

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

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

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

 

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

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3388    Abysswalker    8    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6303    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    48594    dimanich70    83    

169

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    7283    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    60732    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9068    ke.92@mail.ru    17    

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

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

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

(Этот принцип действует и для наречия «неграмотно»).
yuriye; user651117_denis1; hottion; +3 Ответить
7. BenGunn 261 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 1 Ответить
10. BenGunn 261 27.08.19 08:25 Сейчас в теме
(9)

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

Кстати, где ты здесь видишь форум? Здесь специалисты делятся знаниями, а не ищут орфографические ошибки. Теми самыми знаниями, кстати, которые кто-нибудь использует в той самой работе, за которую деньги платят. А судя по тому, что пишешь в коментах, тебе еще очень далеко до такого уровня... Поищи развлекуху где-нибудь на Фейсбуке, там таких как ты любят
Andy_Kanevsky; hottion; uralkit@uralkit.ru; jONES1979; +4 Ответить
11. jONES1979 27.08.19 08:55 Сейчас в теме
(10)
- К чему эти ярлыки? Не опускайтесь до моего уровня!
- Форум написано вверху.
- Я не искал ошибок, они сами бросаются в глаза и сбивают восприятие.
- За знания я никогда не устану говорить спасибо! Спасибо!
Прикрепленные файлы:
mrChOP93; +1 Ответить
26. alul 24.11.21 10:19 Сейчас в теме
(3) обожаю здесь лингвистов ошибившихся с форумом по русскому языку...
Вам дают бесплатно технологию, так они как "затычка в бочке" полезли набивать себе цену как "затычке" вместо того чтоб сказать "спасибо"
hottion; kMidas; +2 Ответить
25. user1619033 16.11.21 05:33 Сейчас в теме
(1) Учитывая то что во всём 1с все разработчики не грамотные и не знают о существовании буквы Ё, все остальные буквы в 1С можно так же писать какие вздумается. Тотальная безграмотность приветствуется компанией 1С. :(
ivprovotorov; +1 Ответить
6. PerlAmutor 161 26.08.19 21:23 Сейчас в теме
Спасибо. Довольно интересные трюки.
baranchikov; +1 Ответить
8. BenGunn 261 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 261 16.11.19 17:12 Сейчас в теме
(13) Уточни, пожалуйста, что имелось в виду по п.2
17. fomix 33 18.11.19 19:06 Сейчас в теме
(14) При попытке выполнить скрипт, 1с-ка стандартно спрашивает "...пытается выполнить вызов команды WScript.Shell. Подтверждаете? Да/Нет". Отвечаешь Да и по-новой вываливается этот диалог и так до посинения. Ну тебе это нужно было для "тормоза", поэтому в реальной жизни вряд ли кому-то пригодится. Так что, не заморачивайся!
18. BenGunn 261 19.11.19 09:18 Сейчас в теме
(17) Точно! Фоновое задание при таком подходе запускается от имени DefUser, соответственно, COM объекты создаются только в безопасном профиле.... Ёкрныйбабай! Сам на этом споткнулся! Есть предложения по решению вопроса? (Ну, кроме того, что включать процедуру фонового задания в конфу)?
15. BenGunn 261 16.11.19 17:14 Сейчас в теме
(13) По п.1, тестировалось на 8.3.13.1513. Что на более ранних релизах, сказать не могу. На поздних работает
16. fomix 33 18.11.19 19:02 Сейчас в теме
(15) Платформа тут не при чем! В последнем релизе БП 3.0 (и скорее всего и в других конфигурациях тоже!) изменился вызов команды "НачатьПомещениеФайлов"
19. BenGunn 261 19.11.19 09:21 Сейчас в теме
(16) Ничё не понял... При чем тут вообще БП?

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

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

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

по причине:
Каталог не обнаружен 'e1cib\tempstorage\b18a373a-53fc-4ea8-96b0-b3a6f299ffe4'. 3(0x00000003): Системе не удается найти указанный путь.
21. Turbokey 53 17.07.20 08:25 Сейчас в теме
Код немного разочаровал. Хотелось увидеть пример реализации отображения хода длительного процесса, а не простое окно ожидания. Публикация https://infostart.ru/public/1207439/ более поучительна.
22. BenGunn 261 18.07.20 19:13 Сейчас в теме
Цель публикации - демонстрация запуска фонового задания из внешней обработки. А вопрос отображения хода выполнения - уровень знания БСП разработчиком; для этого и без меня создано предостаточно демок и написано описаний
ArchAhper; alul; andew; +3 Ответить
23. Al777 12.11.21 12:22 Сейчас в теме
Здесь описан метод запуска фонового задания во внешней обработке (через Файл - Открыть), который действительно работает. Почему-то в других публикациях на инфостарте описаны нерабочие методы. Спасибо за публикацию. Всё замечательно работает.
DimaTyumenskiy; +1 Ответить
24. burgomister 61 14.11.21 19:33 Сейчас в теме
Подтверждаю. Работает на последних версиях платформы и конфигурациях БП, ЗУП и УТ.
27. triviumfan 102 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 91 29.01.24 14:10 Сейчас в теме
Та же проблема
(31)
НачатьПомещениеФайлов
35. dakork 38 07.02.24 16:01 Сейчас в теме
(31)
(32)
(34)
а вообще я прошелся по нескольким статьям Инфостарта и сделал для себя работающее решение (может сэкономит кому-нибудь время):

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

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


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

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

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

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

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

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

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

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

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


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

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

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


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


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


Естественно, что часть кода немного сократил/изменил, чтобы не нагружать, но основная суть тут должна быть понятна.
shard; Dmitri93; +2 Ответить
37. junikDEV 14.05.25 20:05 Сейчас в теме
(35) Добрый вечер, подскажите пожалуйста, пытаюсь воспользоваться вашим кодом на серверной базе без добавления в доп.отчеты и обработки. Такая задача стоит - есть массив с массивами в обходе "для каждого из" передается массив в фоновое задание с ссылками на объекты с их последующим удалением(процедура модуля обработки), но почему-то не отрабатывает, фоновые задания создаются, в результат приходит "Выполнено", но объекты почему-то не удаляются принудительно, по общему модулю отладчиком пробежался, каких-то непоняток нет, может параметры выполнения для процедуры модуля не там лежат?
Прикрепленные файлы:
34. dakork 38 07.02.24 15:18 Сейчас в теме
36. elian 149 25.01.25 19:40 Сейчас в теме
А где передача адреса результата и извлечение результата из этого адреса?
Это же самое главное!
Для отправки сообщения требуется регистрация/авторизация