Имя: Пароль:
1C
1С v8
Передача обработки на сервер для выполнения в фоне
,
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)  Обработка = ВнешниеОбработки.Создать(ПутьКОбработкеНаСервере). Это я написал применительно к твоему примеру: у тебя в примере ОМ свой.
При БСП создавать обработку не нужно...