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

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

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

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

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

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

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

11 месяцев назад

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

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

Андрей, оно:
Пример простого сценария, запускаемого по горячей клавише, из дерева управления, или по расписанию в системе с несколькими Ядрами опроса.
Так как сценарий запускаемый по горячей клавише, из дерева управления, или по расписанию, запускается сразу во всех Ядрах опроса, то в большинстве случаев необходимо разделять объекты, которыми производится управление, по принадлежности к конкретному Ядру опроса.
Другими словами, необходимо проверять, принадлежит ли объект, для которого посылаются команды, тому Ядру опроса, в котором выполняется сценарий.
Рассмотрим пример, когда необходимо блокировать доступ для одной точки доступа (с номером 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.ЗаблокироватьДоступ();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецСценария

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

Бабаев М. А. 11 месяцев назад

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

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

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

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

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

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

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

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

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

Карпов Дмитрий 3 месяца 23 дня назад

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

1 ответ

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

11 месяцев назад

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

Бабаев М. А. 11 месяцев назад

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

Бабаев М. А. 10 месяцев 30 дней назад

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

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

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

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

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

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

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

Бабаев М. А. 10 месяцев 30 дней назад

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

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

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

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

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

ПОКАЗАН

1061 раз

ЗАДАН

11 месяцев назад

ПРОДУКТЫ

Орион Про

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