Имя: Пароль:
1C
 
Запуск внешней обработки через регламентное задание
0 RoboTech
 
22.10.10
05:47
Здравствуйте!
Возникла следующая проблема. В конфигурации, редактировать которую мы не можем, работа с регламентными заданиями реализована следующим образом: существует справочник "Дополнительные внешние обработки", куда добавляется элемент. В этом элементе можно указать ссылку на внешнюю форму (она сохраняется в хранилище значений), можно задать расписание для выполнения задания и в специальном поле указать код который будет выполняться при выполнении задания. При выполнении задания указанный в элементе код выполняется следующим образом: Выполнить(Указанный код).
Естественно это жутко неудобно. Получается что обработка которую привязываешь вообще не при чем. И никак её запустить не удается. Пытался сделать через внешние обработки. В коде который выполняется в задании нахожу необходимый элемент справочника "Дополнительные внешние обработки", сохраняют привязанную к нему обработку во временный файл, подключаю его через внешние обработки, а дальше не получается. Пытался открывать форму, но видимо при выполнении регламентного задания формы не открываются. Пытался вызывать функции обработки, тоже не получается. Подскажите что можно сделать в этом случае? Или это в принципе невозможно реализовать?
1 kroll
 
22.10.10
05:58
Регламентное задание выполняется на сервере. Так что ни о каких интерфесных штучках типа открытия формы речи быть не может. Или я неправильно понял условия задачи?
2 RoboTech
 
22.10.10
05:59
Да, всё правильно. А выполнить функции обработки как-то можно?
3 kroll
 
22.10.10
06:07
если в модуле объекта (обработки) определены экспортные процедуры и функции - то можно.
4 RoboTech
 
22.10.10
06:15
Допустим в модуле обработке есть экспортная процедура ЗапускОбработки().
Для простоты приведу код который выполняется.

ИмяФ = ПолучитьИмяВременногоФайла("epf");
ДвДан.Записать(ИмяФ);
Обр = ВнешниеОбработки.Создать(ИмяФ);

Обр - содержит ссылку на внешнюю обработку. Доступны только методы ОткрытьФорму() и Метаданные().
Если попытаться вызвать функцию Обр.ЗапускОбработки() то ничего не получается
5 kroll
 
22.10.10
06:26
а что делается в ЗапускОбработки?
6 RoboTech
 
22.10.10
06:36
Там выполняется запрос, выбираются элементы справочника и меняются в необходимых случаях значения реквизита.
Но смысл не в этом. Процедура в принципе не видится.
7 kroll
 
22.10.10
06:47
как определили, что не видится?
8 RoboTech
 
22.10.10
06:53
Самое интересное что если выполнить этот же код в обычной обработке, то всё нормально. Получаем ссылку на внешнюю обработку, вызываем процедуру ЗапускОбработки() которая нормально отрабатывает.
А если в регламентной операции, то при выполнении кода: Выполнить(Указанный код) выдает ошибку:
"Ошибка компиляции при вычислении выражения или выполнении фрагмента кода"
9 kroll
 
22.10.10
06:54
что-то там в УказанныйКод содержится, что нельзя выполнить на сервере.
10 RoboTech
 
22.10.10
06:59
По-моему есть какой-то режим отладки или тестирования когда проверяется сможет он выполнится на сервере или нет. Или я ошибаюсь?
Скорее всего вы правы. Только вот как узнать что именно не может выполниться
11 kroll
 
22.10.10
07:20
ну если у тебя обработка внешняя, да и еще с переменным именем, то как ты поставишь точку остановки в такой обработке? Как вариант - на время сохранить и вызывать эту обработку по конкретному имени.
Ну или более затратный - ставить "метки выполнения", то есть поместить в код обработки строки типа
Сообщить("Вот здесь еще работает 1");
...
...
Сообщить("Дошли до сюда 134")
12 RoboTech
 
22.10.10
08:49
На данный момент выяснил что на сервере нельзя использовать команду ВнешниеОбработки.Создать(). Вообще ВнешниеОбработки не доступны при выполнении кода на сервере ... Думаю как теперь по другому получить доступ к обработке ...
13 kroll
 
22.10.10
08:52
ВнешниеОбработкиМенеджер (ExternalDataProcessorsManager)
ВнешниеОбработкиМенеджер (ExternalDataProcessorsManager)
Методы:
Подключить (Connect)
ПолучитьФорму (GetForm)
Создать (Create)

Описание:
Предназначен для управления внешними обработками и позволяет получать значения типа ВнешняяОбработка при помощи метода Создать. Доступ к объекту осуществляется через свойство глобального контекста ВнешниеОбработки.

Доступность:
Сервер, толстый клиент, внешнее соединение.
См. также:
Глобальный контекст, свойство ВнешниеОбработки
14 kroll
 
22.10.10
08:53
ВнешниеОбработки.Создать() также доступно на сервере
15 RoboTech
 
22.10.10
08:54
У нас платформа 8.1. У вас скорее всего 8.2 ...
16 kroll
 
22.10.10
08:58
а и правда... сколько бы времени сэкономили, если бы с самого начала было написано Ж)
17 RoboTech
 
22.10.10
10:59
Решил проблему двумя способами:
1) объединил функции и процедуры которые должны были выполняться обработкой в одну процедуру и её код вставил в поле, откуда во время выполнения регламентного задания берётся код для исполнения. Заработало. Но не удобно.

2) написал батник, который запускает 1С, выполняет нужную обработку. В обработке последней строкой идёт ЗавершитьРаботуСистемы(). Прописал в назначенных заданиях windows на сервере запуск этого батника в нужное время. Запускается, выполняется.

Кому интересно вот текст батника:

"C:\Program Files\1cv81\bin\1cv8.exe" ENTERPRISE /Stest-server\test_base /NTestUser /P123 /Execute "C:\Test.epf"

Выводы: на платформе 8.1 нормально реализовать это невозможно. А вот в 8.2 вполне
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой