gifts2017

Автоматическое тестирование ИБ через Web-Сервисы.

Опубликовал Илья Козырев (WizaXxX) в раздел Программирование

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

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

Для решения проблемы была выбрана технология Веб-Сервисы. Что требовалось сделать:

На сервере (Конфигурация КРС контроль работы системы) человек пишет код тестирования, именно код а ни какие то параметры. Потом этот код передается на сервер нашего клиента, и там выполняется. После чего результат выполнения отправляется обратно на наш сервер.

Для этого на нашем сервере и у клиента должен быть заведен Веб сервис. 

А теперь как это все выглядит:

Есть конрагенты, у каждого контрагента может быть несколько баз, поэтому введен справочник "КРССправочникКонфигурацийКонтрагентов" где и указывается что контрагенту "ООО" и его конфигурации "Управление торговлей База для Ведения учета" присвоен номер "211123".

Далее в справочнике "КРСОбщиеПараметрыПроверки" мы создаем параметры проверки, пишим код и присваеваем тип конфигурации.

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

 

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

У нас имеется два регламентных задания одно это сторона сервера, другое клиента.

  1. КонтрольРаботыСистемыКлиент
  2. КонтрольРаботыСистемыСервер

Листинг первого 

Функция ЗапуститьПроверкуКонфигурации() Экспорт
	Результат = "";
	АдресФайла = Константы.КонтрольРаботыРасположениеФайлаСервера.Получить();
	Определение = Новый WSОпределения(АдресФайла,"СамоТестирование","");
	Сервис = Новый WSПрокси(Определение,"http://www.webtest.org","КРСВернутьПараметрыПроверкиКлиенту","КРСВернутьПараметрыПроверкиКлиентуSoap");
	Сервис.Пользователь = "СамоТестирование";
	Сервис.Пароль = "";
	Ид = Константы.КРМИДКлиентаВУКККод1С.Получить();
	Конф = Константы.КРМИДКлиентаВУКККонфигурация.Получить();
	ВыборкаСервис = Сервис.ПолучитьПараметрыПроверкиКлиента(Ид,Конф);
	Для Каждого Парам Из ВыборкаСервис.ПараметрКлиент Цикл
		Попытка
			Выполнить(Парам.Текст);
		Исключение
			Результат = "При выполнении кода тестирования возникла ошибка!";
		КонецПопытки;
		Если Результат = "" Тогда
			Парам.Текст = "Проверка прошла успешно. Ошибок не обнаружено!";   
			Парам.ТребуетсяВмешательство = Ложь;
		Иначе
			Парам.Текст = Результат;
			Парам.ТребуетсяВмешательство = Истина;
		КонецЕсли;
	КонецЦикла;
	РезультатВыполненияЗаписиЛога = Сервис.ЗаписатьЛог(ВыборкаСервис,Ид,Конф);
	Если РезультатВыполненияЗаписиЛога = 0 Тогда
		///Процедура создания сообщения пользователю	
	КонецЕсли;
	Возврат РезультатВыполненияЗаписиЛога;
КонецФункции

Происходит подключение к серверу и получение параметров проверки с сервера.

Листинг второго

Процедура КРСКонтрольРаботыКлиентскихФоновыхСлужб() Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ЕСТЬNULL(КРСЛогВыполненияЗаданийСрезПоследних.Контрагент, 0) КАК Контрагент,
	               |	КРСЛогВыполненияЗаданийСрезПоследних.Параметр,
	               |	КРСЛогВыполненияЗаданийСрезПоследних.ДатаСледующегоСтарта,
	               |	КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.СообщитьЕслиЗаданиеПросроченоБолееЧемМинут,
	               |	КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.РасположениеФайла,
	               |	КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.Владелец
	               |ИЗ
	               |	Справочник.КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций КАК КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КРСЛогВыполненияЗаданий.СрезПоследних КАК КРСЛогВыполненияЗаданийСрезПоследних
	               |		ПО (КРСЛогВыполненияЗаданийСрезПоследних.Параметр = КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.Ссылка)";
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Если Выборка.Контрагент = 0 Тогда
			//Сформировать сообщение ответственному, Самотестирование не выполнялось. Проверте настройки на стороне клиента!
			Продолжить;
		КонецЕсли;
		Если  ТекущаяДата() > Выборка.ДатаСледующегоСтарта +(Выборка.СообщитьЕслиЗаданиеПросроченоБолееЧемМинут*60)  Тогда
			
			Попытка
				Определение = Новый WSОпределения(Выборка.РасположениеФайла);
				Сервис = Новый WSПрокси(Определение,"http://www.webtest.org","КРСПолучитьПараметрыПроверки","КРСПолучитьПараметрыПроверкиSoap");
				Результат = Сервис.ЗапуститьПроверкуКонфигурации();
				///Сформировать ообщение сотруднику о не работе фонового задания клиента
				Если Результат = 0 Тогда
					///Сформировать ообщение сотруднику, "При записи лога возникли ошибки"	
				КонецЕсли;
			Исключение
				///Сформировать сообщение сотруднику о недоступности вебсервиса клиента
				Сообщить(Выборка.Параметр);
			КонецПопытки;
			
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

После дого как выполняется проверка все пишется в ригистр "КРСЛогВыполненияЗаданий".

 

Листинг веб сервисов 

"КРСВернутьПараметрыПроверкиКлиенту"

//!! Козырев 25/10/12
//Веб сервис сервера
//Функц. вовзращает таблицу параметров клиенту.
Функция ПолучитьПараметрыПроверкиКлиента(Ид,Конф) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.Наименование,
	|	КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.КодПроверки
	|ИЗ
	|	Справочник.КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций КАК КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций
	|ГДЕ
	|	КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.Владелец.Код = &КонтрагентКод
	|	И КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.Конфигурация.Код = &Код";
	Запрос.УстановитьПараметр("КонтрагентКод",Строка(Ид));
	Запрос.УстановитьПараметр("Код",Строка(Конф));
	ТаблицаПараметровТип = ФабрикаXDTO.Тип("http://www.webtest.org","Параметры");
	ТаблицаПараметров = ФабрикаXDTO.Создать(ТаблицаПараметровТип);
	ПараметрТип = ФабрикаXDTO.Тип("http://www.webtest.org","Параметр");
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Параметр = ФабрикаXDTO.Создать(ПараметрТип);
		Параметр.Наименование = Выборка.Наименование;
		Параметр.Текст = Выборка.КодПроверки;
		ТаблицаПараметров.ПараметрКлиент.Добавить(Параметр);
	КонецЦикла;
	Возврат ТаблицаПараметров;
КонецФункции
//Вызывается с клиента.Записывает лог проверки системы клиента.
//Возвращает 0 или 1 (0- запись лога НЕ удалась, 1-запись лога прошла успешна).
Функция ЗаписатьЛог(ТаблицаТестирования,Ид,Конфигурация) Экспорт
	КодВыполненияЗаписи = 0 ; 
	Попытка
		Для Каждого Парам Из ТаблицаТестирования.ПараметрКлиент Цикл
			Рег = РегистрыСведений.КРСЛогВыполненияЗаданий.СоздатьМенеджерЗаписи();
			Рег.Период = ТекущаяДата();
			Рег.Контрагент = Справочники.Контрагенты.НайтиПоКоду(Ид);
			Рег.Параметр = Справочники.КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.НайтиПоНаименованию(Парам.Наименование);
			Рег.Результат = Парам.Текст;
			Рег.Конфигурация = Справочники.КРССправочникКонфигурацийКонтрагентов.НайтиПоКоду(Конфигурация);
			Рег.ЕстьОшибки = Парам.ТребуетсяВмешательство;
			Рег.ДатаСледующегоСтарта = ТекущаяДата()+(Справочники.КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций.НайтиПоНаименованию(Парам.Наименование).ПериодПроверки*60);
			Рег.Записать();
			КодВыполненияЗаписи = 1;
		КонецЦикла;	
	Исключение
		КодВыполненияЗаписи = 0;
	КонецПопытки;
	Возврат КодВыполненияЗаписи;
КонецФункции
//! Козырев 25/10/12
 

Второй "КРСПолучитьПараметрыПроверки"

//!! Козырев 25/10/12
//Веб сервис клиента.
//проц. запуска проверки системы соеденяется с веб сервисом Сервера, получает таблицу параметров проверки, выполняет проверку, вызывает функцию записи лога на Сервере
// возвращает 0 или 1 (0-запись лога НЕ удалась, 1- запись лога прошла успешно) 
Функция ЗапуститьПроверкуКонфигурации() Экспорт
	Результат = "";
	АдресФайла = Константы.КонтрольРаботыРасположениеФайлаСервера.Получить();
	Определение = Новый WSОпределения(АдресФайла,"СамоТестирование","");
	Сервис = Новый WSПрокси(Определение,"http://www.webtest.org","КРСВернутьПараметрыПроверкиКлиенту","КРСВернутьПараметрыПроверкиКлиентуSoap");
	Сервис.Пароль = "";
	Сервис.Пользователь = "СамоТестирование";
	Ид = Константы.КРМИДКлиентаВУКККод1С.Получить();
	Конф = Константы.КРМИДКлиентаВУКККонфигурация.Получить();
	ВыборкаСервис = Сервис.ПолучитьПараметрыПроверкиКлиента(Ид,Конф);
	Для Каждого Парам Из ВыборкаСервис.ПараметрКлиент Цикл
		Попытка
			Выполнить(Парам.Текст);
		Исключение
			Результат = "При выполнении кода тестирования возникла ошибка!";
		КонецПопытки;
		Если Результат = "" Тогда
			Парам.Текст = "Проверка прошла успешно. Ошибок не обнаружено!";   
			Парам.ТребуетсяВмешательство = Ложь;
		Иначе
			Парам.Текст = Результат;
			Парам.ТребуетсяВмешательство = Истина;
		КонецЕсли;
	КонецЦикла;
	РезультатВыполненияЗаписиЛога = Сервис.ЗаписатьЛог(ВыборкаСервис,Ид,Конф);
	Если РезультатВыполненияЗаписиЛога = 0 Тогда
		///Процедура создания сообщения пользователю	
	КонецЕсли;
	Возврат РезультатВыполненияЗаписиЛога;
КонецФункции
//! Козырев 25/10/12

Тут думаю все понятно.

Для интеграции на сервере требуется что бы был справочник "Контрагенты" или можно переписать под свой.

Интеграция производиться простым сравнением и объединением по подсистемам. Вся система разбита на две подсистемы Клиентская часть и Сервераная.

P.S. Не судите строго:) это был мой первый опыт работы с Веб сервисами да и вообще с чем то подобным.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Файл конфигурации всей системы
.cf 58,59Kb
31.10.13
5
.cf 1 58,59Kb 5 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей Новиков (Новиков) 31.10.13 14:21
В типовых конфигурациях, для подобных выкрутасов есть выполнение отчетов по расписанию с отсылкой оного на e-mail.
2. Илья Козырев (WizaXxX) 31.10.13 14:41
Да потом данные из письма заносишь в 1с ручками а потом строишь отчеты...
Здесь же данные заносятся автоматом, плюс можно написать тестирование чего угодно.

Кому удобнее через почту, почему нет?! я что заставляю? мне такой вариант понравился больше.
3. Яков Коган (Yashazz) 31.10.13 17:16
Нечто мне подсказывает, что произвольный "код проверки" в таких случаях - это очаровательная дыра в безопасности. Ваши клиенты знают о подобной фиче?
AlX0id; planar74; VasMart; hulio; DitriX; WizaXxX; +6 Ответить
4. Илья Козырев (WizaXxX) 31.10.13 18:38
Согласен , об этом не думал , вы имеете ввиду что можно написать запрос и получить данные из базы? Если так то все клиенты находятся у нас на поддержке и у нас итак имеется полный доступ, и про безопасность веб сервисов, можно использовать защищенное соединение.
5. Дмитрий Шерстобитов (DitriX) 01.11.13 21:38
(4) что то мне подсказывает что на той стороне есть конструкция ВЫПОЛНИТЬ. И если это так - то это просто пипец :)
Если еще с 8.3, то там можно поставить режим безопасности. а иначе - можно получить доступ к серверу, а там уже ...

Не шутите так НИКОГДА :)

Если вы все равно делаете запросы, то передавайте структуру, и на сервере подставляете что вам надо.
Тогда на сервере смогут выполняться только запросы, и ничего больше.
Можно даже поставить ограничение на количество строк, которые возвращает сервер, что бы не смогли угнать данные одной пачкой.
Вам то не нужен список всех отрицательных товаров? Вам нужен только факт их наличия.

Так что переделайте это все, моя к вам просьба.

Иначе сейчас начинающие программисты - начнут это все копировать, а вы уж думайте о последствиях.
6. Илья Козырев (WizaXxX) 05.11.13 07:54
(5) Спасибо за совет:) и на будущее учту что больше надо думать о безопасности.
Задача так и стояла сделать так что бы на стороне клиента можно было выполнить любой код. Задачу я выполнил но о безопасности даже не задумывался, видимо заказчика это устраивало раз он тоже ни чего не сказал.
7. Антон Чарушкин (hulio) 06.11.13 07:44
(6) WizaXxX,
видимо заказчика это устраивало раз он тоже ни чего не сказал

Заказчик мог об этом и не подумать. В любом случае, я бы на вашем месте предупредил его о возможных, скажем так, проблемах
8. Илья Козырев (WizaXxX) 06.11.13 14:19
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа