Задача в общем-то такая:
Есть обработка, процедуру которой лучше бы запускать в фоне. Обработка может быть внешней или частью конфигурации (по условию работать должно так и так). Относительно внешнего варианта - вопросов нет, а вот если, допустим, ее встроили в конфигурацию возникает проблема. Запустить ее из самой обработки я не могу, потому что
дает ошибку "Метод задания не найден" (ну чего уж там, общего модуля действительно нет). Через БСП в любых видах, что я пытался передавать сие замысловатое название процедуры она неизбежно проходит через "ОбщегоНазначения.ВыполнитьБезопасно", где благополучно отсекается при проверке корректности имени процедуры и именно из-за куска "Создать()", который порождает 4 фрагмента имени, а не 2 или 3 считающихся допустимыми.
Понятно, что можно взять любой подходящий модуль и написать в нем свою запускающую процедуру (коль уж мы меняем конфигурацию), можно создать модуль специально, но все-таки неужели такая мелочь стоит таких усилий. Хочется так чтобы вставил - и работает, удалил из конфигурации - и забыл, без дополнительных движений.
Вот за этим и пишу. Может есть все-таки что-то в БСП о чем я не знаю или еще какой изврат, чтобы запустить в фоне экспортную процедуру обработки из нее самой, не дописывая больше ничего хотя бы в стандартных конфигурациях?
Есть обработка, процедуру которой лучше бы запускать в фоне. Обработка может быть внешней или частью конфигурации (по условию работать должно так и так). Относительно внешнего варианта - вопросов нет, а вот если, допустим, ее встроили в конфигурацию возникает проблема. Запустить ее из самой обработки я не могу, потому что
ФоновыеЗадания("Обработки.МояОбработка.Создать().МойМетод", Параметры, Идентификатор, "Мое фоновое задание")
Понятно, что можно взять любой подходящий модуль и написать в нем свою запускающую процедуру (коль уж мы меняем конфигурацию), можно создать модуль специально, но все-таки неужели такая мелочь стоит таких усилий. Хочется так чтобы вставил - и работает, удалил из конфигурации - и забыл, без дополнительных движений.
Вот за этим и пишу. Может есть все-таки что-то в БСП о чем я не знаю или еще какой изврат, чтобы запустить в фоне экспортную процедуру обработки из нее самой, не дописывая больше ничего хотя бы в стандартных конфигурациях?
По теме из базы знаний
- Запуск фонового задания во внешней обработке. Отключение предупреждений защиты от опасных действий в фоновом задании
- Запуск фонового задания во внешней обработке без регистрации в справочнике "Дополнительные отчеты и обработки"
- Шаблон внешней обработки на основе БСП с фоновым выполнением модуля обработки и выводом индикации фонового задания
- Ускорение многоразового обращения к серверной процедуре/функции с помощью многопоточного вызова фоновых заданий
- Эффективное управление фоновыми заданиями и коммуникация сеансов сервера с Фоном с помощью Структуры обмена (ноу-хау) + Бонус: Альтернативный вариант через Хранилище настроек
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) dusha0020, есть способы.
Я знаю как минимум 2, и оба применял.
1-ый ДополнительныеОтчетыИОбработки.ВыполнитьКоманду
2-ой ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки
все что нужно, передаешь параметрами. Покопайся в процедурах, разберись как они работают, и приведи свою обработку в соответствие, чтобы все это запускалось
Я знаю как минимум 2, и оба применял.
1-ый ДополнительныеОтчетыИОбработки.ВыполнитьКоманду
2-ой ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки
все что нужно, передаешь параметрами. Покопайся в процедурах, разберись как они работают, и приведи свою обработку в соответствие, чтобы все это запускалось
(2) Boneman,
1-й способ не могу ничего сказать. У меня в "ДополнительныхОперациях" такой процедуры нет. Подозреваю, что она не слишком универсальна и не во всех стандартных конфигурациях есть.
2-й способ - не прокатит. Требует в параметрах команды "ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Элемент справочника." Что для встроенной в конфигурацию обработки не есть возможно. Но для варианта внешней действительно применимо и работает. Уже сейчас:)
1-й способ не могу ничего сказать. У меня в "ДополнительныхОперациях" такой процедуры нет. Подозреваю, что она не слишком универсальна и не во всех стандартных конфигурациях есть.
2-й способ - не прокатит. Требует в параметрах команды "ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Элемент справочника." Что для встроенной в конфигурацию обработки не есть возможно. Но для варианта внешней действительно применимо и работает. Уже сейчас:)
(7) dusha0020,
а ничего что там много параметров,
в т.ч. есть параметр .ЭтоВнешняяОбработка
и если он в истине, тогда получает обработку по ссылке, в противном случае создает объект по имени.
Все там нормально и грамотно сделано
не прокатит. Требует в параметрах команды "ДополнительнаяОбработкаСсылка
а ничего что там много параметров,
в т.ч. есть параметр .ЭтоВнешняяОбработка
и если он в истине, тогда получает обработку по ссылке, в противном случае создает объект по имени.
Все там нормально и грамотно сделано
(8) Boneman, Вот прямо цитата из модуля:
Ну и это до кучи:
В общем-то и судя по первому способу видно, что БСП у нас разные... А жаль.
// Выполняет команду обработки и возвращает результат ее выполнения.
//
// Параметры:
// ПараметрыКоманды (Структура) Параметры, с которыми выполняется команда.
// |- ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Элемент справочника.
// |- ИдентификаторКоманды (Строка) Имя выполняемой команды.
// |- ОбъектыНазначения (Массив) из (*) Ссылки объектов, для которых выполняется обработка. Обязательный для назначаемых обработок.
// |- РезультатВыполнения (*) Необязательный. Используется для передачи результата работы на клиент.
// АдресРезультата (Строка) Необязательный. Адрес временного хранилища по которому будет размещен результат выполнения.
//
// Возвращаемое значение:
// ПараметрыКоманды.РезультатВыполнения (*) см. ПараметрыКоманды. Если был передан АдресРезультата, то возвращается Неопределено.
//
// Важно:
// Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки"
// должна выполняться вызывающим кодом.
//
Функция ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата = Неопределено) Экспорт
ВнешнийОбъект = ПолучитьОбъектВнешнейОбработки(ПараметрыКоманды.ДополнительнаяОбработкаСсылка);
ИдентификаторКоманды = ПараметрыКоманды.ИдентификаторКоманды;
РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, АдресРезультата);
Возврат РезультатВыполнения;
КонецФункции
ПоказатьНу и это до кучи:
// Создает и возвращает объект внешней обработки (отчета).
//
// Параметры:
// Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Подключаемая обработка.
//
// Возвращаемое значение:
// (ВнешняяОбработкаОбъект.*) Объект подключенной обработки.
// (ВнешнийОтчетОбъект.*) Объект подключенного отчета.
// (Неопределено) Если передана некорректная ссылка.
//
// Важно:
// Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки"
// должна выполняться вызывающим кодом.
//
Функция ПолучитьОбъектВнешнейОбработки(Ссылка) Экспорт
// Подключение
ИмяОбработки = ПодключитьВнешнююОбработку(Ссылка);
// Проверка корректности переданных параметров
Если ИмяОбработки = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// Получение экземпляра объекта
Если Ссылка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
ИЛИ Ссылка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
Менеджер = ВнешниеОтчеты;
Иначе
Менеджер = ВнешниеОбработки;
КонецЕсли;
Возврат Менеджер.Создать(ИмяОбработки);
КонецФункции
ПоказатьВ общем-то и судя по первому способу видно, что БСП у нас разные... А жаль.
(9) dusha0020, ты что смотришь то ?
смотри процедуру, 2-ой ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки,
какую я и написал изначально.
Она экспортная, в модуле ДлительныеОперации, стандартная БСП, из Бухни 3.0.
Вот ее и используй в своей обработке, только параметры правильные передавай.
смотри процедуру, 2-ой ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки,
какую я и написал изначально.
Она экспортная, в модуле ДлительныеОперации, стандартная БСП, из Бухни 3.0.
Вот ее и используй в своей обработке, только параметры правильные передавай.
Процедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт
ИмяМетода = Параметры.ИмяМетода;
ВременнаяСтруктура = Новый Структура;
Попытка
ВременнаяСтруктура.Вставить(ИмяМетода);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода обработки'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Имя метода ""%1"" не соответствует требованиям образования имен переменных.'"),
ИмяМетода);
КонецПопытки;
ПараметрыВыполнения = Параметры.ПараметрыВыполнения;
Если Параметры.ЭтоВнешняяОбработка Тогда
Если ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
Обработка = МодульДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(Параметры.ДополнительнаяОбработкаСсылка);
Иначе
Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки);
КонецЕсли;
Иначе
Обработка = Обработки[Параметры.ИмяОбработки].Создать();
КонецЕсли;
Выполнить("Обработка." + ИмяМетода + "(ПараметрыВыполнения, АдресХранилища)");
КонецПроцедуры
Показать
Рабочий пример.Отсылает почтовое сообщение по расписанию. Расписание задается при добавлении во внешние отчеты. Только адрес получателя
подправь
подправь
Прикрепленные файлы:
ПолучениеОстатков.epf
Там действительно есть маленькая тонкость. Когда я разбирался почему обработка не отрабатывает по расписанию, то вычитал в коде, что создается фоновое задание, но как только доходит до проверки безопасного режима, то вываливается ошибка. Код из внешней обработки в фоновом задание выполняется только в не безопасном режиме. В обще решение в Анализируется версия БСП. Обработку тестировал в нескольких конфигурация. Работает.
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.0");
(14) vovan_victory, С одной стороны, конечно. Но с другой предполагается частое ее (обработки) использование в фоновых задачах с вызовом из других процедур. В это случае намного удобнее и правильнее писать вызывающий код с привязкой к объекту метаданных, а не к НайтиПоКоду(Наименованию) в справочнике дополнительных обработок. Это мое ИМХО:)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот