|
Передача обработки на сервер для выполнения в фоне | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
17.11.18
✎
15:33
|
Внешняя обработка открывается через файл, при этом нужно выполнить несколько процедур в отдельных фоновых заданиях (больше 3х).
Если фоновое задание =1 то все хорошо (оно запускается на том же сервере откуда происходит инициализация фонового задания) , но если номер фонового задания больше 1, то они могут инициализироваться на любом другом сервере кластера, в итоге возникает ошибка из-за отсутствия обработки во временной папки. Обработка передается на сервер и записывается во временную папку; Вызываю так: РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне( УникальныйИдентификатор, "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки", СтруктураПараметров, НСтр("ru = 'Выполнение длительной операции на сервере'")); Как решить проблему универсально, не расшаривая общий ресурс для серверов кластера? |
|||
1
vde69
17.11.18
✎
16:23
|
поместитьвхранилище
этот адрес доступен со всех серверов кластера |
|||
2
Franchiser
гуру
17.11.18
✎
16:31
|
(1) создание внешней обработки возможно только по имени:
ВнешнияОбработки.Создать(ПолныйПутьНаСервере) и это все находится в модуле длительныеоперации |
|||
3
RomanYS
17.11.18
✎
16:35
|
(2) а если подключить(), она не будет доступна везде?
|
|||
4
vde69
17.11.18
✎
16:35
|
(2) сделай не как внешняя обработка а как расширение
|
|||
5
Franchiser
гуру
17.11.18
✎
16:50
|
(4) зачем, у меня и так работает если положить обработку в справочник доп. Отче в и обработок. Мне интересно как именно в режиме файл-открыть поступать
|
|||
6
Franchiser
гуру
17.11.18
✎
16:52
|
(3) подключение и создание происходит уже в фоновом задании; дописывать общий модуль ДлительныеОперации не планируется.
Все что я могу сделать это вызвать ДлительныеОперации.ЗапуститьВыполнениеВФоне() |
|||
7
Franchiser
гуру
17.11.18
✎
16:54
|
(3) подключить() работает аналогично; отличие только в том, что при отладке в код обработки не провалишься
|
|||
8
RomanYS
17.11.18
✎
17:05
|
(5) А что не понятно то, копируешь файл обработки через временное хранилище, на сервере сохраняешь в файл(можно временный), создаешь из файла...
|
|||
9
Franchiser
гуру
17.11.18
✎
17:19
|
(8) Если передать на сервер , файл сохранится на этом сервере, а потом запустится фоновое задание на другом сервере и этот файл не найдется
|
|||
10
RomanYS
17.11.18
✎
17:31
|
(7) я так понял, подключить() позволяет создать потом по имени, точно не работает?
|
|||
11
Franchiser
гуру
17.11.18
✎
17:47
|
(10) я так понял, что подключить() не работает с путем файла на сервере:
ВнешниеОбработкиМенеджер (ExternalDataProcessorsManager) Подключить (Connect) Синтаксис: Подключить(<Путь>, <Имя>, <БезопасныйРежим>, <ЗащитаОтОпасныхДействий>) Параметры: <Путь> (обязательный) Тип: Строка. Ссылка на реквизит объекта конфигурации, который содержит данные внешней обработки. Ссылка может быть получена методом ПолучитьНавигационнуюСсылку. <Имя> (необязательный) Тип: Строка. Имя внешней обработки, с которым она будет зарегистрирована в системе. Наличие одинаковых имен в процессе работы сеанса не допускается. Если имя не указано, будет использовано имя, содержащееся в самой обработке. <БезопасныйРежим> (необязательный) Тип: Булево; Строка. Признак подключения внешней обработки в безопасном режиме. Если параметр не указан, подключение будет осуществлено в безопасном режиме. Если указана строка, то внешняя обработка будет исполняться в безопасном режиме под управлением профиля безопасности с этим именем. Профиль безопасности должен иметь SafeModeProfile=Истина. Значение по умолчанию: Истина. <ЗащитаОтОпасныхДействий> (необязательный) Тип: ОписаниеЗащитыОтОпасныхДействий. Структура, описывающая параметры защиты от опасных действий для подключаемого модуля. Возвращаемое значение: Тип: Строка. Описание: Выполняет подключение внешней обработки по указанному пути. Возвращает имя подключенной внешней обработки. Доступность: Сервер, толстый клиент, внешнее соединение. |
|||
12
Franchiser
гуру
17.11.18
✎
17:48
|
В модуле длительных операций есть только такое подключение:
роцедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт Если Параметры.ЭтоВнешняяОбработка Тогда Ссылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДополнительнаяОбработкаСсылка"); Если ЗначениеЗаполнено(Ссылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда Обработка = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки").ОбъектВнешнейОбработки(Ссылка); Иначе ВыполнитьПроверкуПравДоступа("ИнтерактивноеОткрытиеВнешнихОбработок", Метаданные); Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки, БезопасныйРежим()); КонецЕсли; Иначе Обработка = Обработки[Параметры.ИмяОбработки].Создать(); КонецЕсли; ПараметрыМетода = Новый Массив; ПараметрыМетода.Добавить(Параметры.ПараметрыВыполнения); ПараметрыМетода.Добавить(АдресХранилища); ОбщегоНазначения.ВыполнитьМетодОбъекта(Обработка, Параметры.ИмяМетода, ПараметрыМетода); КонецПроцедуры |
|||
13
Franchiser
гуру
17.11.18
✎
17:53
|
В любом случае создание и подключение, указанное в этой процедуре происходит в контексте фонового задания
|
|||
14
RomanYS
17.11.18
✎
18:14
|
ХЗ, поможет ли это тебе.
У меня следующий код работает, причем команда2 работает даже после переоткрытия обработки &НаСервере Процедура Команда1НаСервере() Обработка = РеквизитФормыВЗначение("Объект"); ДвоичныеДанные = Новый ДвоичныеДанные(Обработка.ИспользуемоеИмяФайла); АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные); ВнешниеОбработки.Подключить(АдресВХранилище, "Тест"); КонецПроцедуры &НаКлиенте Процедура Команда1(Команда) Команда1НаСервере(); КонецПроцедуры &НаСервере Процедура Команда2НаСервере() Обработка = ВнешниеОбработки.Создать("Тест"); Сообщить(Обработка.Метаданные().ПолноеИмя()); КонецПроцедуры &НаКлиенте Процедура Команда21(Команда) Команда2НаСервере(); КонецПроцедуры |
|||
15
Franchiser
гуру
17.11.18
✎
18:18
|
(14) у тебя тут нет фонового задания, а проблема именно передать обработку в 3 фоновых заданиях, или хотя бы заставить в 3 задания заставить запускаться на том же сервере куда передали обработку.
|
|||
16
RomanYS
17.11.18
✎
18:23
|
(15) Команда1 - передала обработку на сервер и подключила,
Команда2 - создала обработку по имени. Команда2 может быть в другой обработке, почему она не будет работать в фоновом? |
|||
17
RomanYS
17.11.18
✎
18:31
|
+(16) похоже не работает(
|
|||
18
Franchiser
гуру
17.11.18
✎
18:45
|
(16) на разных серверах кластера разные папки временных файлов.
Проверял: передал обработку на один сервер; затем 3 фоновых заданиях могли стартовать либо на том же сервере , либо на разных серверах |
|||
19
Franchiser
гуру
17.11.18
✎
18:51
|
В фоновое задание кстати файл нельзя передавать через ВХ, т.к. он обнулится
|
|||
20
Franchiser
гуру
17.11.18
✎
19:13
|
Вот ещё тема: v8: v8: ВнешниеОбработки.Создать( как 1С определяет имя?
Нужно попробовать подключить обработку с именем, а затем создать уже обработку по имени, может прокатит |
|||
21
RomanYS
17.11.18
✎
19:20
|
(20) так я это и делал в (14). В фоновом она не видна(
|
|||
22
Franchiser
гуру
17.11.18
✎
20:03
|
(21) так проверял ?
имяобработки1 = внешниеобработки.Подключить(...) Описание: "Выполняет подключение внешней обработки по указанному пути. Возвращает имя подключенной внешней обработки. " Если в фоновом написать ВнешниеОбработки.Создать(имяобработки1); |
|||
23
Franchiser
гуру
17.11.18
✎
20:09
|
Вообщем идея использовать какую-то комбинацию Подключить() + Создать().
Я тоже замечал, что если фигню передавать в метод Создать() обработка все равно открывается |
|||
24
RomanYS
17.11.18
✎
20:10
|
(22) ага
Процедура ТестовоеФЗ() Экспорт Попытка Обработка = ВнешниеОбработки.Создать("Тест"); ЗаписьЖурналаРегистрации("ОК"); Исключение ЗаписьЖурналаРегистрации("Ошибка",,,,ОписаниеОшибки()); КонецПопытки; КонецПроцедуры {ОбщийМодуль.ОМ.Модуль(3)}: Ошибка при вызове метода контекста (Создать): Ошибка подключения внешних метаданных: Файл не обнаружен 'Тест' |
|||
25
RomanYS
17.11.18
✎
20:11
|
(19) остаются двоичные данные и предача параметром
|
|||
26
Franchiser
гуру
17.11.18
✎
20:11
|
Что у тебя вернул метод Подключить() ?
Там наверно не "Тест" |
|||
27
Franchiser
гуру
17.11.18
✎
20:13
|
(25) у меня внешняя обработка, модуль которого используется через модуль-прослойку. В таком случае нужно менять концу. Я хотел средствами БСП найти способ
|
|||
28
RomanYS
17.11.18
✎
20:18
|
(26) см. команда1 в (14): "Тест"
|
|||
29
RomanYS
17.11.18
✎
20:19
|
(27) так засунь в справочник внешних обработок и используй БСП
|
|||
30
Franchiser
гуру
17.11.18
✎
20:20
|
(28) у тебя там написано:
ВнешниеОбработки.Подключить(АдресВХранилище, "Тест"); А я хочу так: Имяобр = ВнешниеОбработки.Подключить(АдресВХранилище, "Тест"); |
|||
31
RomanYS
17.11.18
✎
20:21
|
(30) так она и вернет "Тест", проверил
Сообщить(ВнешниеОбработки.Подключить(АдресВХранилище, "Тест")); |
|||
32
Franchiser
гуру
17.11.18
✎
20:21
|
(29) ну дело в том что так и сделано, но иногда обработку запускает из каталога на диске, особенно когда ведётся активная доработка.
|
|||
33
RomanYS
17.11.18
✎
20:22
|
(27) сделай авторегистрацию в обработке
|
|||
34
RomanYS
17.11.18
✎
20:22
|
*(33) к (32)
|
|||
35
Franchiser
гуру
17.11.18
✎
20:23
|
(33) тестовые версии обработок не надо же сразу в базу добавлять
|
|||
36
RomanYS
17.11.18
✎
20:23
|
(27) если модуль БСП, то как ты ему подсунешь обработку без регистрации?
Если модуль-прослойка свой, то можно двоичные передавать |
|||
37
RomanYS
17.11.18
✎
20:24
|
(35) сделай отдельную регистрацию для тестовой
|
|||
38
Franchiser
гуру
17.11.18
✎
20:31
|
(36) модуль прослойка ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки
Если фоновое задание одно то по имени воеменного файла на сервере нормально работает, если сразу несколько то может возникнуть ошибка (37) понял уже. Вообще варианты: 1. Выкладывать на общий ресурс 2. Запускать без фона 3. Авторегистрация тестовой 4. Свой общий модуль для фоновых с передачей обработки как двоичные данные |
|||
39
RomanYS
17.11.18
✎
20:34
|
Так у тебя получилось через ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки запустить ВО без регистрации?
|
|||
40
Franchiser
гуру
17.11.18
✎
20:39
|
(39) 1. Передаешь на сервер с клиента обработку и сохраняешь во временный файл
2. Путь на файл передаешь как параметр в фоновое, и там пишешь Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере) |
|||
41
Franchiser
гуру
17.11.18
✎
20:40
|
Параметр ЭтоВнешняяОбработка =Истина
РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне( УникальныйИдентификатор, "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки", СтруктураПараметров, НСтр("ru = 'Выполнение длительной операции на сервере'")); |
|||
42
RomanYS
17.11.18
✎
20:46
|
(40) с п.1 понятно, а с п.2 как я понимаю судя по (12) ты должен был путь засунуть в Параметры.ИмяОбработки.
Или ты под "там пишешь" как раз код БСП (12) имеешь в виду. |
|||
43
Franchiser
гуру
17.11.18
✎
20:46
|
В твоём случае, когда свой ом, можешь передать имя процедуры модуля как параметр, далее Выполнить("Объект."+ИмяПроцедуры);
|
|||
44
Franchiser
гуру
17.11.18
✎
20:50
|
(42) Параметры.ИмяОбработки это имя воеменного файла обработки на сервере, переданной с клиента через вх.
Под "там" я имею ввиду, что Создать() нужно писать не в процедуре на сервере, а в процедуре которая уже выполняется в фоновом задании. В БСП это так и вызывается: Создать() это в процедуре фонового задания. |
|||
45
RomanYS
17.11.18
✎
20:51
|
всё равно не врубаюсь, зачем Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере).
ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки уже создает обработку и вызывает метод. |
|||
46
Franchiser
гуру
17.11.18
✎
20:53
|
(45) Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере). Это я написал применительно к твоему примеру: у тебя в примере ОМ свой.
При БСП создавать обработку не нужно... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |