Имя: Пароль:
1C
 
Можно ли фоном выполнять процедуру модуля внешней обработки?
,
0 OldCondom
 
30.06.23
13:11
Обработка выполняется долго, не хочется блокировать работу пользователя. Если возможность запустить фоном процедуру модуля самой обработки?
Смотрю ДлительныеОперации.ВыполнитьВФоне():
// Параметры:
//  ИмяПроцедуры           - Строка    - имя экспортной процедуры общего модуля, модуля менеджера объекта
//                                       или модуля обработки, которую необходимо выполнить в фоне.
//                                       Например, "МойОбщийМодуль.МояПроцедура", "Отчет.ЗагруженныеДанные.Сформировать"
//                                       или "Обработка.ЗагрузкаДанных.МодульОбъекта.Загрузить".

То есть только конфу менять?
1 RomanYS
 
30.06.23
13:14
(0) судя по нижеследующему всё предусмотрено
Процедура ВызватьФункцию(ИмяФункции, ПараметрыПроцедуры, АдресРезультата)
    
    ЧастиИмени = СтрРазделить(ИмяФункции, ".");
    ЭтоПроцедураМодуляОбработки = (ЧастиИмени.Количество() = 4) И ВРег(ЧастиИмени[2]) = "МОДУЛЬОБЪЕКТА";
    Если Не ЭтоПроцедураМодуляОбработки Тогда
        Результат = ОбщегоНазначения.ВызватьФункциюКонфигурации(ИмяФункции, ПараметрыПроцедуры);
        ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
        Возврат;
    КонецЕсли;
    
    ЭтоОбработка = ВРег(ЧастиИмени[0]) = "ОБРАБОТКА";
    ЭтоОтчет = ВРег(ЧастиИмени[0]) = "ОТЧЕТ";
    Если ЭтоОбработка Или ЭтоОтчет Тогда
        МенеджерОбъекта = ?(ЭтоОтчет, Отчеты, Обработки);
        ОбработкаОтчетОбъект = МенеджерОбъекта[ЧастиИмени[1]].Создать();
        Результат = ОбщегоНазначения.ВызватьФункциюОбъекта(ОбработкаОтчетОбъект, ЧастиИмени[3], ПараметрыПроцедуры);
        ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
        Возврат;
    КонецЕсли;
    
    ЭтоВнешняяОбработка = ВРег(ЧастиИмени[0]) = "ВНЕШНЯЯОБРАБОТКА";
    ЭтоВнешнийОтчет = ВРег(ЧастиИмени[0]) = "ВНЕШНИЙОТЧЕТ";
    Если ЭтоВнешняяОбработка Или ЭтоВнешнийОтчет Тогда
        ВыполнитьПроверкуПравДоступа("ИнтерактивноеОткрытиеВнешнихОбработок", Метаданные);
        МенеджерОбъекта = ?(ЭтоВнешнийОтчет, ВнешниеОтчеты, ВнешниеОбработки);
        ОбработкаОтчетОбъект = МенеджерОбъекта.Создать(ЧастиИмени[1], БезопасныйРежим());
        Результат = ОбщегоНазначения.ВызватьФункциюОбъекта(ОбработкаОтчетОбъект, ЧастиИмени[3], ПараметрыПроцедуры);
        ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
        Возврат;
    КонецЕсли;
    
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'Неверный формат параметра %2 (переданное значение: %1)'"), ИмяФункции, "ИмяФункции");
    
КонецПроцедуры
2 Garykom
 
гуру
30.06.23
13:15
Обработку придется засовывать в дополнительные отчеты и обработки
Или помещать в доступное серверу место на файловой
3 Жан Пердежон
 
30.06.23
13:15
Если конфа на БСП - можно выполнить в фоне метод доп.обработки
4 RomanYS
 
30.06.23
13:15
Вероятно обработку нужно подключить до вызова
5 OldCondom
 
30.06.23
13:16
Точно, можно через доп. обработки. Всем спасибо
6 Garykom
 
гуру
30.06.23
13:16
(2)+ на файловой системе
например часто обработку в каталог тем копируют чтобы оттуда фоновое могло
7 Garykom
 
гуру
30.06.23
13:16
(6) *темп
8 RomanYS
 
30.06.23
13:16
(2) воззможно это необязательно и подключения достаточно
9 Garykom
 
гуру
30.06.23
13:17
(8) метод БСП возможно сам это может
10 OldCondom
 
30.06.23
15:54
Это какое-то издевательство.
Не получается передать параметр в команду, подскажите, кто как делает.

&НаКлиенте
Процедура ТЕСТФОН(Команда)
    
    ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(ПолучитьСсылкуНаОбработку());
    ПараметрыКоманды.Вставить("ТестПарам", "Тест");
    ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняется команда...'");
    
    Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект);
    ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне("ВыполнитьЭтап3", ПараметрыКоманды, Обработчик);
        
КонецПроцедуры

Модуль объекта обработки, которую вставил как внешнюю:

Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения = Неопределено) Экспорт
    
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Начато фоном");
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ПараметрыВыполнения = Неопределено);
    Если ИмяКоманды = "ВыполнитьЭтап3" Тогда
        ВыполнитьЭтап3();    
    КонецЕсли;

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

Сообщает "ДА", то есть ПараметрыВыполнения = НЕопределено.
Как туда что-то передать? Мне надо процедуру с параметрами выполнять, а не голую.
11 OldCondom
 
30.06.23
15:55
Для  ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне написано:

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

Помимо стандартных параметров может содержать пользовательские для использования в обработчике команды - иии?? Как это использовать?
12 OldCondom
 
30.06.23
16:00
Так тоже не хочет

ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(ПолучитьСсылкуНаОбработку());
    ПараметрыКоманды.Вставить("ПараметрыВыполнения", Новый Структура("ТестПарам", "Тест"));
    ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняется команда...'");
13 OldCondom
 
30.06.23
16:26
Бл*********************

В общем в дебрях общих модулей есть такая штука:
ПередаватьПараметры = (
        СведенияОВнешнемОбъекте.Свойство("ВерсияБСП")
        И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СведенияОВнешнемОбъекте.ВерсияБСП, "1.2.1.4") >= 0);

А у меня старый шаблон для внешних обработок, где я писал
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.1.1.1");