Время идет, количество клиентов растет как и количество проблем. У кого то криво ведется учет и постоянно появляются отрицательные остатки, у кого то еще что то. Вот и появилась идея сделать систему которая в автоматическом режиме будет периодически проверять те самые отрицательные остатки или еще что то. Задача стояла сделать все как можно универсальней, что бы можно было приспособить ни только под отрицательные остатки.
Для решения проблемы была выбрана технология Веб-Сервисы. Что требовалось сделать:
На сервере (Конфигурация КРС контроль работы системы) человек пишет код тестирования, именно код а ни какие то параметры. Потом этот код передается на сервер нашего клиента, и там выполняется. После чего результат выполнения отправляется обратно на наш сервер.
Для этого на нашем сервере и у клиента должен быть заведен Веб сервис.
А теперь как это все выглядит:
Есть конрагенты, у каждого контрагента может быть несколько баз, поэтому введен справочник "КРССправочникКонфигурацийКонтрагентов" где и указывается что контрагенту "ООО" и его конфигурации "Управление торговлей База для Ведения учета" присвоен номер "211123".
Далее в справочнике "КРСОбщиеПараметрыПроверки" мы создаем параметры проверки, пишим код и присваеваем тип конфигурации.
После чего запоняем справочник "КРСДействующиеПараметрыПроверкиКлиентскихКонфигураций" там есть выбор шаблонов или можно написать новый код, указываем период проверки, через какое время сообщять если проверка просрочена и т.д выглядит так
На каждом сервере клиента указываем параметры подключения
У нас имеется два регламентных задания одно это сторона сервера, другое клиента.
- КонтрольРаботыСистемыКлиент
- КонтрольРаботыСистемыСервер
Листинг первого
Функция ЗапуститьПроверкуКонфигурации() Экспорт
Результат = "";
АдресФайла = Константы.КонтрольРаботыРасположениеФайлаСервера.Получить();
Определение = Новый 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. Не судите строго:) это был мой первый опыт работы с Веб сервисами да и вообще с чем то подобным.