Created
October 14, 2014 08:56
-
-
Save isergey/417a601eef3f878b1931 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
перем ХабТерминалов Экспорт; // Хаб терминалов. Держит соединения с терминалами. ОБЯЗАТЕЛЬНО должен быть глобальной переменной! | |
// Описание | |
// 1. При запуске конфигурации происходит инициализация терминалов (ПриНачалеРаботыСистемы) | |
// 2. При поступлении запроса на идентификацию карты, срабатывает ОбработкаВнешнегоСобытия | |
// 3. Запускается процедура ИдентификацияКарты, в которой выполняется дейсвие - пускать, либо не пускать. | |
// В случае, если терминал подключили как станцию записи отпечатков, можно еще записать пальцы | |
Процедура ПриНачалеРаботыСистемы() | |
Сообщить("ПриНачалеРаботыСистемы"); | |
ПодключитьВнешнююКомпоненту("C:\ganter_access_1c.dll", "GantnerVk", ТипВнешнейКомпоненты.Native); | |
ХабТерминалов = Новый("AddIn.GantnerVk.gantner"); | |
// Параметры: | |
// 1. Идентификатор, по которому в последствии будут посылаться команды | |
// 2. IP адрес терминала | |
// 3. порт терминала | |
// 4. Является ли терминал станцией обслуживания. Истина - да, Ложь - нет | |
// Внимание! Нельзя добавлять терминлы с одинаковыми идентификаторами, ip адресом и портом | |
ХабТерминалов.ДобавитьТерминал("Станция", "192.168.1.102", 8000, Истина); | |
ХабТерминалов.ДобавитьТерминал("Проход", "192.168.1.103", 8000, Ложь); | |
//Установка соедиения с терминалами | |
ХабТерминалов.ПодключитьсяКоВсем(); | |
КонецПроцедуры | |
// В случае поступления события от гантнера: | |
// Источник: "gantner" | |
// Событие: "card_ident" - запрос на пропуск карты. Данные - xml строка с параметрами запроса. | |
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные) Экспорт | |
Сообщить(Источник + " " + Событие); | |
Сообщить(Данные); | |
Если (Источник = "gantner") и (Событие = "card_ident") Тогда | |
ИдентификацияКарты(Данные); | |
КонецЕсли; | |
КонецПроцедуры | |
Процедура ИдентификацияКарты(XMLСтрокаЗапроса) | |
ОбъектЗапроса = Неопределено; | |
попытка | |
ОбъектЗапроса = ПолучитьОбъектЗапроса(XMLСтрокаЗапроса); | |
исключение | |
Сообщить(ОписаниеОшибки()); | |
Возврат; | |
конецпопытки; | |
//ОбъектЗапроса.Терминал.Идентификатор - идентификатор терминала, который был укащан при добавлении в хаб терминалов. | |
// Изменять нельзя! Используется для идентификации терминала, к которму отправлена команда. | |
//ОбъектЗапроса.Карта.hexИдентификатор - массив байтов в формате hex с идентификатором карты (хранится на карте как есть). | |
//ОбъектЗапроса.Карта.Идентификатор - числовое представление идентификатора карты. Получен переводом каждого байта идентификатора в целое число. | |
// НЕ использовать в базе! Только в качестве инфы. | |
Сообщить("Терминал: " + ОбъектЗапроса.Терминал.Идентификатор + ", hex ид. карты: " + ОбъектЗапроса.Карта.hexИдентификатор + ", ид. карты: " + ОбъектЗапроса.Карта.Идентификатор); | |
Если (ОбъектЗапроса.Терминал.СтанцияОбслуживания = "1") Тогда | |
//Если терминал является станцие обслуживания, то сообщения пишуться только на латинице (нет русского шрифта). | |
// Максимум 20 символов. Нельзя использовать символ ";". | |
//Станцию обслуживания можно использовать в качестве первичного получения номера карты и записи отпечатков | |
//ХабТерминалов.РазрешитьДоступ(ОбъектЗапроса.Терминал.Идентификатор, "Hello,", "guest", Ложь, Ложь, Ложь, Ложь); | |
//ХабТерминалов.ЗапретитьДоступ(ОбъектЗапроса.Терминал.Идентификатор, "Card is not", "registered"); | |
//ХабТерминалов.СохранитьОтпечатки(ОбъектЗапроса.Терминал.Идентификатор, "Start saving", "fingers on card"); | |
Иначе | |
//Если обычный терминал | |
// 4 последних параметра - управление реле (воротами с 1 по 4 реле). Истина - открыть, Ложь - закрыть. | |
// Если все четыре реле Ложь, то срабатывает открытие всех реле. | |
//ХабТерминалов.РазрешитьДоступ(ОбъектЗапроса.Терминал.Идентификатор, "Добро,", "пожаловать!", Ложь, Ложь, Ложь, Ложь); | |
ХабТерминалов.ЗапретитьДоступ(ОбъектЗапроса.Терминал.Идентификатор, "Доступ,", "запрещен!"); | |
КонецЕсли; | |
КонецПроцедуры | |
// Функция для получения объекта запроса из xml строки, полученной из внешнего компонента gantner | |
// Параметр: XMLСтрокаЗапроса (строка) - строка c xml | |
// Возврат: ОбъектЗапроса (структура) - структура содержит информацию о типе запроса, инфу о терминале и карточке | |
// Исключения: В случае некорректной структуры xml порождает исключение | |
Функция ПолучитьОбъектЗапроса(XMLСтрокаЗапроса) | |
попытка | |
ЧтениеXML = Новый ЧтениеXML; | |
ЧтениеXML.УстановитьСтроку(XMLСтрокаЗапроса); | |
ПостроительDOM = Новый ПостроительDOM; | |
ДокументДом = ПостроительDOM.Прочитать(ЧтениеXML); | |
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументДом); | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/@type", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
СтроковоеЗначение = Результат.СтроковоеЗначение; | |
Если (СтроковоеЗначение <> "card_ident") Тогда | |
ВызватьИсключение "Ошибка. Ожидался тип запроса card_ident. Текущий: [" + СтроковоеЗначение + "]."; | |
КонецЕсли; | |
ОбъектЗапроса = Новый Структура; // ТипЗапроса - строка, Терминал - объект описания терминала | |
ОбъектЗапроса.Вставить("ТипЗапроса", СтроковоеЗначение); | |
Терминал = Новый Структура; // "Идентификатор" - строка, "Адрес" - строка, "Порт" - целое, "СтанцияОбслуживания" - целое (0 или 1) | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/terminal/@id", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение = "") Тогда | |
ВызватьИсключение "Ошибка. Пустрой идентификатор терминала."; | |
КонецЕсли; | |
Терминал.Вставить("Идентификатор", Значение); | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/terminal/@addr", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение = "") Тогда | |
ВызватьИсключение "Ошибка. Пустрой адрес терминала."; | |
КонецЕсли; | |
Терминал.Вставить("Адрес", Значение); | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/terminal/@port", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение = "") Тогда | |
ВызватьИсключение "Ошибка. Пустрой порт терминала."; | |
КонецЕсли; | |
Терминал.Вставить("Порт", Цел(Значение)); | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/terminal/@enrollment", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение <> "0") и (Значение <> "1") Тогда | |
ВызватьИсключение "Ошибка. Признак станции обслуживания у терминала должен быть 0 или 1. Возможно он не указан."; | |
КонецЕсли; | |
Терминал.Вставить("СтанцияОбслуживания", Значение); | |
ОбъектЗапроса.Вставить("Терминал", Терминал); | |
Карта = Новый Структура; | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/card/@id", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение = "") Тогда | |
ВызватьИсключение "Ошибка. Не указан идентификатор карты."; | |
КонецЕсли; | |
Карта.Вставить("Идентификатор", Значение); | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/card/@hex_id", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение = "") Тогда | |
ВызватьИсключение "Ошибка. Не указан hex идентификатор карты."; | |
КонецЕсли; | |
Карта.Вставить("hexИдентификатор", Значение); | |
Результат = ДокументДом.ВычислитьВыражениеXPath("/request/card/@type", ДокументДом, РазыменовательПИ, ТипРезультатаDOMXPath.Строка); | |
Значение = Результат.СтроковоеЗначение; | |
Если (Значение = "") Тогда | |
ВызватьИсключение "Ошибка. Не указан тип карты."; | |
КонецЕсли; | |
Карта.Вставить("Тип", Значение); | |
ОбъектЗапроса.Вставить("Карта", Карта); | |
Возврат ОбъектЗапроса; | |
исключение | |
ВызватьИсключение ОписаниеОшибки(); | |
конецпопытки; | |
КонецФункции |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment