партнерский раздел
ФорумЭксплуатацияМногократное выполнение сценария в расписании

Эксплуатация » Многократное выполнение сценария в расписании

Добры всем день.
Орион ПРО 1.20.2
Имеется такая проблема.
Создал сценарий на открытие свободного прохода у двери.

Создал окно времени для запуска сценария.

Создал задачу в расписании на выполнение сценария.

Это все работает, но сценарий выполняется несколько раз.

Кто нибудь сталкивался с подобным? От чего может возникнуть подобное?

5 лет 4 месяца назад

avatar
сценарий видимо запустился раз этак 12, да? столько же, сколько и ядер опроса? а время на компах с ядрами немного не синхронизировано?
на 1.12.2.2 наблюдаю такое же чудо, но у меня два ядра всего, поэтому список меньше и запускается всё в одно время) а решения так же никто не подсказал

Волков Андрей 5 лет 4 месяца назад

Андрей, оно:
Пример простого сценария, запускаемого по горячей клавише, из дерева управления, или по расписанию в системе с несколькими Ядрами опроса.
Так как сценарий запускаемый по горячей клавише, из дерева управления, или по расписанию, запускается сразу во всех Ядрах опроса, то в большинстве случаев необходимо разделять объекты, которыми производится управление, по принадлежности к конкретному Ядру опроса.
Другими словами, необходимо проверять, принадлежит ли объект, для которого посылаются команды, тому Ядру опроса, в котором выполняется сценарий.
Рассмотрим пример, когда необходимо блокировать доступ для одной точки доступа (с номером 3, и принадлежащей Ядру опроса с IP-адресом «192.168.11.5»). В тексте сценария производится проверка на принадлежность точки доступа Ядру опроса, в котором и запущен сценарий.
Данный сценарий запуститься во всех Ядрах опроса, но команда на блокирование доступа будет произведена только в одном из них.

?

РабочееМесто1 = Компьютеры1.ПолучитьПоТипуИСетевомуАдресу( "Ядро" , "192.168.11.5" );
Если Не ПустоеЗначение( РабочееМесто1 ) Тогда
Если РабочееМесто1.Локальное() == ИСТИНА Тогда // Требуемая проверка

Сам не сталкивался еще и не проверял.

Полный текст сценария из вышеописанного примера:

Сценарий
Переменные
Перем Компьютеры1;
Перем РабочееМесто1;
Перем Двери1;
Перем Дверь1;
Перем Считыватель1;
НачалоСценария
Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Если Не ПустоеЗначение( Компьютеры1 ) Тогда
РабочееМесто1 = Компьютеры1.ПолучитьПоТипуИСетевомуАдресу( "Ядро" , "192.168.11.5" );
Если Не ПустоеЗначение( РабочееМесто1 ) Тогда
Если РабочееМесто1.Локальное() == ИСТИНА Тогда // Требуемая проверка
Двери1 = РабочееМесто1.Двери();
Если Не ПустоеЗначение( Двери1 ) Тогда
Дверь1 = Двери1.ПолучитьПоИндексу( 3 );
Если Не ПустоеЗначение( Дверь1 ) Тогда
Сообщить( Дверь1.Название(), 0 );
Считыватель1 = Дверь1.СчитывательНаВход();
Если Не ПустоеЗначение( Считыватель1 ) Тогда
Сообщить( " " + Считыватель1.Название(), 0 );
Считыватель1.ЗаблокироватьДоступ();
КонецЕсли;
Считыватель1 = Дверь1.СчитывательНаВыход();
Если Не ПустоеЗначение( Считыватель1 ) Тогда
Сообщить( " " + Считыватель1.Название(), 0 );
Считыватель1.ЗаблокироватьДоступ();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецСценария

Более подробно в документации, Описание макроязыков...

Тремасов Константин Александрович 5 лет 4 месяца назад

Еще есть такое:

ОграничитьВыполнение(Компьютер1); // Логическое, запуск сценария ограничен выполнением его, только на указанном Компьютер1.

В примере выглядит так:

Ядро1 = СоздатьОбъект( "Ядро" );
Если Не ПустоеЗначение( Ядро1 ) Тогда
Ядро1.ОграничитьВыполнение( 1 );
КонецЕсли;
...
Остальной текст сценария

 

Тремасов Константин Александрович 5 лет 4 месяца назад

сценарии то шаблонные и в них такое уже не вписать, но на будущее видимо стоит совсем отказаться от шаблонов, чтобы потом не пришлось переписывать)

Волков Андрей 5 лет 4 месяца назад

Очевидную вещь скажу, но все же, чтоб с нуля не "мудохаться" со сценариями, создаешь шаблон, копируешь из него текст, создаешь "нешаблон", вставляешь и правишь/добавляешь.

Тремасов Константин Александрович 5 лет 4 месяца назад

так я так и изучал сценарии) а ещё я из шаблонов беру ИДшники оборудования. Просто те сценарии в которых только парочка стандартных Открыть/Восстановить доступ ну совсем не интересно переписывать в "нешаблон"

Волков Андрей 5 лет 4 месяца назад

Либо изучать этот "боярский" язык програвммирования. Я так понял он близок (если не он и есть) к языку 1С++ - встроенный язык для 1С бухгалтерии.

Бабаев М. А. 5 лет 4 месяца назад

Ну судя по таким процедурам как "ОткрытиеДоступ()" язык больше на "олбанский" похож)

Тремасов Константин Александрович 5 лет 4 месяца назад

судя по таким процедурам как "ОткрытиеДоступ()"

убил бы того криворукого! я два дня пытался понять, почему мой "нешаблонный" сценарий не хочет работать, в то время как шаблон идеально отрабатывает, а всё потому что я ручками писал ОткрытиеДоступа...

Волков Андрей 5 лет 4 месяца назад

Ну что поделать? Любят они потроллить нас) То прошивку молча выпилят "недавновыложенную", то вот такие процедуры)

P.S. Я кстати так же попал как ты и хорошо это написание запомнил)

Тремасов Константин Александрович 5 лет 4 месяца назад

Чисто для примера.
Сравнить…
https://yadi.sk/i/5o6CkFKqcx8SSQ 
(как выглядит фрагмент кода в 1С конфигураторе (v8.3)). 
 

Карпов Дмитрий 4 года 9 месяцев назад

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

1 ответ

10 раз, столько рабочих ядер как раз. Очень интересно...
Получается планировщик заставляет какждую оперативную задачу выполнить этот скрипт.

5 лет 4 месяца назад

avatar
Изменил сценарий. Завтра посмотрю, что в итоге.

Бабаев М. А. 5 лет 4 месяца назад

Вариант со строкой "Если РабочееМесто1.Локальное() == ИСТИНА Тогда" работает. Сценарий выполняется один раз.

Бабаев М. А. 5 лет 4 месяца назад

А весь текст показать? Или интеллектуальная собственность?)))

P.S. Только не скрин,  а именно копипаст.

Тремасов Константин Александрович 5 лет 4 месяца назад

Сценарий то есть? Вот

Сценарий
Переменные
Перем РабочееМесто1;
Перем РабочиеМеста1;
Перем Компьютер1;
Перем Компьютеры1;
Перем Считыватель1;
НачалоСценария

Попытка
Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Компьютер1 = Компьютеры1.ПолучитьПоИд(12);
РабочиеМеста1 = Компьютер1.РабочиеМеста();
РабочееМесто1 = РабочиеМеста1.ПолучитьПоТипуСетевогоМеста("Ядро");
Если не ПустоеЗначение( РабочееМесто1.Считыватели() ) Тогда
Если РабочееМесто1.Локальное() == ИСТИНА Тогда
Считыватель1 = РабочееМесто1.Считыватели().ПолучитьПоИД( 4142 );
Если не ПустоеЗначение( Считыватель1 ) Тогда
Считыватель1.ОткрытиеДоступ();
иначе Сообщить( "Считыватель не найден", 1 );
КонецЕсли;
КонецЕсли;
КонецЕсли;
Исключение Сообщить("Произошло исключение",0); КонецПопытки;
КонецСценария

Просто вставил в шаблонный сценарий нужную строку условия, ну и в конце закрыл его (КонецЕсли).

Бабаев М. А. 5 лет 4 месяца назад

Благодарю, я просто думал что оно работает именно в связке с 
"РабочееМесто1 = Компьютеры1.ПолучитьПоТипуИСетевомуАдресу( "Ядро" , "192.168.11.5" );"

Тремасов Константин Александрович 5 лет 4 месяца назад

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Добавить ответ

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

ПОКАЗАН

3262 раза

ЗАДАН

5 лет 4 месяца назад

ПРОДУКТЫ

Орион Про

По каждому вопросу/ответу можно добавлять комментарии. Комментарии предназначены для уточнения вопроса/ответа.