Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Передача обработки на сервер для выполнения в фоне

Передача обработки на сервер для выполнения в фоне
Я
   Franchiser
 
17.11.18 - 15:33
Внешняя обработка открывается через файл, при этом нужно выполнить несколько процедур в отдельных фоновых заданиях (больше 3х).
Если фоновое задание =1 то все хорошо (оно запускается на том же сервере откуда происходит инициализация фонового задания) , но если номер фонового задания больше 1, то они могут инициализироваться на любом другом сервере кластера, в итоге возникает ошибка из-за отсутствия обработки во временной папки.

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

Как решить проблему универсально, не расшаривая общий ресурс для серверов кластера?
 
 
   vde69
 
1 - 17.11.18 - 16:23
поместитьвхранилище

этот адрес доступен со всех серверов кластера
   Franchiser
 
2 - 17.11.18 - 16:31
(1)  создание внешней обработки возможно только по имени:
ВнешнияОбработки.Создать(ПолныйПутьНаСервере) и это все находится в модуле длительныеоперации
   RomanYS
 
3 - 17.11.18 - 16:35
(2) а если подключить(), она не будет доступна везде?
   vde69
 
4 - 17.11.18 - 16:35
(2) сделай не как внешняя обработка а как расширение
   Franchiser
 
5 - 17.11.18 - 16:50
(4) зачем, у меня и так работает если положить обработку в справочник доп. Отче в и обработок. Мне интересно как именно в режиме файл-открыть поступать
   Franchiser
 
6 - 17.11.18 - 16:52
(3) подключение и создание происходит уже в фоновом задании; дописывать общий модуль  ДлительныеОперации не планируется.
Все что я могу сделать это вызвать ДлительныеОперации.ЗапуститьВыполнениеВФоне()
   Franchiser
 
7 - 17.11.18 - 16:54
(3) подключить() работает аналогично; отличие только в том, что при отладке в код обработки не провалишься
   RomanYS
 
8 - 17.11.18 - 17:05
(5) А что не понятно то, копируешь файл обработки через временное хранилище, на сервере сохраняешь в файл(можно временный), создаешь из файла...
   Franchiser
 
9 - 17.11.18 - 17:19
(8) Если передать на сервер , файл сохранится на этом сервере, а потом запустится фоновое задание на другом сервере и этот файл не найдется
   RomanYS
 
10 - 17.11.18 - 17:31
(7) я так понял, подключить() позволяет создать потом по имени, точно не работает?
 
 Рекламное место пустует
   Franchiser
 
11 - 17.11.18 - 17:47
(10) я так понял, что подключить() не работает с путем файла на сервере:
ВнешниеОбработкиМенеджер (ExternalDataProcessorsManager)
Подключить (Connect)
Синтаксис:

Подключить(<Путь>, <Имя>, <БезопасныйРежим>, <ЗащитаОтОпасныхДействий>)
Параметры:

<Путь> (обязательный)

Тип: Строка.
Ссылка на реквизит объекта конфигурации, который содержит данные внешней обработки. Ссылка может быть получена методом ПолучитьНавигационнуюСсылку.
<Имя> (необязательный)

Тип: Строка.
Имя внешней обработки, с которым она будет зарегистрирована в системе.
Наличие одинаковых имен в процессе работы сеанса не допускается. Если имя не указано, будет использовано имя, содержащееся в самой обработке.
<БезопасныйРежим> (необязательный)

Тип: Булево; Строка.
Признак подключения внешней обработки в безопасном режиме. Если параметр не указан, подключение будет осуществлено в безопасном режиме.
Если указана строка, то внешняя обработка будет исполняться в безопасном режиме под управлением профиля безопасности с этим именем. Профиль безопасности должен иметь SafeModeProfile=Истина.
Значение по умолчанию: Истина. 
<ЗащитаОтОпасныхДействий> (необязательный)

Тип: ОписаниеЗащитыОтОпасныхДействий.
Структура, описывающая параметры защиты от опасных действий для подключаемого модуля.
Возвращаемое значение:

Тип: Строка.

Описание:

Выполняет подключение внешней обработки по указанному пути.
Возвращает имя подключенной внешней обработки.

Доступность:

Сервер, толстый клиент, внешнее соединение.
   Franchiser
 
12 - 17.11.18 - 17:48
В модуле длительных операций есть только такое подключение:
роцедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт 
    Если Параметры.ЭтоВнешняяОбработка Тогда
        Ссылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДополнительнаяОбработкаСсылка");
        Если ЗначениеЗаполнено(Ссылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
            Обработка = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки").ОбъектВнешнейОбработки(Ссылка);
        Иначе
            ВыполнитьПроверкуПравДоступа("ИнтерактивноеОткрытиеВнешнихОбработок", Метаданные);
            Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки, БезопасныйРежим());
        КонецЕсли;
    Иначе
        Обработка = Обработки[Параметры.ИмяОбработки].Создать();
    КонецЕсли;
    
    ПараметрыМетода = Новый Массив;
    ПараметрыМетода.Добавить(Параметры.ПараметрыВыполнения);
    ПараметрыМетода.Добавить(АдресХранилища);
    ОбщегоНазначения.ВыполнитьМетодОбъекта(Обработка, Параметры.ИмяМетода, ПараметрыМетода);
КонецПроцедуры
   Franchiser
 
13 - 17.11.18 - 17:53
В любом случае создание и подключение, указанное в этой процедуре происходит в контексте фонового задания
   RomanYS
 
14 - 17.11.18 - 18:14
ХЗ, поможет ли это тебе.
У меня следующий код работает, причем команда2 работает даже после переоткрытия обработки


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

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры

&НаСервере
Процедура Команда2НаСервере()
    Обработка = ВнешниеОбработки.Создать("Тест");
    Сообщить(Обработка.Метаданные().ПолноеИмя());
КонецПроцедуры

&НаКлиенте
Процедура Команда21(Команда)
    Команда2НаСервере();
КонецПроцедуры
   Franchiser
 
15 - 17.11.18 - 18:18
(14) у тебя тут нет фонового задания, а проблема именно передать обработку в 3 фоновых заданиях, или хотя бы заставить в 3 задания заставить запускаться на том же сервере куда передали обработку.
   RomanYS
 
16 - 17.11.18 - 18:23
(15) Команда1 - передала обработку на сервер и подключила,
Команда2 - создала обработку по имени. Команда2 может быть в другой обработке, почему она не будет работать в фоновом?
   RomanYS
 
17 - 17.11.18 - 18:31
+(16) похоже не работает(
   Franchiser
 
18 - 17.11.18 - 18:45
(16) на разных серверах кластера разные папки временных файлов.
Проверял: передал обработку на один сервер; затем 3 фоновых заданиях могли стартовать либо на том же сервере , либо на разных серверах
   Franchiser
 
19 - 17.11.18 - 18:51
В фоновое задание кстати файл нельзя передавать через ВХ, т.к. он обнулится
   Franchiser
 
20 - 17.11.18 - 19:13
Вот ещё тема: v8: v8: ВнешниеОбработки.Создать( как 1С определяет имя?
Нужно попробовать подключить обработку с именем, а затем создать уже обработку по имени, может прокатит
   RomanYS
 
21 - 17.11.18 - 19:20
(20) так я это и делал в (14). В фоновом она не видна(
   Franchiser
 
22 - 17.11.18 - 20:03
(21) так проверял ?

имяобработки1 = внешниеобработки.Подключить(...)
Описание:

"Выполняет подключение внешней обработки по указанному пути.
Возвращает имя подключенной внешней обработки. "

Если в фоновом написать ВнешниеОбработки.Создать(имяобработки1);
   Franchiser
 
23 - 17.11.18 - 20:09
Вообщем идея использовать какую-то комбинацию Подключить() + Создать().
Я тоже замечал, что если фигню передавать в метод Создать() обработка все равно открывается
   RomanYS
 
24 - 17.11.18 - 20:10
(22) ага
Процедура ТестовоеФЗ() Экспорт
    Попытка
        Обработка = ВнешниеОбработки.Создать("Тест");
        ЗаписьЖурналаРегистрации("ОК");    
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка",,,,ОписаниеОшибки());    
    КонецПопытки;
КонецПроцедуры


{ОбщийМодуль.ОМ.Модуль(3)}: Ошибка при вызове метода контекста (Создать): Ошибка подключения внешних метаданных: Файл не обнаружен 'Тест'
   RomanYS
 
25 - 17.11.18 - 20:11
(19) остаются двоичные данные и предача  параметром
   Franchiser
 
26 - 17.11.18 - 20:11
Что у тебя вернул метод Подключить() ?
Там наверно не "Тест"
   Franchiser
 
27 - 17.11.18 - 20:13
(25) у меня внешняя обработка, модуль которого используется через модуль-прослойку. В таком случае нужно менять концу. Я хотел средствами БСП найти способ
   RomanYS
 
28 - 17.11.18 - 20:18
(26) см. команда1 в (14): "Тест"
   RomanYS
 
29 - 17.11.18 - 20:19
(27) так засунь в справочник внешних обработок и используй БСП
   Franchiser
 
30 - 17.11.18 - 20:20
(28) у тебя там написано:
ВнешниеОбработки.Подключить(АдресВХранилище, "Тест");

А я хочу так:
Имяобр = ВнешниеОбработки.Подключить(АдресВХранилище, "Тест");
   RomanYS
 
31 - 17.11.18 - 20:21
(30) так она и вернет "Тест", проверил
Сообщить(ВнешниеОбработки.Подключить(АдресВХранилище, "Тест"));
   Franchiser
 
32 - 17.11.18 - 20:21
(29) ну дело в том что так и сделано, но иногда обработку запускает из каталога на диске, особенно когда ведётся активная доработка.
   RomanYS
 
33 - 17.11.18 - 20:22
(27) сделай авторегистрацию в обработке
 
 
   RomanYS
 
34 - 17.11.18 - 20:22
*(33) к (32)
   Franchiser
 
35 - 17.11.18 - 20:23
(33) тестовые версии обработок не надо же сразу в базу добавлять
   RomanYS
 
36 - 17.11.18 - 20:23
(27) если модуль БСП, то как ты ему подсунешь обработку без регистрации?
Если модуль-прослойка свой, то можно двоичные передавать
   RomanYS
 
37 - 17.11.18 - 20:24
(35) сделай отдельную регистрацию для тестовой
   Franchiser
 
38 - 17.11.18 - 20:31
(36) модуль прослойка ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки
Если фоновое задание одно то по имени воеменного файла на сервере нормально работает, если сразу несколько то может возникнуть ошибка

(37) понял уже.
Вообще варианты:
1. Выкладывать на общий ресурс
2. Запускать без фона
3. Авторегистрация тестовой
4. Свой общий модуль для фоновых с передачей обработки как двоичные данные
   RomanYS
 
39 - 17.11.18 - 20:34
Так у тебя получилось через ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки запустить ВО без регистрации?
   Franchiser
 
40 - 17.11.18 - 20:39
(39) 1. Передаешь на сервер с клиента обработку и сохраняешь во временный файл
2. Путь на файл передаешь как параметр в фоновое, и там пишешь Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере)
   Franchiser
 
41 - 17.11.18 - 20:40
Параметр ЭтоВнешняяОбработка =Истина
РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
            УникальныйИдентификатор,
            "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки",
            СтруктураПараметров, 
            НСтр("ru = 'Выполнение длительной операции на сервере'"));
   RomanYS
 
42 - 17.11.18 - 20:46
(40) с п.1 понятно, а с п.2 как я понимаю судя по (12) ты должен был путь засунуть в Параметры.ИмяОбработки.
Или ты под "там пишешь" как раз код БСП (12) имеешь в виду.
   Franchiser
 
43 - 17.11.18 - 20:46
В твоём случае, когда свой ом, можешь передать имя процедуры модуля как параметр, далее Выполнить("Объект."+ИмяПроцедуры);
   Franchiser
 
44 - 17.11.18 - 20:50
(42) Параметры.ИмяОбработки это имя воеменного файла обработки на сервере, переданной с клиента через вх.

Под "там" я имею ввиду, что Создать() нужно писать не в процедуре на сервере, а в процедуре которая уже выполняется в фоновом задании. В БСП это так и вызывается: Создать() это в процедуре фонового задания.
   RomanYS
 
45 - 17.11.18 - 20:51
всё равно не врубаюсь, зачем Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере).

ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки уже создает обработку и вызывает метод.
   Franchiser
 
46 - 17.11.18 - 20:53
(45)  Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере). Это я написал применительно к твоему примеру: у тебя в примере ОМ свой.
При БСП создавать обработку не нужно...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует