РК_НастройкиПодключения 1.3.1.51: проверка соединения в менеджере.
ПроверитьСоединение по ссылке/объекту/структуре формы; GET /v1/health через РК_ОбменСВнешнейБазой (X-Transfer-Token); README и CHANGELOG. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,9 +1,250 @@
|
||||
// TODO: Надо внести стандартные директивы и области в данный модуль
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
// Признак, что настройку можно использовать в текущей ИБ.
|
||||
//
|
||||
Функция СоединениеАктивно(НастройкаСсылка) Экспорт
|
||||
Если ТипЗнч(НастройкаСсылка) = Тип("СправочникСсылка.РК_НастройкиПодключенияКВнешнейБазе") Тогда
|
||||
// TODO: Тут надо проверить Активно у записи настройки и соответствие ИмяТекущейБазы имени данной базы и вернуть ЛОЖЬ если одно из этого не выполняется.
|
||||
Иначе
|
||||
|
||||
Если ТипЗнч(НастройкаСсылка) <> Тип("СправочникСсылка.РК_НастройкиПодключенияКВнешнейБазе") Тогда
|
||||
Возврат Неопределено;
|
||||
КонецЕсли;
|
||||
Если Не ЗначениеЗаполнено(НастройкаСсылка) Тогда
|
||||
Возврат Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(НастройкаСсылка, "Активно, ИмяТекущейБазы");
|
||||
Если Реквизиты.Активно <> Истина Тогда
|
||||
Возврат Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
ИмяВНастройке = СокрЛП(Строка(Реквизиты.ИмяТекущейБазы));
|
||||
Если ПустаяСтрока(ИмяВНастройке) Тогда
|
||||
Возврат Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат ВРег(ИмяВНастройке) = ВРег(ИмяТекущейИнформационнойБазы());
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Проверка Transfer API (GET /v1/health).
|
||||
//
|
||||
// Параметры:
|
||||
// Источник - СправочникСсылка.РК_НастройкиПодключенияКВнешнейБазе,
|
||||
// СправочникОбъект.РК_НастройкиПодключенияКВнешнейБазе
|
||||
// или Структура с полями Адрес/АдресПодключения, Токен, Таймаут, Логин, Пароль.
|
||||
// Для ссылки «Активно» не проверяется (можно тестировать черновик).
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура:
|
||||
// * Успех - Булево
|
||||
// * Текст - Строка (для показа пользователю)
|
||||
// * Ответ - Структура/Соответствие ответа health или Неопределено
|
||||
// * Ошибка - Строка
|
||||
//
|
||||
Функция ПроверитьСоединение(Источник) Экспорт
|
||||
|
||||
Результат = Новый Структура("Успех, Текст, Ответ, Ошибка", Ложь, "", Неопределено, "");
|
||||
|
||||
Попытка
|
||||
Настройки = НастройкиДляПроверки(Источник);
|
||||
ОтветHealth = РК_ОбменСВнешнейБазой.ПроверитьСоединение(Настройки);
|
||||
Исключение
|
||||
Результат.Ошибка = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
|
||||
Результат.Текст = НСтр("ru = 'Ошибка соединения:'") + Символы.ПС + Результат.Ошибка;
|
||||
Возврат Результат;
|
||||
КонецПопытки;
|
||||
|
||||
Результат.Ответ = ОтветHealth;
|
||||
Статус = ЗначениеПоляОтвета(ОтветHealth, "status");
|
||||
Если НРег(СокрЛП(Строка(Статус))) <> "ok" Тогда
|
||||
Результат.Ошибка = НСтр("ru = 'Неожиданный ответ health:'") + " " + Строка(Статус);
|
||||
Результат.Текст = Результат.Ошибка;
|
||||
Возврат Результат;
|
||||
КонецЕсли;
|
||||
|
||||
Результат.Успех = Истина;
|
||||
Результат.Текст = ТекстУспешнойПроверки(ОтветHealth);
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Имя текущей ИБ из строки соединения (Ref= / File=).
|
||||
//
|
||||
Функция ИмяТекущейИнформационнойБазы() Экспорт
|
||||
|
||||
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
|
||||
|
||||
Позиция = СтрНайти(СтрокаСоединения, "Ref=""");
|
||||
Если Позиция > 0 Тогда
|
||||
Хвост = Сред(СтрокаСоединения, Позиция + 5);
|
||||
ПозицияКонец = СтрНайти(Хвост, """");
|
||||
Если ПозицияКонец > 0 Тогда
|
||||
Возврат Лев(Хвост, ПозицияКонец - 1);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Позиция = СтрНайти(СтрокаСоединения, "File=""");
|
||||
Если Позиция > 0 Тогда
|
||||
Хвост = Сред(СтрокаСоединения, Позиция + 6);
|
||||
ПозицияКонец = СтрНайти(Хвост, """");
|
||||
Если ПозицияКонец > 0 Тогда
|
||||
Путь = СтрЗаменить(Лев(Хвост, ПозицияКонец - 1), "\", "/");
|
||||
Пока Прав(Путь, 1) = "/" Цикл
|
||||
Путь = Лев(Путь, СтрДлина(Путь) - 1);
|
||||
КонецЦикла;
|
||||
Пока СтрНайти(Путь, "/") > 0 Цикл
|
||||
Путь = Сред(Путь, СтрНайти(Путь, "/") + 1);
|
||||
КонецЦикла;
|
||||
Возврат Путь;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат "";
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Функция НастройкиДляПроверки(Источник)
|
||||
|
||||
Если ТипЗнч(Источник) = Тип("СправочникСсылка.РК_НастройкиПодключенияКВнешнейБазе") Тогда
|
||||
|
||||
Если Не ЗначениеЗаполнено(Источник) Тогда
|
||||
ВызватьИсключение НСтр("ru = 'Не указана настройка подключения'");
|
||||
КонецЕсли;
|
||||
|
||||
Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Источник,
|
||||
"АдресПодключения, Токен, Таймаут, Логин, Пароль");
|
||||
Возврат СтруктураНастроекHTTP(
|
||||
Реквизиты.АдресПодключения,
|
||||
Реквизиты.Токен,
|
||||
Реквизиты.Таймаут,
|
||||
Реквизиты.Логин,
|
||||
Реквизиты.Пароль);
|
||||
|
||||
ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.РК_НастройкиПодключенияКВнешнейБазе") Тогда
|
||||
|
||||
Возврат СтруктураНастроекHTTP(
|
||||
Источник.АдресПодключения,
|
||||
Источник.Токен,
|
||||
Источник.Таймаут,
|
||||
Источник.Логин,
|
||||
Источник.Пароль);
|
||||
|
||||
ИначеЕсли ТипЗнч(Источник) = Тип("Структура") Тогда
|
||||
|
||||
Адрес = "";
|
||||
Если Источник.Свойство("Адрес") Тогда
|
||||
Адрес = Источник.Адрес;
|
||||
ИначеЕсли Источник.Свойство("АдресПодключения") Тогда
|
||||
Адрес = Источник.АдресПодключения;
|
||||
КонецЕсли;
|
||||
|
||||
Токен = "";
|
||||
Если Источник.Свойство("Токен") Тогда
|
||||
Токен = Источник.Токен;
|
||||
КонецЕсли;
|
||||
|
||||
Таймаут = 120;
|
||||
Если Источник.Свойство("Таймаут") Тогда
|
||||
Таймаут = Источник.Таймаут;
|
||||
КонецЕсли;
|
||||
|
||||
Логин = "";
|
||||
Если Источник.Свойство("Логин") Тогда
|
||||
Логин = Источник.Логин;
|
||||
КонецЕсли;
|
||||
|
||||
Пароль = "";
|
||||
Если Источник.Свойство("Пароль") Тогда
|
||||
Пароль = Источник.Пароль;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат СтруктураНастроекHTTP(Адрес, Токен, Таймаут, Логин, Пароль);
|
||||
|
||||
Иначе
|
||||
ВызватьИсключение НСтр("ru = 'Недопустимый тип источника настройки подключения'");
|
||||
КонецЕсли;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СтруктураНастроекHTTP(Адрес, Токен, Таймаут, Логин, Пароль)
|
||||
|
||||
ТаймаутЧисло = 120;
|
||||
Попытка
|
||||
ТаймаутЧисло = Число(Таймаут);
|
||||
Исключение
|
||||
ТаймаутЧисло = 120;
|
||||
КонецПопытки;
|
||||
Если ТаймаутЧисло <= 0 Тогда
|
||||
ТаймаутЧисло = 120;
|
||||
КонецЕсли;
|
||||
|
||||
Настройки = Новый Структура;
|
||||
Настройки.Вставить("Адрес", СокрЛП(Строка(Адрес)));
|
||||
Настройки.Вставить("Токен", СокрЛП(Строка(Токен)));
|
||||
Настройки.Вставить("Таймаут", ТаймаутЧисло);
|
||||
Настройки.Вставить("Логин", СокрЛП(Строка(Логин)));
|
||||
Настройки.Вставить("Пароль", Строка(Пароль));
|
||||
Возврат Настройки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ТекстУспешнойПроверки(ОтветHealth)
|
||||
|
||||
ИБ = ЗначениеПоляОтвета(ОтветHealth, "ib");
|
||||
Расширение = ЗначениеПоляОтвета(ОтветHealth, "extension");
|
||||
ВерсияРасширения = ЗначениеПоляОтвета(ОтветHealth, "extension_version");
|
||||
Конфигурация = ЗначениеПоляОтвета(ОтветHealth, "configuration_name");
|
||||
ВерсияКонфигурации = ЗначениеПоляОтвета(ОтветHealth, "configuration_version");
|
||||
ВремяСервера = ЗначениеПоляОтвета(ОтветHealth, "server_time");
|
||||
|
||||
Части = Новый Массив;
|
||||
Части.Добавить(НСтр("ru = 'Соединение успешно.'"));
|
||||
Если Не ПустаяСтрока(Строка(ИБ)) Тогда
|
||||
Части.Добавить(НСтр("ru = 'ИБ:'") + " " + Строка(ИБ));
|
||||
КонецЕсли;
|
||||
Если Не ПустаяСтрока(Строка(Конфигурация)) Тогда
|
||||
Части.Добавить(НСтр("ru = 'Конфигурация:'") + " " + Строка(Конфигурация)
|
||||
+ ?(ПустаяСтрока(Строка(ВерсияКонфигурации)), "", " " + Строка(ВерсияКонфигурации)));
|
||||
КонецЕсли;
|
||||
Если Не ПустаяСтрока(Строка(Расширение)) Тогда
|
||||
Части.Добавить(НСтр("ru = 'Transfer API:'") + " " + Строка(Расширение)
|
||||
+ ?(ПустаяСтрока(Строка(ВерсияРасширения)), "", " " + Строка(ВерсияРасширения)));
|
||||
КонецЕсли;
|
||||
Если Не ПустаяСтрока(Строка(ВремяСервера)) Тогда
|
||||
Части.Добавить(НСтр("ru = 'Время сервера:'") + " " + Строка(ВремяСервера));
|
||||
КонецЕсли;
|
||||
|
||||
Возврат СтрСоединить(Части, Символы.ПС);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЗначениеПоляОтвета(Источник, ИмяПоля)
|
||||
|
||||
Если Источник = Неопределено Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(Источник) = Тип("Структура") Тогда
|
||||
Значение = Неопределено;
|
||||
Если Источник.Свойство(ИмяПоля, Значение) Тогда
|
||||
Возврат Значение;
|
||||
КонецЕсли;
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(Источник) = Тип("Соответствие") Тогда
|
||||
Значение = Источник.Получить(ИмяПоля);
|
||||
Если Значение = Неопределено Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
Возврат Значение;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат "";
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
+43
-11
@@ -1,20 +1,52 @@
|
||||
|
||||
&НаСервере
|
||||
Процедура ОбновитьИмяТекущейБазыНаСервере()
|
||||
// TODO: Заполнить имя базы из текущей.
|
||||
КонецПроцедуры
|
||||
#Область ОбработчикиСобытийФормы
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ОбработчикиСобытийЭлементовШапкиФормы
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ОбработчикиКомандФормы
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ОбновитьИмяТекущейБазы(Команда)
|
||||
ОбновитьИмяТекущейБазыНаСервере();
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура КомандаПроверитьСоединениеНаСервере()
|
||||
// TODO: Реализовать тестовое соединение со сторонней базой через API ws-rhana
|
||||
ОбновитьИмяТекущейБазыНаСервере();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура КомандаПроверитьСоединение(Команда)
|
||||
КомандаПроверитьСоединениеНаСервере();
|
||||
|
||||
ТекстРезультата = КомандаПроверитьСоединениеНаСервере();
|
||||
ПоказатьПредупреждение(, ТекстРезультата);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
&НаСервере
|
||||
Процедура ОбновитьИмяТекущейБазыНаСервере()
|
||||
|
||||
Объект.ИмяТекущейБазы = Справочники.РК_НастройкиПодключенияКВнешнейБазе.ИмяТекущейИнформационнойБазы();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Функция КомандаПроверитьСоединениеНаСервере()
|
||||
|
||||
Настройки = Новый Структура;
|
||||
Настройки.Вставить("АдресПодключения", Объект.АдресПодключения);
|
||||
Настройки.Вставить("Токен", Объект.Токен);
|
||||
Настройки.Вставить("Таймаут", Объект.Таймаут);
|
||||
Настройки.Вставить("Логин", Объект.Логин);
|
||||
Настройки.Вставить("Пароль", Объект.Пароль);
|
||||
|
||||
РезультатПроверки = Справочники.РК_НастройкиПодключенияКВнешнейБазе.ПроверитьСоединение(Настройки);
|
||||
Возврат РезультатПроверки.Текст;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
Reference in New Issue
Block a user