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

Эксплуатация » Помогите создать сценарий

Знающие люди, помогите создать сценарий.
Суть такова, заказчику нужно, чтобы при заполнение зоны до 20 человек блокировался вход, работал лишь выход. Пытался освоить Макроязык, но как-то пока не очень. Если напишите в нём, сделайте пожалуйста пометки с пояснениями, чтобы самому понимать, что к чему. Заранее благодарен

3 года 7 месяцев назад

avatar
борьба с ковидом выходит на новый уровень))

включите в настройках АБД отображение текста сценария в режиме шаблонов и поизучайте шаблонные шаги "Взять разделы рабочего места по уходу последнего из заданной зоны", "Заблокировать доступ" и "Восстановить доступ". На основе этого можно уже что-то собрать.

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

вот как вы писали, так и пытался, с такими же сценариями, нефига не вышло

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

так выложите пример того что пытались, там и будет видно, где ошибка.

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

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

8 ответов

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

3 года 7 месяцев назад

avatar
в первую очередь у меня большой вопрос с правильностью написания. Во вторых нужно добавить условие, что если человек меньше 20, то доступ открыт, но при этом значение не может быть меньше нуля, хотя такое врятли может быть.

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

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

Сам не проверял. Рукописный сценарий привязать к событию ПРОХОД считывателя который пускает в эту ЗД.
СЦЕНАРИЙ
Переменные
перем Событие1;
перем ЗД1;
перем ЗД2;
перем считыватель1;

НАЧАЛОСЦЕНАРИЯ
Событие1 = ПолучитьСобытие();
ЗД1 = СоздатьОбъект("ЗоныДоступа");
ЗД2 = ЗД1.ПолучитьПоИндексу(1); // указать номер ЗД
если (ЗД2.КоличествоСотрудниковВЗонеДоступа() == 20)  тогда
считыватель1 = Событие1.Элемент();
считыватель1.ЗаблокироватьСчитыватель();
КонецЕсли;

КОНЕЦСЦЕНАРИЯ

Далее создаете сценарий по шаблону, Восстановить Доступ, указать считыватель на вход в эту ЗД, но привязать к событию ПРОХОД считывателя который выпускает из этой ЗД.

3 года 7 месяцев назад

avatar
а событие здесь нужно, только чтобы определить какой считыватель взять же? по сути можно было и строго задать, но так универсальность и на две двери можно)

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

Событие для считки, по сути можно создать, кому как удобнее.

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

объесните пожалуйста значение функции "событие"
как я понимаю в данном примере она привязывает считыватель, через который пытались пройти. Тоесть заместо события можно было жестко привязать считыватель.
Просто зоной доступа является парковка БЦ с двумя шлагбаумами на вьезд и выезд. На парков есть 2 вида мест для Арендаторов БЦ и гостей. Все проезжают через один шлагбаум, но у арендаторов карты дальней индификации, соответственно стоит отдельная двойка со считывателями дальней индификации, которая сценарием открытия привязана к двойке шлагбаума.
Всё это я пиши к тому, что мне нужна точная привязка считывателя.
Поэтому для общего развития, прошу пояснить, что есть "Получить Событие" и его функцианал

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

Вы сценарий привязываете к конкретному считывателю, во его и получите по его же событию. Подробнее написано в РЭ на макроязык.

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

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

еще вопрос, почему у меня не выводит сообщение с количеством мест
просто сообщение выводит, а вот переменную нет, подскажите что не так

рабочееместо1.ПоказатьСообщение( Зонадоступа1.КоличествоСотрудниковВЗонеДоступа(), 0);

3 года 7 месяцев назад

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

Попробуйте так: рабочееместо1.ПоказатьСообщение( "Зонадоступа1.КоличествоСотрудниковВЗонеДоступа()");

3 года 7 месяцев назад

avatar
тоже сомнительно, оно и покажет "Зонадоступа..." )) там вроде надо в строку переводить

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

мне нужно это было для теста, для вывода переменной. Получилось вывести сообщение только в ядро, но мне этого хватило, чтобы понять  - это работает. 
Теперь стоит другая задача вывести значение переменной в качесте url в текст ie
С текстом так получается, с переменной опять же нет =(.
РабочееМесто1.ЗапуститьПрограмму( "C:\Program Files (x86)\Internet Explorer\iexplore.exe", Зонадоступа1.КоличествоСотрудниковВЗонеДоступа()

Если вставить текст
РабочееМесто1.ЗапуститьПрограмму( "C:\Program Files (x86)\Internet Explorer\iexplore.exe", "Привет"
то в url появляется текст, но если вставить переменную, то стартовая страница =(.

Эти махинации мне нужны, для вывода на циферблад количества мест.

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

Да, с ковычками было лишнее))
РабочееМестоЛок1.ПоказатьСообщение("Людей В Зоне Доступа:"+"  "+ Строка (ЗонаДоступа1.КоличествоСотрудниковВЗонеДоступа())); 
Вот так выводит.

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

ну вот и ответ, переменную выводить бесполезняк, зато через Строка() всё должно получиться.

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

да получилось, спасибо большое всем за помощь, правда со "cтрокой" сам нашёл в мануале, но забыл отписать на форуме, что всё норм, конец рабочего дня, замотался, всем еще раз спасибо. Теперь хоть немного вник в этот макроязык....

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

Если написать так: РабочееМестоЛок1.ЗапуститьПрограмму( "C:\Program Files\internet explorer\iexplore.exe", Строка(ЗД2.КоличествоСотрудниковВЗонеДоступа()));
То в IE показывает так: http://0.0.0.0/ последний 0 это количество в людей в ЗД

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

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

удалось полностью реализовать сценарий, с выводом на табло количества мест. Но возникла проблема, если 2 машины успевают проехать через шлагбаум, то количество мест отображается неправильно. При условии, что на ночь парковка закрыта и машин там не должно быть, то возникла необходимость, что-то придумать с обнулением людей в зоне доступа.
я решил создать сценарай который каждую ночь оценивает количество людей в зоне и предоставление им доступа, чтобы выгнать из зоны.
Для начала я хотел начать с чего-то простого - выявить сотрудника в зоне и вывести его. При успехи данного сценария попытаться его зациклить.
Но даже с первым пунктом возникли трудности.

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


Попытка
Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Компьютер1 = Компьютеры1.ПолучитьПоИд(1);
РабочиеМеста1 = Компьютер1.РабочиеМеста();
РабочееМестоЛок1 = РабочиеМеста1.ПолучитьПоТипуСетевогоМеста("ядро");
ЗоныДоступа1 = СоздатьОбъект( "ЗоныДоступа" );
ЗонаДоступа1 = ЗоныДоступа1.ПолучитьПоИд( 2 );
Сотрудники = ЗоныДоступа1.Сотрудники()
Сотрудник1 = Сотрудники.Первый();
Считыватель1 = РабочееМестоЛок1.Считыватели().ПолучитьПоИд(42)
Считыватель1.ПредоставитьДоступ(Сотрудник1);


Если Не ПустоеЗначение(РабочееМестоЛок1)
Тогда
Сообщить(Сотрудник1, 0);
КонецЕсли;
Исключение Сообщить("Произошло исключение",0); КонецПопытки;
КонецСценария

Трудность в том, что я не могу вытащить информацию о сотрудники из зоны, любые команды типо его id, пароля или фио не приводят не к чему. Т.к. команда (Первый) даёт лишь порядковый номер в списке. Помогите пожалуйста справиться с этой задачей. Заранее благодарен

 

3 года 7 месяцев назад

avatar
Читайте вот отсюда, подобная задача уже обсуждалась https://partners.bolid.ru/forum/forum_8009.html#comment47215

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

еще раз хочу сказать Спасибо
поправил только
Если ЗонаДоступа1.Индекс() > 0 Тогда
на
Если ЗонаДоступа1.ИД() == 2 Тогда
т.к. зон много а мне только с одной надо выгнать
И всё заработало как часики
Товарищь, вы гений))

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

Там задача была проверить ВСЕХ СОТРУДНИКОВ, у вас задача проверить ЗОНУ ДОСТУПА, не вижу смысла гонять сценарий по сотрудникам, надо попробовать только ЗД проверить, но когда, это вопрос, дойдут руки, можно переписать немного под вас.
 

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

Я понял, что он прогоняет всю базу сотрудников, в принципе - это не принципиально, т.к. прогонять он будет ночью и выводить только из второй зоны, думаю их будет там не так много. Если вы поправите сценарий буду примного благодарен

Мелентьев Артём Вячеславович 3 года 7 месяцев назад

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

появилась новая задача от заказчика, и я опять не знаю как с ней справиться. По аналогии с первой задачей с блокировкой вьезда при определенном количество, но теперь зона должна быть разделена на 3 группы допуска, у каждой должно быть определенное количество мест на парковке. И допуск должен не блокироваться, а запрещаться.
Тоесть на одной парковке 3 арендатора, у каждого свое количество машиномест, при достиженние максимума на парковке, нужно запрещать вьезд другим машинам данного арендатора, а при выезде снимать запрет. Если такой сценарий вообще возможен, помогите написать.

3 года 6 месяцев назад

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

нужно понимание
команда
ПолучитьСобытие() отражает уже произошедшее событие или которое еще не совершенно.
Иными словами если человек прислонил карточку, ему предоставится доступ и я получу его данные или я сначала получаю его данные, только потом предоставляется доступ.
Тоесть могу ли я заблокировать его доступ или ему предоставится проход, а лишь затем он заблокируется

Плюсом хотелось бы знать команду запрета прохода и примерный скрипт системы антипасбека

3 года 6 месяцев назад

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

Пока в голову приходит только то, что у вас должен быть всегда запрещен доступ, человек касается картой, по событию доступ запрещен запускается сценарий с проверкой Уровня доступа, а потом уже проверка количества свободных мест по этому УД. Далее решине, предоставить доступ или отказать.
 

3 года 6 месяцев назад

avatar
Для примера:
если ЗД1.КоличествоСотрудниковПоУровню(5) > 0 тогда // 5 это номер уровня доступа в базе
считыватель1 = Событие1.Элемент();
считыватель1.ВосстановитьДоступ();

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

интересное решение, сегодня буду думать в этом направлении.
То есть я добавляю дверь, но не заношу ее не в один уровень доступа. Потом считываю событие  и если количество человек в данном уровне доступа нормальное, то предоставляю проход

Мелентьев Артём Вячеславович 3 года 6 месяцев назад

хмм, а зачем восстанавливать доступ? это по логике тогда второй раз махать же надо, но доступ то от этого не появится. Может быть имеет смысл в "Считыватель1.ПредоставитьДоступ(Событие1.Пароль().Сотрудник())", чтобы ещё и было событие о предоставлении доступа определённому сотруднику ну и знать что сотрудник действительно прошёл в ЗД

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

Это пример с другого сценария, как проверить по УД и все, делайте как вам надо, предоставить доступ.

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

еще раз спасибо за идею, иначе я строил алгоритм в другом ключе, благодаря вам удалось написать сценарий и протестить его. Вот шаблон

Сценарий
Переменные
Перем Считыватель1;
Перем Компьютеры1;
Перем Компьютер1;
Перем РабочиеМеста1;
Перем РабочееМесто1;
перем Событие1;
Перем Пароль1;
Перем ГруппаДоступа1;
Перем Сотрудник1;
перем Проход;
Перем Число1;
Перем ЗоныДоступа1;
Перем ЗонаДоступа1;
НачалоСценария

Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Компьютер1 = Компьютеры1.ПолучитьПоИд(1);
РабочиеМеста1 = Компьютер1.РабочиеМеста();
РабочееМесто1 = РабочиеМеста1.ПолучитьПоТипуСетевогоМеста("Ядро");
Считыватель1 = РабочееМесто1.Считыватели().ПолучитьПоИД( 1 );
ЗоныДоступа1 = СоздатьОбъект( "ЗоныДоступа" );
ЗонаДоступа1 = ЗоныДоступа1.ПолучитьПоИд(2);
Событие1 = ПолучитьСобытие();
Пароль1 = Событие1.Пароль();
Сотрудник1 = Пароль1.Сотрудник().ИД();
Число1 = число(Сотрудник1);
Проход = РабочееМесто1.Сотрудники().ПолучитьПоИД( Число1 );
ГруппаДоступа1 = Пароль1.ГруппаДоступа().ИД();
 Если ГруппаДоступа1 == 3 Тогда
  Если ЗонаДоступа1.КоличествоСотрудниковПоУровню(3) < 4 тогда
Считыватель1.ПредоставитьДоступ( Проход );
  КонецЕсли;
 КонецЕсли;
   Если ГруппаДоступа1 == 4 Тогда
    Если ЗонаДоступа1.КоличествоСотрудниковПоУровню(4) < 4 тогда
Считыватель1.ПредоставитьДоступ( Проход );
    КонецЕсли;
   КонецЕсли;
КонецСценария

Мелентьев Артём Вячеславович 3 года 6 месяцев назад

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

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

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

ПОКАЗАН

2802 раза

ЗАДАН

3 года 7 месяцев назад

ПРОДУКТЫ

Орион Про

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