Skip to content

Instantly share code, notes, and snippets.

@isergey
Created October 14, 2014 08:56
Show Gist options
  • Save isergey/417a601eef3f878b1931 to your computer and use it in GitHub Desktop.
Save isergey/417a601eef3f878b1931 to your computer and use it in GitHub Desktop.
перем ХабТерминалов Экспорт; // Хаб терминалов. Держит соединения с терминалами. ОБЯЗАТЕЛЬНО должен быть глобальной переменной!
// Описание
// 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