Files
uas_ep/src/CommonModules/ДиагностикаЭДОСлужебный/Ext/Module.bsl
T

1940 lines
144 KiB
Plaintext

#Область СлужебныеПроцедурыИФункции
#Область ДиагностикаИнтернетСоединения
Процедура ДиагностикаИнтернетСоединения(РезультатДиагностики, ПараметрыВыполненияДиагностики, Контекст)
ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение();
РезультатДиагностикиИнтернетСоединения = Неопределено;
Если Не ЕстьВидДиагностики(РезультатДиагностики, ВидДиагностики, РезультатДиагностикиИнтернетСоединения) Тогда
Возврат;
КонецЕсли;
Результаты = РезультатДиагностикиИнтернетСоединения.Результаты;
НаличиеИнтернетСоединения = Результаты.НаличиеИнтернетСоединения;
ПроверитьИнтернетСоединение(НаличиеИнтернетСоединения);
Если НаличиеИнтернетСоединения.Результат Тогда
УчетныеЗаписи = РезультатДиагностики.ДоступныеУчетныеЗаписи;
ПроверяемыеСервисы = ПроверяемыеСервисыИнтернетСоединение(РезультатДиагностики, УчетныеЗаписи);
ПроверитьАктивностьСервисов(Результаты.АктивностьСервисов, ПроверяемыеСервисы);
ПроверитьДоступностьСервисов(Результаты, ПроверяемыеСервисы);
ПроверитьКорневыеСертификаты(Результаты.НаличиеКорневыхСертификатов, ПроверяемыеСервисы, Контекст);
КонецЕсли;
ОбщийРезультат = Истина;
Для каждого РезультатВидаДиагностики Из Результаты Цикл
ОбщийРезультат = ОбщийРезультат И РезультатВидаДиагностики.Значение.Результат <> Ложь;
КонецЦикла;
РезультатДиагностикиИнтернетСоединения.Результат = ОбщийРезультат;
РезультатДиагностикиИнтернетСоединения.ОтчетДляАдминистратора =
ОтчетДляАдминистратораИнтернетСоединение(РезультатДиагностикиИнтернетСоединения,
ПараметрыВыполненияДиагностики);
КонецПроцедуры
Процедура ПроверитьИнтернетСоединение(НаличиеИнтернетСоединения)
АдресРесурса = "1c.ru";
НаличиеИнтернетСоединения.Результат = ИнтернетРесурсДоступен(АдресРесурса);
НаличиеИнтернетСоединения.Рекомендация.Краткая = НСтр("ru = 'Обратитесь к администратору'");
НаличиеИнтернетСоединения.Рекомендация.Подробная = НСтр("ru = 'Проверьте доступ к сети интернет'");
КонецПроцедуры
Процедура ПроверитьАктивностьСервисов(АктивностьСервисов, ПроверяемыеСервисы)
РезультатПолученияФайла = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере("https://reputils.1c.ru/static/online_stats.json");
Ошибка = Неопределено;
ШаблонСообщенияОбОшибке = НСтр("ru = 'Ошибка проверки активности сервисов:
|%1
|%2'");
ТекстОшибкиЧтениеJSON = СтрШаблон(ШаблонСообщенияОбОшибке,
НСтр("ru = 'Чтение JSON:'"),
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Если РезультатПолученияФайла.Статус Тогда
Попытка
ОбщийРезультат = Истина;
СтруктураJSON = ОбщегоНазначенияБЭД.JSONЗначение(Новый ДвоичныеДанные(РезультатПолученияФайла.Путь));
ОбработанныеСервисы = Новый Массив;
Если СтруктураJSON.Свойство("error") Тогда
Ошибка = ТекстОшибкиЧтениеJSON;
ИначеЕсли СтруктураJSON.Свойство("result") Тогда
Если ТипЗнч(СтруктураJSON.result) = Тип("Массив") Тогда
Для каждого Сервис Из СтруктураJSON.result Цикл
ПредставлениеСервиса = ПроверяемыеСервисы.Получить(Сервис.qu);
Если ПредставлениеСервиса <> Неопределено Тогда
ДобавитьИнформациюОбАктивностиСервиса(АктивностьСервисов,
ПредставлениеСервиса, Сервис.online);
ОбщийРезультат = ОбщийРезультат И Сервис.online;
ОбработанныеСервисы.Добавить(Сервис.qu);
КонецЕсли;
КонецЦикла;
Иначе
Ошибка = ТекстОшибкиЧтениеJSON;
КонецЕсли;
КонецЕсли;
// Считаем, что сервисы, отсутствующие в результатах проверок всегда доступны.
Для каждого ПроверяемыйСервис Из ПроверяемыеСервисы Цикл
Если ОбработанныеСервисы.Найти(ПроверяемыйСервис.Ключ) = Неопределено Тогда
ДобавитьИнформациюОбАктивностиСервиса(АктивностьСервисов,
ПроверяемыйСервис.Значение, Истина);
КонецЕсли;
КонецЦикла;
АктивностьСервисов.Результат = ОбщийРезультат;
Исключение
АктивностьСервисов.Результат = Ложь;
Ошибка = ТекстОшибкиЧтениеJSON;
КонецПопытки;
Иначе
Ошибка = СтрШаблон(ШаблонСообщенияОбОшибке,
НСтр("ru = 'Получение файла из интернета:'"),
РезультатПолученияФайла.СообщениеОбОшибке);
КонецЕсли;
Если Ошибка <> Неопределено Тогда
ЗаписатьОшибкуВЖурналРегистрации(ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение(), Ошибка);
КонецЕсли;
АктивностьСервисов.Рекомендация.Краткая = НСтр("ru = 'Повторите действие позднее.'");
АктивностьСервисов.Рекомендация.Подробная = НСтр("ru = 'Повторите действие позднее.'");
КонецПроцедуры
Процедура ДобавитьИнформациюОбАктивностиСервиса(АктивностьСервисов, Адрес, Активность)
ОписаниеСервиса = Новый Структура;
ОписаниеСервиса.Вставить("Адрес", Адрес);
ОписаниеСервиса.Вставить("Результат", Активность);
АктивностьСервисов.Сервисы.Добавить(ОписаниеСервиса);
КонецПроцедуры
Процедура ДобавитьИнформациюОКорневомСертификатеСервиса(НаличиеКорневыхСертификатов, Адрес, Результат, Сертификаты)
ОписаниеСервиса = Новый Структура;
ОписаниеСервиса.Вставить("Адрес", Адрес);
ОписаниеСервиса.Вставить("Результат", Результат);
ОписаниеСервиса.Вставить("Сертификаты", Сертификаты);
НаличиеКорневыхСертификатов.Сервисы.Добавить(ОписаниеСервиса);
КонецПроцедуры
Процедура ПроверитьДоступностьСервисов(РезультатыДиагностикиСоединения, ПроверяемыеСервисы)
ДоступностьСервисов = РезультатыДиагностикиСоединения.ДоступностьСервисов;
ОбщийРезультат = Истина;
Для каждого Сервис Из ПроверяемыеСервисы Цикл
СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(Сервис.Ключ);
ОписаниеСервера = Новый Структура;
ОписаниеСервера.Вставить("Адрес", СтруктураURI.ИмяСервера);
Если АктивностьСервиса(РезультатыДиагностикиСоединения, СтруктураURI.ИмяСервера) = Ложь Тогда
// Если сервис неактивен, считаем, что он доступен.
ОписаниеСервера.Вставить("Результат", Истина);
Иначе
ОписаниеСервера.Вставить("Результат", ИнтернетРесурсДоступен(СтруктураURI.Схема + "://" + СтруктураURI.ИмяСервера));
КонецЕсли;
ОбщийРезультат = ОбщийРезультат И ОписаниеСервера.Результат <> Ложь;
РезультатыДиагностикиСоединения.ДоступностьСервисов.Сервисы.Добавить(ОписаниеСервера);
КонецЦикла;
ДоступностьСервисов.Результат = ОбщийРезультат;
ДоступностьСервисов.Рекомендация.Краткая = НСтр("ru = 'Обратитесь к администратору'");
ТекстПодробнойОшибки = НСтр("ru = 'На сервере ""%1"" нет доступа к сервисам.
|Возможно, заблокированы порты для доступа к серверам 1С и/или Такском.
|Их доступность необходимо проверить. Также рекомендуем проверить
|правильность настроек прокси-сервера, если он используется
|в сети предприятия.'");
ДоступностьСервисов.Рекомендация.Подробная = СтрШаблон(ТекстПодробнойОшибки, ИмяКомпьютера());
КонецПроцедуры
Процедура ПроверитьКорневыеСертификаты(НаличиеКорневыхСертификатов, ПроверяемыеСервисы, Контекст)
Если ОбщегоНазначения.КлиентПодключенЧерезВебСервер()
Или Контекст.ДанныеКорневыхСертификатов = Неопределено Тогда
Возврат;
КонецЕсли;
МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
Если МенеджерКриптографии = Неопределено И Не ОбщегоНазначения.ЭтоWindowsСервер() Тогда
Возврат;
КонецЕсли;
Если МенеджерКриптографии = Неопределено Тогда
ОписаниеМенеджераКриптографии = ДиагностикаЭДОКлиентСервер.ОписаниеМенеджераКриптографииWindows();
МенеджерКриптографии = Новый МенеджерКриптографии(ОписаниеМенеджераКриптографии.ИмяПрограммы,
ОписаниеМенеджераКриптографии.ПутьКПрограмме, ОписаниеМенеджераКриптографии.ТипПрограммы);
КонецЕсли;
Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.КорневыеСертификаты);
ОбщийРезультат = Истина;
Для каждого ПроверяемыйСервис Из ПроверяемыеСервисы Цикл
СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(ПроверяемыйСервис.Ключ);
СервисБезПути = СтруктураURI.Схема + "://" + СтруктураURI.ИмяСервера;
Сервис = Контекст.ДанныеКорневыхСертификатов["Services"].Получить(СервисБезПути);
Если Сервис <> Неопределено Тогда
Сертификаты = Новый Массив;
РезультатДляСервиса = Истина;
Для каждого Отпечаток Из Сервис["Thumbprints"] Цикл
ОписаниеСертификата = Новый Структура;
ОписаниеСертификата.Вставить("Результат", Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(Отпечаток)) <> Неопределено);
РезультатДляСервиса = РезультатДляСервиса И ОписаниеСертификата.Результат;
Если Не ОписаниеСертификата.Результат Тогда
АдресСертификата = АдресСертификатаПоОтпечатку(Отпечаток);
РезультатЗагрузки = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(АдресСертификата);
Если РезультатЗагрузки.Статус Тогда
Сертификат = ПолучитьИзВременногоХранилища(РезультатЗагрузки.Путь);
УдалитьИзВременногоХранилища(РезультатЗагрузки.Путь);
Иначе
ЗаписатьОшибкуВЖурналРегистрации(ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение(),
РезультатЗагрузки.СообщениеОбОшибке);
Сертификат = Неопределено;
КонецЕсли;
Иначе
Сертификат = Неопределено;
КонецЕсли;
ОписаниеСертификата.Вставить("Сертификат", Сертификат);
Сертификаты.Добавить(ОписаниеСертификата);
КонецЦикла;
ДобавитьИнформациюОКорневомСертификатеСервиса(НаличиеКорневыхСертификатов,
ПредставлениеСервисаЭДО(СервисБезПути), РезультатДляСервиса, Сертификаты);
Иначе
// Считаем, что сертификаты сервисов, отсутствующих в результатах проверок всегда установлены.
РезультатДляСервиса = Истина;
ДобавитьИнформациюОКорневомСертификатеСервиса(НаличиеКорневыхСертификатов,
ПредставлениеСервисаЭДО(СервисБезПути), РезультатДляСервиса, Новый Массив);
КонецЕсли;
ОбщийРезультат = ОбщийРезультат И РезультатДляСервиса;
КонецЦикла;
НаличиеКорневыхСертификатов.Результат = ОбщийРезультат;
Если ДоступнаУстановкаСертификатов() Тогда
КраткаяРекомендация = НСтр("ru = 'Необходимо установить корневые сертификаты.'");
Иначе
КраткаяРекомендация = НСтр("ru = 'Обратитесь к администратору.'");
КонецЕсли;
ПодробнаяРекомендация = НСтр("ru = 'Необходимо установить корневые сертификаты.
|Инструкция по установке: http://1c-edo.ru/handbook/24/2516/'");
НаличиеКорневыхСертификатов.Рекомендация.Краткая = КраткаяРекомендация;
НаличиеКорневыхСертификатов.Рекомендация.Подробная = ПодробнаяРекомендация;
КонецПроцедуры
Функция ИнтернетРесурсДоступен(АдресРесурса)
ОписаниеСоединения = ИнтернетСоединениеБЭД.ОписаниеHTTPСоединения(АдресРесурса, 7);
HTTPЗапрос = Новый HTTPЗапрос("");
КонтекстДиагностики = ОбработкаНеисправностейБЭД.НовыйКонтекстДиагностики();
РезультатВыполненияЗапроса = ИнтернетСоединениеБЭД.ВызватьHTTPМетод(ОписаниеСоединения, HTTPЗапрос,
ИнтернетСоединениеБЭД.HTTPМетоды().HEAD, НСтр("ru = 'Диагностика ЭДО: проверка доступности интернет-ресурса'"),
КонтекстДиагностики);
Результат = РезультатВыполненияЗапроса.Успех;
Возврат Результат;
КонецФункции
Функция АктивностьСервиса(РезультатыДиагностикиСоединения, ИмяСервера)
Активность = Неопределено;
Для каждого Сервис Из РезультатыДиагностикиСоединения.АктивностьСервисов.Сервисы Цикл
Если ВРег(Сервис.Адрес) = ВРег(ИмяСервера) Тогда
Активность = Сервис.Результат;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Активность;
КонецФункции
Функция ОтчетДляАдминистратораИнтернетСоединение(РезультатВидаДиагностики, ПараметрыВыполнения)
ПредставленияПроверок = Новый Массив;
ДобавитьПроверку(ПредставленияПроверок, "НаличиеИнтернетСоединения", НСтр("ru = '* Проверка интернет-соединения'"));
ШаблонТекстСервис = Символы.Таб + НСтр("ru = '%1'");
ВложенныеПроверки = Новый Массив;
Для каждого Сервис Из РезультатВидаДиагностики.Результаты.АктивностьСервисов.Сервисы Цикл
ДобавитьПроверку(ВложенныеПроверки, "АктивностьСервисов", СтрШаблон(ШаблонТекстСервис, Сервис.Адрес),);
КонецЦикла;
ДобавитьПроверку(ПредставленияПроверок, "АктивностьСервисов",
НСтр("ru = '* Проверка активности сервиса'"),, ВложенныеПроверки, "Сервисы");
ВложенныеПроверки = Новый Массив;
Для каждого Сервис Из РезультатВидаДиагностики.Результаты.ДоступностьСервисов.Сервисы Цикл
ДобавитьПроверку(ВложенныеПроверки, "ДоступностьСервисов", СтрШаблон(ШаблонТекстСервис, Сервис.Адрес));
КонецЦикла;
ДобавитьПроверку(ПредставленияПроверок, "ДоступностьСервисов", НСтр("ru = '* Проверка доступа к сервису'"),, ВложенныеПроверки, "Сервисы");
Если РезультатВидаДиагностики.Результаты.НаличиеКорневыхСертификатов.Результат <> Неопределено Тогда
ВложенныеПроверки = Новый Массив;
Для каждого Сервис Из РезультатВидаДиагностики.Результаты.НаличиеКорневыхСертификатов.Сервисы Цикл
ДобавитьПроверку(ВложенныеПроверки, "НаличиеКорневыхСертификатов", СтрШаблон(ШаблонТекстСервис, Сервис.Адрес));
КонецЦикла;
ДобавитьПроверку(ПредставленияПроверок, "НаличиеКорневыхСертификатов",
НСтр("ru = '* Проверка наличия корневого сертификата
|в хранилище операционной системы'"),, ВложенныеПроверки, "Сервисы");
КонецЕсли;
Возврат ОтчетДляАдминистратора(РезультатВидаДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение(), ПараметрыВыполнения, ПредставленияПроверок);
КонецФункции
#КонецОбласти
#Область ДиагностикаКриптографии
// Выполняется диагностика криптографии
//
// Параметры:
// РезультатДиагностики - См. НовыйРезультатДиагностики
// ПараметрыВыполненияДиагностики - см. ДиагностикаЭДОКлиентСервер.НовыеПараметрыВыполненияДиагностики
// Контекст - Структура:
// * ДанныеКорневыхСертификатов - Неопределено, См. ДанныеКорневыхСертификатов
Процедура ДиагностикаКриптографии(РезультатДиагностики, ПараметрыВыполненияДиагностики, Контекст)
ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография();
РезультатДиагностикиКриптографии = Неопределено;
Если Не ЕстьВидДиагностики(РезультатДиагностики, ВидДиагностики, РезультатДиагностикиКриптографии) Тогда
Возврат;
КонецЕсли;
МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
Если ТипЗнч(МенеджерКриптографии) = Тип("МенеджерКриптографии") Тогда
ПараметрыВыполненияДиагностики.ЕстьМенеджерКриптографииНаСервере = Истина;
КонецЕсли;
ЗаполнитьРезультатыПолученияОтпечатков(ПараметрыВыполненияДиагностики);
ОпределитьНаличиеКорневогоСертификатаГУЦ(РезультатДиагностики, ПараметрыВыполненияДиагностики, Контекст);
УчетныеЗаписи = УчетныеЗаписиИзОтбора(ПараметрыВыполненияДиагностики.Отбор.УчетнаяЗапись);
ОпределитьНеполученныеСертификаты(РезультатДиагностики, УчетныеЗаписи);
ОпределитьНепривязанныеСертификатыИНаличиеСертификатов(РезультатДиагностики, ПараметрыВыполненияДиагностики);
ЗаполнитьПаролиСертификатов(РезультатДиагностики, ПараметрыВыполненияДиагностики);
ОпределитьДоступностьСлужбМетокВремени(РезультатДиагностики, ПараметрыВыполненияДиагностики);
ОбщийРезультат = Истина;
Для каждого РезультатВидаДиагностики Из РезультатДиагностикиКриптографии.Результаты Цикл
ОбщийРезультат = ОбщийРезультат И РезультатВидаДиагностики.Значение.Результат <> Ложь;
КонецЦикла;
РезультатДиагностикиКриптографии.Результат = ОбщийРезультат;
Если Не ЗначениеЗаполнено(ПараметрыВыполненияДиагностики.ИмяКомпьютераКлиент) Тогда
РезультатДиагностикиКриптографии.ОтчетДляАдминистратора =
ОтчетДляАдминистратораКриптография(РезультатДиагностикиКриптографии, ПараметрыВыполненияДиагностики);
КонецЕсли;
КонецПроцедуры
Процедура ОпределитьНаличиеКорневогоСертификатаГУЦ(РезультатДиагностики, ПараметрыВыполненияДиагностики, Контекст)
Если Контекст.ДанныеКорневыхСертификатов = Неопределено Тогда
Возврат;
КонецЕсли;
РезультатКриптография = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография());
Для каждого АдресЗагрузки Из Контекст.ДанныеКорневыхСертификатов["MainCertificationCenterCertificates"] Цикл
РезультатЗагрузки = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(АдресЗагрузки);
Если РезультатЗагрузки.Статус Тогда
ТипКонтента = РезультатЗагрузки.Заголовки["Content-Type"];
Если ТипКонтента <> Неопределено И СтрНайти(НРег(ТипКонтента), "text/html") > 0 Тогда // Загрузилась страница с ошибкой
СообщениеОбОшибке = НСтр("ru = 'Не удалось загрузить корневой сертификат по адресу %1'");
ЗаписатьОшибкуВЖурналРегистрации(ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография(),
СтрШаблон(СообщениеОбОшибке, АдресЗагрузки));
Иначе
ДвоичныеДанныеСертификатГУЦ = ПолучитьИзВременногоХранилища(РезультатЗагрузки.Путь);
УдалитьИзВременногоХранилища(РезультатЗагрузки.Путь);
Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификатГУЦ);
Отпечаток = Сертификат.Отпечаток;
ОписаниеСертификата = Новый Структура;
ОписаниеСертификата.Вставить("Сертификат", ДвоичныеДанныеСертификатГУЦ);
ОписаниеСертификата.Вставить("Отпечаток", Отпечаток);
ОписаниеСертификата.Вставить("Результат", Неопределено);
РезультатКриптография.Результаты.НаличиеКорневогоСертификатаГУЦСервер.Сертификаты.Добавить(ОписаниеСертификата);
Если ПараметрыВыполненияДиагностики.ЕстьМенеджерКриптографииНаСервере И ПараметрыВыполненияДиагностики.ЕстьКриптографияНаСервере Тогда
МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
ХранилищеКорневыхСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.КорневыеСертификаты);
СертификатГУЦ = ХранилищеКорневыхСертификатов.НайтиПоОтпечатку(Отпечаток);
ОписаниеСертификата.Вставить("Результат", ТипЗнч(СертификатГУЦ) = Тип("СертификатКриптографии"));
КонецЕсли;
КонецЕсли;
Иначе
ЗаписатьОшибкуВЖурналРегистрации(ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография(),
РезультатЗагрузки.СообщениеОбОшибке);
КонецЕсли;
КонецЦикла;
Если ПараметрыВыполненияДиагностики.ЕстьМенеджерКриптографииНаСервере И ПараметрыВыполненияДиагностики.ЕстьКриптографияНаСервере Тогда
ДиагностикаЭДОКлиентСервер.ЗаполнитьРезультатПроверкиКорневыхСертификатовГУЦ(РезультатКриптография.Результаты.НаличиеКорневогоСертификатаГУЦСервер);
КонецЕсли;
РезультатКриптография.Результаты.НаличиеКорневогоСертификатаГУЦСервер.Рекомендация.Подробная = НСтр("ru = 'Установите корневой сертификат ГУЦ
|Инструкция: http://1c-edo.ru/handbook/28/2655/'");
КонецПроцедуры
Процедура ОпределитьНепривязанныеСертификатыИНаличиеСертификатов(РезультатДиагностики, ПараметрыВыполненияДиагностики)
ЕстьКриптографияНаСервере = ПараметрыВыполненияДиагностики.ЕстьКриптографияНаСервере;
ЕстьКриптографияНаКлиенте = ПараметрыВыполненияДиагностики.ЕстьКриптографияНаКлиенте;
ЕстьМенеджерКриптографииНаСервере = ПараметрыВыполненияДиагностики.ЕстьМенеджерКриптографииНаСервере;
ЕстьМенеджерКриптографииНаКлиенте = ПараметрыВыполненияДиагностики.ЕстьМенеджерКриптографииНаКлиенте;
ТаблицаДоступныхСертификатов = ТаблицаДоступныхСертификатов(ПараметрыВыполненияДиагностики);
ПривязанныеКУчетнымЗаписямСертификаты = ТаблицаДоступныхСертификатов.Скопировать(Новый Структура("ПривязанКУчетнойЗаписи", Истина));
РезультатКриптография = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография());
ВсеОтпечатки = КриптографияБЭД.ПолучитьВсеОтпечаткиСертификатов(
ПараметрыВыполненияДиагностики.РезультатыПолученияОтпечатков);
Для каждого СтрокаТЗ Из ТаблицаДоступныхСертификатов Цикл
Если ВсеОтпечатки.Найти(СтрокаТЗ.Отпечаток) = Неопределено Тогда
РезультатКриптография.СертификатыОтсутствующиеВЛичномХранилище.Добавить(СтрокаТЗ.Ссылка);
КонецЕсли;
КонецЦикла;
Если ТаблицаДоступныхСертификатов.Количество() = 0 Тогда
РезультатКриптография.УчетныеЗаписиБезСертификатов = УчетныеЗаписиБезСертификатов(ВсеОтпечатки);
КонецЕсли;
УчетныеЗаписиБезДоступныхСертификатов = УчетныеЗаписиЭДО.УчетныеЗаписиБезДоступныхСертификатов(ВсеОтпечатки);
РезультатКриптография.ИспользоватьЭлектроннуюПодписьВМоделиСервиса =
КриптографияБЭД.ИспользоватьЭлектроннуюПодписьВМоделиСервиса();
НеоблачныеСертификаты = Новый Массив;
СвойстваСертификатов = КриптографияБЭД.ЭтоСертификатыОблачногоСервиса(
ТаблицаДоступныхСертификатов.ВыгрузитьКолонку("Ссылка"));
Для каждого КлючИЗначение Из СвойстваСертификатов Цикл
Если КлючИЗначение.Значение Тогда
РезультатКриптография.ОблачныеСертификаты.Добавить(КлючИЗначение.Ключ);
Иначе
НеоблачныеСертификаты.Добавить(КлючИЗначение.Ключ);
КонецЕсли;
КонецЦикла;
РезультатКриптография.ЕстьНеоблачныеСертификаты = НеоблачныеСертификаты.Количество() > 0;
Если (ЕстьКриптографияНаСервере И ЕстьМенеджерКриптографииНаСервере)
Или (ЕстьКриптографияНаКлиенте И ЕстьМенеджерКриптографииНаКлиенте) Тогда
РезультатКриптография.Результаты.НаличиеСертификатов.Результат = ТаблицаДоступныхСертификатов.Количество() > 0;
Если РезультатКриптография.Результаты.НаличиеСертификатов.Результат = Ложь
И РезультатДиагностики.Результаты.Криптография.Результаты.НеполученныеСертификаты.Результат = Ложь Тогда
РезультатДиагностики.Результаты.Криптография.Результаты.НеполученныеСертификаты.Результат = Неопределено;
РезультатКриптография.Результаты.НаличиеСертификатов.ВариантСостояния = "ОжидаетсяВыпуск";
КонецЕсли;
КонецЕсли;
РезультатКриптография.Результаты.НаличиеСертификатов.Сертификаты = ТаблицаДоступныхСертификатов.ВыгрузитьКолонку("Ссылка");
ПривязанныеКУчетнымЗаписямСертификаты.Свернуть("Ссылка");
РезультатКриптография.ПривязанныеКУчетнымЗаписямСертификаты = ПривязанныеКУчетнымЗаписямСертификаты.ВыгрузитьКолонку("Ссылка");
НепривязанныеСертификаты = ТаблицаДоступныхСертификатов.НайтиСтроки(
Новый Структура("ТребуетсяПривязкаКУчетнойЗаписи", Истина));
Если УчетныеЗаписиБезДоступныхСертификатов.Количество() Тогда
Для каждого СтрокаТЗ Из НепривязанныеСертификаты Цикл
Если СтрокаТЗ.ОжидаетсяВыпускСертификата Тогда
Продолжить;
КонецЕсли;
РезультатКриптография.Результаты.НепривязанныеСертификаты.Сертификаты.Добавить(СтрокаТЗ.Ссылка);
КонецЦикла;
Если ТаблицаДоступныхСертификатов.Количество() > 0 Тогда
РезультатКриптография.Результаты.НепривязанныеСертификаты.Результат = НепривязанныеСертификаты.Количество() = 0;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПаролиСертификатов(РезультатДиагностики, ПараметрыВыполненияДиагностики)
ВсеОтпечатки = КриптографияБЭД.ПолучитьВсеОтпечаткиСертификатов(
ПараметрыВыполненияДиагностики.РезультатыПолученияОтпечатков);
РезультатКриптография = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография());
Сертификаты = КриптографияБЭД.НайтиСертификаты(ВсеОтпечатки);
УстановитьПривилегированныйРежим(Истина);
ПаролиСертификатов = КриптографияБЭД.ПаролиСертификатов(Сертификаты);
УстановитьПривилегированныйРежим(Ложь);
Для каждого КлючИЗначение Из ПаролиСертификатов Цикл
Если ЗначениеЗаполнено(КлючИЗначение.Значение) Тогда
РезультатКриптография.ПаролиСертификатов.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Определяет заполнены ли адреса служб меток времени и доступны ли они с клиентского компьютера
//
// Параметры:
// РезультатДиагностики - См. НовыйРезультатДиагностики
// ПараметрыВыполненияДиагностики - см. ДиагностикаЭДОКлиентСервер.НовыеПараметрыВыполненияДиагностики
Процедура ОпределитьДоступностьСлужбМетокВремени(РезультатДиагностики, ПараметрыВыполненияДиагностики)
Если Не ПараметрыВыполненияДиагностики.ПараметрыФормы.Свойство("Ошибки")
Или ПараметрыВыполненияДиагностики.ПараметрыФормы.Ошибки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ЕстьТипПодписиСМеткойВремени = Ложь;
МеткаДоверенногоВремениCAdEST = ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.СМеткойДоверенногоВремениCAdEST");
Для Каждого Ошибка Из ПараметрыВыполненияДиагностики.ПараметрыФормы.Ошибки Цикл
Если ТипЗнч(Ошибка.ДополнительныеДанные) = Тип("Структура")
И Ошибка.ДополнительныеДанные.Свойство("ТипПодписи")
И Ошибка.ДополнительныеДанные.ТипПодписи = МеткаДоверенногоВремениCAdEST Тогда
ЕстьТипПодписиСМеткойВремени = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЕстьТипПодписиСМеткойВремени Тогда
Возврат;
КонецЕсли;
РезультатКриптография = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография());
АдресаСерверовМетокВремени = Константы.АдресаСерверовМетокВремени.Получить();
Если Не ПустаяСтрока(АдресаСерверовМетокВремени) Тогда
СлужбыАдресовМетокВремени = СтрРазделить(АдресаСерверовМетокВремени, ", ;" + Символы.ПС);
Иначе
СлужбыАдресовМетокВремени = Новый Массив;
КонецЕсли;
Граница = СлужбыАдресовМетокВремени.ВГраница();
Для Счетчик = 0 По Граница Цикл
ТекущийИндекс = Граница - Счетчик;
СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(СлужбыАдресовМетокВремени[ТекущийИндекс]);
Если СтруктураURI.ИмяСервера = "" Тогда
СлужбыАдресовМетокВремени.Удалить(ТекущийИндекс);
КонецЕсли;
КонецЦикла;
РезультатКриптография.Результаты.АдресаСлужбМетокВремени.Результат = СлужбыАдресовМетокВремени.Количество() > 0;
Для Каждого Строка Из СлужбыАдресовМетокВремени Цикл
Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(Строка);
Если Результат.КодСостояния = 200 Тогда
РезультатКриптография.Результаты.ДоступностьСлужбМетокВремени.Сервисы.Добавить(Строка);
КонецЕсли;
КонецЦикла;
РезультатКриптография.Результаты.ДоступностьСлужбМетокВремени.Результат =
РезультатКриптография.Результаты.ДоступностьСлужбМетокВремени.Сервисы.Количество() > 0;
КонецПроцедуры
Процедура ЗаполнитьРезультатыПолученияОтпечатков(ПараметрыВыполненияДиагностики)
ЕстьКриптографияНаСервере = ПараметрыВыполненияДиагностики.ЕстьКриптографияНаСервере;
ЕстьМенеджерКриптографииНаСервере = ПараметрыВыполненияДиагностики.ЕстьМенеджерКриптографииНаСервере;
Если ЕстьКриптографияНаСервере И ЕстьМенеджерКриптографииНаСервере Тогда
КонтекстДиагностики = ОбработкаНеисправностейБЭД.НовыйКонтекстДиагностики();
ПараметрыВыполненияДиагностики.РезультатыПолученияОтпечатков = КриптографияБЭД.ПолучитьОтпечаткиСертификатов(
НСтр("ru = 'Выполнение диагностики ЭДО'"), КонтекстДиагностики,
ПараметрыВыполненияДиагностики.РезультатыПолученияОтпечатков);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДоступныеУчетныеЗаписи(РезультатДиагностики, ПараметрыВыполненияДиагностики)
ОтборУчетнаяЗапись = ПараметрыВыполненияДиагностики.Отбор.УчетнаяЗапись;
Если ЗначениеЗаполнено(ОтборУчетнаяЗапись) Тогда
РезультатДиагностики.ДоступныеУчетныеЗаписи = УчетныеЗаписиИзОтбора(ОтборУчетнаяЗапись);
Иначе
ОтборСертификатов = КриптографияБЭД.НовыйОтборСертификатов();
ОтборСертификатов.ТолькоДействительные = Ложь;
ОтборСертификатов.ТолькоНепомеченныеНаУдаление = Ложь;
ТаблицаДоступныхСертификатов = ТаблицаДоступныхСертификатов(ПараметрыВыполненияДиагностики, ОтборСертификатов);
Запросы = Новый Массив;
Отбор = СинхронизацияЭДО.НовыйОтборСертификатовУчетныхЗаписей();
Отбор.Сертификат = "&Сертификаты";
ЗапросСертификатовУчетныхЗаписей = СинхронизацияЭДО.ЗапросСертификатовУчетныхЗаписей(
"СертификатыУчетныхЗаписей", Отбор);
Запросы.Добавить(ЗапросСертификатовУчетныхЗаписей);
ЗапросУчетныхЗаписей = СинхронизацияЭДО.ЗапросУчетныхЗаписей("УчетныеЗаписи");
Запросы.Добавить(ЗапросУчетныхЗаписей);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| УчетныеЗаписи.ИдентификаторЭДО КАК ИдентификаторЭДО
|ИЗ
| СертификатыУчетныхЗаписей КАК СертификатыУчетныхЗаписей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ УчетныеЗаписи КАК УчетныеЗаписи
| ПО СертификатыУчетныхЗаписей.ИдентификаторЭДО = УчетныеЗаписи.ИдентификаторЭДО";
ИтоговыйЗапрос = ОбщегоНазначенияБЭД.СоединитьЗапросы(Запрос, Запросы);
ИтоговыйЗапрос.УстановитьПараметр("Сертификаты", ТаблицаДоступныхСертификатов.ВыгрузитьКолонку("Ссылка"));
РезультатЗапроса = ИтоговыйЗапрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
РезультатДиагностики.ДоступныеУчетныеЗаписи.Добавить(ВыборкаДетальныеЗаписи.ИдентификаторЭДО);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция УчетныеЗаписиБезСертификатов(Отпечатки)
ПользователиДоступныхСертификатов = Новый Массив;
ПользователиДоступныхСертификатов.Добавить(Пользователи.АвторизованныйПользователь());
ПользователиДоступныхСертификатов.Добавить(Справочники.Пользователи.ПустаяСсылка());
ПользователиДоступныхСертификатов.Добавить(Пользователи.СсылкаНеуказанногоПользователя());
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| УчетныеЗаписиЭДО.ИдентификаторЭДО КАК ИдентификаторЭДО,
| СертификатыКлючейЭлектроннойПодписиИШифрования.Пользователь КАК Пользователь,
| СертификатыКлючейЭлектроннойПодписиИШифрования.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| РегистрСведений.УчетныеЗаписиЭДО КАК УчетныеЗаписиЭДО
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СертификатыУчетныхЗаписейЭДО КАК СертификатыУчетныхЗаписейЭДО
| ПО УчетныеЗаписиЭДО.ИдентификаторЭДО = СертификатыУчетныхЗаписейЭДО.ИдентификаторЭДО
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК СертификатыКлючейЭлектроннойПодписиИШифрования
| ПО (СертификатыУчетныхЗаписейЭДО.Сертификат = СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка)
|ГДЕ
| СертификатыКлючейЭлектроннойПодписиИШифрования.Отпечаток В(&Отпечатки)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| УчетныеЗаписиЭДО.ИдентификаторЭДО,
| НЕОПРЕДЕЛЕНО,
| ИСТИНА
|ИЗ
| РегистрСведений.УчетныеЗаписиЭДО КАК УчетныеЗаписиЭДО
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СертификатыУчетныхЗаписейЭДО КАК СертификатыУчетныхЗаписейЭДО
| ПО УчетныеЗаписиЭДО.ИдентификаторЭДО = СертификатыУчетныхЗаписейЭДО.ИдентификаторЭДО
|ГДЕ
| СертификатыУчетныхЗаписейЭДО.ИдентификаторЭДО ЕСТЬ NULL
|ИТОГИ ПО
| ИдентификаторЭДО";
Запрос.УстановитьПараметр("Отпечатки", Отпечатки);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаИдентификаторЭДО = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
УчетныеЗаписиБезСертификатов = Новый Массив;
Пока ВыборкаИдентификаторЭДО.Следующий() Цикл
ВыборкаДетальныеЗаписи = ВыборкаИдентификаторЭДО.Выбрать();
ЕстьСертификат = Ложь;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ПользователиДоступныхСертификатов.Найти(ВыборкаДетальныеЗаписи.Пользователь) <> Неопределено
И Не ВыборкаДетальныеЗаписи.ПометкаУдаления Тогда
ЕстьСертификат = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЕстьСертификат Тогда
УчетныеЗаписиБезСертификатов.Добавить(ВыборкаИдентификаторЭДО.ИдентификаторЭДО);
КонецЕсли;
КонецЦикла;
Возврат УчетныеЗаписиБезСертификатов;
КонецФункции
Процедура ОпределитьНеполученныеСертификаты(РезультатДиагностики, УчетныеЗаписи)
Запросы = Новый Массив;
ЗапросНеполученныхСертификатов = КриптографияБЭД.ЗапросНеполученныхСертификатов("Сертификаты");
Запросы.Добавить(ЗапросНеполученныхСертификатов);
ЗапросУчетныхЗаписей = СинхронизацияЭДО.ЗапросУчетныхЗаписей("УчетныеЗаписиЭДО");
Запросы.Добавить(ЗапросУчетныхЗаписей);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сертификаты.Ссылка КАК Ссылка
|ИЗ
| Сертификаты КАК Сертификаты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ УчетныеЗаписиЭДО КАК УчетныеЗаписиЭДО
| ПО Сертификаты.Организация = УчетныеЗаписиЭДО.Организация
| И (НЕ &ЕстьОтборПоИдентификаторам
| ИЛИ УчетныеЗаписиЭДО.ИдентификаторЭДО В (&ИдентификаторыЭДО))";
ИтоговыйЗапрос = ОбщегоНазначенияБЭД.СоединитьЗапросы(Запрос, Запросы);
ИтоговыйЗапрос.УстановитьПараметр("ИдентификаторыЭДО", УчетныеЗаписи);
ИтоговыйЗапрос.УстановитьПараметр("ЕстьОтборПоИдентификаторам", УчетныеЗаписи.Количество() > 0);
РезультатЗапроса = ИтоговыйЗапрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
РезультатДиагностики.Результаты.Криптография.Результаты.НеполученныеСертификаты.Сертификаты.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
РезультатДиагностики.Результаты.Криптография.Результаты.НеполученныеСертификаты.Результат =
РезультатДиагностики.Результаты.Криптография.Результаты.НеполученныеСертификаты.Сертификаты.Количество() = 0;
КонецПроцедуры
#Область ОтчетДляАдминистратораКриптография
// Параметры:
// РезультатДиагностикиКриптографии - См. ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики
// ПараметрыВыполнения - Структура:
// * ИнформационнаяБазаФайловая - Строка
// * ИмяКомпьютераКлиент - Строка
//
// Возвращаемое значение:
// Структура:
// * Заголовок - Строка
// * Текст - Строка
Функция ОтчетДляАдминистратораКриптография(РезультатДиагностикиКриптографии, ПараметрыВыполнения) Экспорт
ПредставленияПроверок = Новый Массив;
ВложенныеПроверки = Новый Массив;
МассивРезультатовПроверок = Новый Массив;
Для каждого КлючИЗначение Из РезультатДиагностикиКриптографии.Результаты.ПроверкиСертификатов.Сертификаты Цикл
МассивРезультатовПроверок.Добавить(КлючИЗначение.Значение);
КонецЦикла;
Для каждого КлючИЗначение Из РезультатДиагностикиКриптографии.Результаты.ПроверкиСертификатов.Сертификаты Цикл
ДобавитьПроверкиСертификата(ВложенныеПроверки, КлючИЗначение.Значение.ПроверкиНаКлиенте,
КлючИЗначение.Ключ, Истина);
ДобавитьПроверкиСертификата(ВложенныеПроверки, КлючИЗначение.Значение.ПроверкиНаСервере,
КлючИЗначение.Ключ, Ложь);
КонецЦикла;
ДобавитьПроверку(ПредставленияПроверок, "НаличиеПрограммыКриптографииКлиент",
НСтр("ru = '* Проверка программы криптографии (клиент)'"));
ДобавитьПроверку(ПредставленияПроверок, "НаличиеПрограммыКриптографииСервер",
НСтр("ru = '* Проверка программы криптографии (сервер)'"));
ДобавитьПроверку(ПредставленияПроверок, "НаличиеКорневогоСертификатаГУЦКлиент",
НСтр("ru = '* Проверка наличия корневого сертификата ГУЦ
|в хранилище операционной системы (клиент)'"));
ДобавитьПроверку(ПредставленияПроверок,"НаличиеКорневогоСертификатаГУЦСервер",
НСтр("ru = '* Проверка наличия корневого сертификата ГУЦ
|в хранилище операционной системы (сервер)'"));
ДобавитьПроверку(ПредставленияПроверок, "НаличиеСертификатов",
НСтр("ru = '* Проверка наличия сертификатов'"));
ДобавитьПроверку(ПредставленияПроверок, "НеполученныеСертификаты",
НСтр("ru = '* Проверка наличия неполученных сертификатов'"));
ДобавитьПроверку(ПредставленияПроверок, "НепривязанныеСертификаты",
НСтр("ru = '* Проверка наличия сертификатов, непривязанных к учетным записям'"));
ДобавитьПроверку(ПредставленияПроверок, "ПроверкиСертификатов",
НСтр("ru = '* Проверка наличия ошибок сертификатов'"),, ВложенныеПроверки, "Сертификаты");
ДобавитьПроверку(ПредставленияПроверок, "АдресаСлужбМетокВремени",
НСтр("ru = '* Проверка заполнения адресов меток времени'"));
ДобавитьПроверку(ПредставленияПроверок, "ДоступностьСлужбМетокВремени",
НСтр("ru = '* Проверка доступности серверов меток времени'"));
Возврат ОтчетДляАдминистратора(РезультатДиагностикиКриптографии,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография(),
ПараметрыВыполнения, ПредставленияПроверок);
КонецФункции
Процедура ДобавитьПроверкиСертификата(ВложенныеПроверки, КоллекцияПроверок, Сертификат, КлиентскиеПроверки)
Если КоллекцияПроверок <> Неопределено Тогда
Если КлиентскиеПроверки Тогда
ШаблонПервойПроверки = НСтр("ru = '%1 * %2
|%3 На клиенте'");
Иначе
ШаблонПервойПроверки = НСтр("ru = '%1 * %2
|%3 На сервере'");
КонецЕсли;
ПредставлениеПервойПроверки = СтрШаблон(ШаблонПервойПроверки, Символы.ПС + Символы.Таб, Сертификат, Символы.Таб);
Сч = 0;
Для каждого КлючИЗначениеПроверка Из КоллекцияПроверок Цикл
Если СтрЗаканчиваетсяНа(КлючИЗначениеПроверка.Ключ, "Ошибка") Тогда
Продолжить;
КонецЕсли;
ПредставлениеПроверки = ПредставлениеПроверкиСертификата(КлючИЗначениеПроверка.Ключ);
Если Сч = 0 Тогда
ПредставлениеПроверки = ПредставлениеПервойПроверки + Символы.ПС + ПредставлениеПроверки
КонецЕсли;
Рекомендация = НоваяРекомендация();
Рекомендация.Отступ = ОтступПроверокСертификата() + " ";
ОшибкаПоКлассификатору = ЭлектроннаяПодпись.ОшибкаПоКлассификатору(
КоллекцияПроверок[КлючИЗначениеПроверка.Ключ + "Ошибка"]);
Если ОшибкаПоКлассификатору <> Неопределено Тогда
Если ЗначениеЗаполнено(ОшибкаПоКлассификатору.Решение) Тогда
Рекомендация.Подробная = ОшибкаПоКлассификатору.Решение;
КонецЕсли;
КонецЕсли;
РезультатПроверки = Новый Структура;
РезультатПроверки.Вставить("Результат", КлючИЗначениеПроверка.Значение);
РезультатПроверки.Вставить("Рекомендация", Рекомендация);
ДобавитьПроверку(ВложенныеПроверки, "ОшибкиСертификатов", ПредставлениеПроверки,
РезультатПроверки);
Сч = Сч + 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ПредставлениеПроверкиСертификата(ЗначениеПроверки)
ПредставленияПроверок = Новый Соответствие;
ПредставленияПроверок.Вставить("НаличиеСертификата", НСтр("ru = 'Проверка наличия сертификата в личном списке'"));
ПредставленияПроверок.Вставить("ДанныеСертификата", НСтр("ru = 'Проверка корректности данных сертификата'"));
ПредставленияПроверок.Вставить("НаличиеПрограммы", НСтр("ru = 'Проверка наличия программы для подписания и расшифровки'"));
ПредставленияПроверок.Вставить("Подписание", НСтр("ru = 'Проверка подписания данных'"));
ПредставленияПроверок.Вставить("ПроверкаПодписи", НСтр("ru = 'Проверка созданной подписи'"));
ПредставленияПроверок.Вставить("Шифрование", НСтр("ru = 'Проверка шифрования данных'"));
ПредставленияПроверок.Вставить("Расшифровка", НСтр("ru = 'Проверка расшифровки данных'"));
ПредставленияПроверок.Вставить("ЗаконныйСертификат", НСтр("ru = 'Проверка наличия в описании субъекта сертификата поля ""SN""'"));
ПредставлениеПроверки = ПредставленияПроверок[ЗначениеПроверки];
Если Не ЗначениеЗаполнено(ПредставлениеПроверки) Тогда
ПредставлениеПроверки = ЗначениеПроверки;
КонецЕсли;
Возврат ОтступПроверокСертификата() + ПредставлениеПроверки;
КонецФункции
Функция ОтступПроверокСертификата()
Возврат Символы.Таб + Символы.Таб;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область ДиагностикаИнтернетПоддержки
Процедура ДиагностикаИнтернетПоддержки(РезультатДиагностики, ПараметрыВыполненияДиагностики, Контекст)
ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетПоддержка();
РезультатДиагностикиИнтернетПоддержки = Неопределено;
Если Не ЕстьВидДиагностики(РезультатДиагностики, ВидДиагностики, РезультатДиагностикиИнтернетПоддержки) Тогда
Возврат;
КонецЕсли;
ПроверитьВнедрениеБИП(РезультатДиагностики, ПараметрыВыполненияДиагностики);
ПроверитьПравильностьЛогинаПароля(РезультатДиагностики, ПараметрыВыполненияДиагностики);
ОбщийРезультат = Истина;
Для каждого РезультатВидаДиагностики Из РезультатДиагностикиИнтернетПоддержки.Результаты Цикл
ОбщийРезультат = ОбщийРезультат И РезультатВидаДиагностики.Значение.Результат;
КонецЦикла;
РезультатДиагностикиИнтернетПоддержки.Результат = ОбщийРезультат;
РезультатДиагностикиИнтернетПоддержки.ОтчетДляАдминистратора =
ОтчетДляАдминистратораИнтернетПоддержка(РезультатДиагностикиИнтернетПоддержки, ПараметрыВыполненияДиагностики);
КонецПроцедуры
Процедура ПроверитьВнедрениеБИП(РезультатДиагностики, ПараметрыВыполненияДиагностики)
РезультатИнтернетПоддержка = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетПоддержка());
РезультатИнтернетПоддержка.Результаты.ВнедрениеБИП.Результат = ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей");
РезультатИнтернетПоддержка.Результаты.ВнедрениеБИП.Рекомендация.Подробная = НСтр("ru = 'Внедрите в конфигурацию библиотеку интернет-поддержки.
|Инструкция: https://its.1c.ru/db/uisldoc'");
КонецПроцедуры
Процедура ПроверитьПравильностьЛогинаПароля(РезультатДиагностики, ПараметрыВыполненияДиагностики)
Если Не ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
Возврат;
КонецЕсли;
РезультатИнтернетПоддержка = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетПоддержка());
УстановитьПривилегированныйРежим(Истина);
Результат = ИнтернетПоддержкаПользователей.ТикетАутентификацииНаПорталеПоддержки("1C-EDO");
УстановитьПривилегированныйРежим(Ложь);
Если ЗначениеЗаполнено(Результат.КодОшибки) И Результат.КодОшибки = "НеверныйЛогинИлиПароль" Тогда
РезультатИнтернетПоддержка.Результаты.КорректностьДанныхИнтернетПоддержки.Результат = Ложь;
РезультатИнтернетПоддержка.Результаты.КорректностьДанныхИнтернетПоддержки.Рекомендация.Подробная = НСтр("ru = 'Введите корректные данные интернет-поддержки.
|Инструкция: https://its.1c.ru/db/uisldoc#content:172:hdoc:issogl2_подключение_интернет-поддержки'");
Иначе
РезультатИнтернетПоддержка.Результаты.КорректностьДанныхИнтернетПоддержки.Результат = Истина;
КонецЕсли;
КонецПроцедуры
Функция ОтчетДляАдминистратораИнтернетПоддержка(РезультатВидаДиагностики, ПараметрыВыполнения)
ПредставленияПроверок = Новый Массив;
ДобавитьПроверку(ПредставленияПроверок, "ВнедрениеБИП", НСтр("ru = '* Проверка наличия библиотеки интернет-поддержки в конфигурации'"));
ДобавитьПроверку(ПредставленияПроверок, "КорректностьДанныхИнтернетПоддержки",
НСтр("ru = '* Проверка правильности логина/пароля интернет-поддержки'"));
Возврат ОтчетДляАдминистратора(РезультатВидаДиагностики, ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетПоддержка(),
ПараметрыВыполнения, ПредставленияПроверок);
КонецФункции
#КонецОбласти
#Область ДиагностикаРаботыСФайлами
Процедура ДиагностикаРаботыСФайлами(РезультатДиагностики, ПараметрыВыполненияДиагностики, Контекст)
ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиРаботаСФайлами();
РезультатДиагностикиРаботыСФайлами = Неопределено;
Если Не ЕстьВидДиагностики(РезультатДиагностики, ВидДиагностики, РезультатДиагностикиРаботыСФайлами) Тогда
Возврат;
КонецЕсли;
ПроверитьДлинуПутиКаталогаВременныхФайлов(РезультатДиагностики, ПараметрыВыполненияДиагностики);
ОбщийРезультат = Истина;
Для каждого РезультатВидаДиагностики Из РезультатДиагностикиРаботыСФайлами.Результаты Цикл
ОбщийРезультат = ОбщийРезультат И РезультатВидаДиагностики.Значение.Результат;
КонецЦикла;
РезультатДиагностикиРаботыСФайлами.Результат = ОбщийРезультат;
РезультатДиагностикиРаботыСФайлами.ОтчетДляАдминистратора =
ОтчетДляАдминистратораРаботаСФайлами(РезультатДиагностикиРаботыСФайлами, ПараметрыВыполненияДиагностики);
КонецПроцедуры
Процедура ПроверитьДлинуПутиКаталогаВременныхФайлов(РезультатДиагностики, ПараметрыВыполненияДиагностики)
РезультатРаботаСФайлами = ДиагностикаЭДОКлиентСервер.РезультатВидаДиагностики(РезультатДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиРаботаСФайлами());
МаксимальнаяДопустимаяДлинаПути = 256;
ДлинаПутиКФайлу = РезультатРаботаСФайлами.Результаты.ДлинаПутиКФайлу;
Если ПараметрыВыполненияДиагностики.ДиагностикаРаботыСФайламиВРежимеОтображенияРезультата Тогда
ДлинаПутиКФайлу.Результат = Ложь;
Иначе
// На примере файла:
// ON_KORSCHFDOPPOKMARK_2AEA1A8BC27-E950-4E6A-AA04-D54BF4DFCBCA_2AE4DF1667F-1E85-4E3D-8D2F-C10B9A232503_20190801_e2296ada-b46c-11e9-87e2-b06ebf2faeb9-1.p7s
МаксимальнаяДлинаИмениФайла = 152;
Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
// Допустимая длина пути в Linux составляет 4096 байт с использованием кодировки utf-8, т.к. один символ
// в данной кодировке может занимать от 1 до 4 байт, то в самом пессимистичном варианте это 1024 символа.
МаксимальнаяДопустимаяДлинаПути = 1024;
КонецЕсли;
ДлинаПутиКФайлу.Результат =
СтрДлина(КаталогВременныхФайлов()) < МаксимальнаяДопустимаяДлинаПути - МаксимальнаяДлинаИмениФайла;
КонецЕсли;
ДлинаПутиКФайлу.Рекомендация.Подробная = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Путь к файлам в каталоге временных файлов должен быть короче %1 символов.
|В настройках операционной системы, в переменных среды, измените путь
|к временным файлам на более короткий.'"),
Формат(МаксимальнаяДопустимаяДлинаПути, "ЧГ=0"));
КонецПроцедуры
Функция ОтчетДляАдминистратораРаботаСФайлами(РезультатВидаДиагностики, ПараметрыВыполнения)
ПредставленияПроверок = Новый Массив;
ДобавитьПроверку(ПредставленияПроверок, "ДлинаПутиКФайлу", НСтр("ru = '* Проверка длины пути к файлу в каталоге временных файлов'"));
Возврат ОтчетДляАдминистратора(РезультатВидаДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиРаботаСФайлами(), ПараметрыВыполнения, ПредставленияПроверок);
КонецФункции
#КонецОбласти
#Область ТестАутентификации
Функция ОтчетДляАдминистратораТестАутентификации(РезультатВидаДиагностики, ПараметрыВыполнения) Экспорт
ПредставленияПроверок = Новый Массив;
Если РезультатВидаДиагностики.Результаты.ТестАутентификации.Результат Тогда
ДобавитьПроверку(ПредставленияПроверок, "ТестАутентификации", НСтр("ru = '* Тест аутентификации'"));
Иначе
Для каждого ОписаниеУчетнойЗаписи Из РезультатВидаДиагностики.Результаты.ТестАутентификации.УчетныеЗаписи Цикл
ШаблонПроверки = НСтр("ru = '* Тест аутентификации %1'");
ПредставлениеПроверки = СтрШаблон(ШаблонПроверки, ОписаниеУчетнойЗаписи.УчетнаяЗапись);
ДобавитьПроверку(ПредставленияПроверок, "ТестАутентификации", ПредставлениеПроверки);
КонецЦикла;
КонецЕсли;
Возврат ОтчетДляАдминистратора(РезультатВидаДиагностики,
ДиагностикаЭДОКлиентСервер.ВидДиагностикиТестАутентификации(), ПараметрыВыполнения, ПредставленияПроверок);
КонецФункции
#КонецОбласти
#Область РезультатДиагностики
// Возвращает результат диагностики электронного документооборота.
//
// Параметры:
// ВидыДиагностики - Массив из Строка - виды диагностики, см. область ВидыДиагностики общего
// модуля ДиагностикаЭДОКлиентСервер.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево - истина, если все виды диагностики выполнены успешно.
// * Результаты - Структура - результаты диагностики:
// ** Ключ - Строка - вид диагностики.
// ** Значение - Структура - результат вида диагностики, см. НовыйРезультатВидаДиагностики.
//
Функция НовыйРезультатДиагностики(ВидыДиагностики)
Результат = Новый Структура;
Результат.Вставить("Результат", Ложь);
Результаты = Новый Структура;
Для каждого ВидДиагностики Из ПоддерживаемыеВидыДиагностики() Цикл
Если ДиагностикаЭДОКлиентСервер.ЕстьВидДиагностики(ВидыДиагностики, ВидДиагностики) Тогда
Результаты.Вставить(ВидДиагностики, НовыйРезультатВидаДиагностики(ВидДиагностики));
КонецЕсли;
КонецЦикла;
Результат.Вставить("Результаты", Результаты);
Результат.Вставить("ДоступныеУчетныеЗаписи", Новый Массив);
Результат.Вставить("ДанныеУчетныхЗаписей", Новый Соответствие);
Возврат Результат;
КонецФункции
// Возвращает результат вида диагностики электронного документооборота.
//
// Параметры:
// ВидДиагностики - Строка - виды диагностики, см. область ВидыДиагностики общего
// модуля ДиагностикаЭДОКлиентСервер.
//
// Возвращаемое значение:
// - Структура - см. НовыйРезультатДиагностикиСоединения.
// - Структура - см. НовыйРезультатДиагностикиКриптографии.
// - Структура - см. НовыйРезультатДиагностикиИнтернетПоддержки.
// - Структура - см. НовыйРезультатДиагностикиРаботыСФайлами.
//
Функция НовыйРезультатВидаДиагностики(ВидДиагностики)
Если ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение() Тогда
Возврат НовыйРезультатДиагностикиСоединения();
ИначеЕсли ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография() Тогда
Возврат НовыйРезультатДиагностикиКриптографии();
ИначеЕсли ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетПоддержка() Тогда
Возврат НовыйРезультатДиагностикиИнтернетПоддержки();
ИначеЕсли ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиРаботаСФайлами() Тогда
Возврат НовыйРезультатДиагностикиРаботыСФайлами();
ИначеЕсли ВидДиагностики = ДиагностикаЭДОКлиентСервер.ВидДиагностикиТестАутентификации() Тогда
Возврат НовыйРезультатДиагностикиТестАутентификации();
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Возвращает результат диагностики интернет-соединения.
//
// Возвращаемое значение:
// Структура - со свойствами:
// * Результат - Булево - истина, если диагностика интернет-соединения выполнена успешно.
// * Результаты - Структура - где:
// ** Ключ - Строка - вид выполненной проверки.
// ** Значение - см. НовыйРезультатНаличиеИнтернетСоединения.
// - см. НовыйРезультатДиагностикиСервисов.
// * ОтчетДляАдминистратора - см. НовыйОтчетДляАдминистратора.
//
Функция НовыйРезультатДиагностикиСоединения()
Результат = Новый Структура;
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОтчетДляАдминистратора", НовыйОтчетДляАдминистратора());
Результаты = Новый Структура;
Результаты.Вставить("НаличиеИнтернетСоединения", НовыйРезультатНаличиеИнтернетСоединения());
Результаты.Вставить("АктивностьСервисов", НовыйРезультатДиагностикиСервисов());
Результаты.Вставить("ДоступностьСервисов", НовыйРезультатДиагностикиСервисов());
Результаты.Вставить("НаличиеКорневыхСертификатов", НовыйРезультатДиагностикиСервисов());
Результат.Вставить("Результаты", Результаты);
Возврат Результат;
КонецФункции
// Возвращает результат диагностики криптографии.
//
// Возвращаемое значение:
// Структура - со свойствами:
// * Результат - Булево - истина, если диагностика криптографии выполнена успешно.
// * Результаты - Структура - где:
// ** Ключ - Строка - вид выполненной проверки.
// ** Значение - см. НовыйРезультатНаличиеПрограммыКриптографии.
// - см. НовыйРезультатНаличиеКорневогоСертификатаГУЦ.
// - см. НовоеОписаниеРезультатаССертификатами.
// * ОтчетДляАдминистратора - см. НовыйОтчетДляАдминистратора.
//
Функция НовыйРезультатДиагностикиКриптографии()
Результат = Новый Структура;
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОтчетДляАдминистратора", НовыйОтчетДляАдминистратора());
Результат.Вставить("СертификатыСУстановленнымиПаролями", Новый Массив);
Результат.Вставить("УчетныеЗаписиБезСертификатов", Новый Массив);
Результат.Вставить("СертификатыОтсутствующиеВЛичномХранилище", Новый Массив);
Результат.Вставить("ИспользоватьЭлектроннуюПодписьВМоделиСервиса", Ложь);
Результат.Вставить("ЕстьНеоблачныеСертификаты", Ложь);
Результат.Вставить("ОблачныеСертификаты", Новый Массив);
Результат.Вставить("ПаролиСертификатов", Новый Соответствие);
Результат.Вставить("ПривязанныеКУчетнымЗаписямСертификаты", Новый Массив);
Результаты = Новый Структура;
Результаты.Вставить("НаличиеПрограммыКриптографииКлиент", НовыйРезультатНаличиеПрограммыКриптографии());
Результаты.Вставить("НаличиеПрограммыКриптографииСервер", НовыйРезультатНаличиеПрограммыКриптографии());
Результаты.Вставить("НаличиеКорневогоСертификатаГУЦКлиент", НовыйРезультатНаличиеКорневогоСертификатаГУЦ());
Результаты.Вставить("НаличиеКорневогоСертификатаГУЦСервер", НовыйРезультатНаличиеКорневогоСертификатаГУЦ());
Результаты.Вставить("АдресаСлужбМетокВремени", НовыйРезультатПроверки());
Результаты.Вставить("ДоступностьСлужбМетокВремени", НовыйРезультатДиагностикиСервисов());
НаличиеСертификатов = НовоеОписаниеРезультатаССертификатами();
НаличиеСертификатов.Вставить("ВариантСостояния", "");
НаличиеСертификатов.Вставить("УчетныеЗаписиБезОграниченияПоПользователюСертификата", Новый Массив);
Результаты.Вставить("НаличиеСертификатов", НаличиеСертификатов);
Результаты.Вставить("НеполученныеСертификаты", НовоеОписаниеРезультатаССертификатами());
Результаты.Вставить("НепривязанныеСертификаты", НовоеОписаниеРезультатаССертификатами());
Результаты.Вставить("ПроверкиСертификатов", НовоеОписаниеРезультатаССертификатами(Истина));
Результат.Вставить("Результаты", Результаты);
Возврат Результат;
КонецФункции
// Возвращает результат диагностики работы с файлами.
//
// Возвращаемое значение:
// Структура - со свойствами:
// * Результат - Булево - истина, если диагностика работы с файлами выполнена успешно.
// * Результаты - Структура - где:
// ** Ключ - Строка - вид выполненной проверки.
// ** Значение - см. НовыйРезультатПроверки.
// * ОтчетДляАдминистратора - см. НовыйОтчетДляАдминистратора.
//
Функция НовыйРезультатДиагностикиРаботыСФайлами()
Результат = Новый Структура;
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОтчетДляАдминистратора", НовыйОтчетДляАдминистратора());
Результаты = Новый Структура;
Результаты.Вставить("ДлинаПутиКФайлу", НовыйРезультатПроверки());
Результат.Вставить("Результаты", Результаты);
Возврат Результат;
КонецФункции
// Возвращает результат диагностики интернет-поддержки.
//
// Возвращаемое значение:
// Структура - со свойствами:
// * Результат - Булево - истина, если диагностика интернет-поддержки выполнена успешно.
// * Результаты - Структура - где:
// ** Ключ - Строка - вид выполненной проверки.
// ** Значение - см. НовыйРезультатПроверки.
// * ОтчетДляАдминистратора - см. НовыйОтчетДляАдминистратора.
//
Функция НовыйРезультатДиагностикиИнтернетПоддержки()
Результат = Новый Структура;
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОтчетДляАдминистратора", НовыйОтчетДляАдминистратора());
Результаты = Новый Структура;
Результаты.Вставить("ВнедрениеБИП", НовыйРезультатПроверки());
Результаты.Вставить("КорректностьДанныхИнтернетПоддержки", НовыйРезультатПроверки());
Результат.Вставить("Результаты", Результаты);
Возврат Результат;
КонецФункции
// Возвращает результат теста аутентификации.
//
// Возвращаемое значение:
// Структура - со свойствами:
// * Результат - Булево - истина, если тест аутентификации выполнен успешно.
// * Результаты - Структура - где:
// ** Ключ - Строка - вид выполненной проверки.
// ** Значение - см. НовыйРезультатПроверки.
// * ОтчетДляАдминистратора - см. НовыйОтчетДляАдминистратора.
//
Функция НовыйРезультатДиагностикиТестАутентификации()
Результат = Новый Структура;
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОтчетДляАдминистратора", НовыйОтчетДляАдминистратора());
Результаты = Новый Структура;
РезультатПроверки = НовыйРезультатПроверки();
РезультатПроверки.Вставить("УчетныеЗаписи", Новый Массив);
Результаты.Вставить("ТестАутентификации", РезультатПроверки);
Результат.Вставить("Результаты", Результаты);
Возврат Результат;
КонецФункции
// Инициализирует результат проверки.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево, Неопределено - результат выполнения проверки. Если Неопределено - проверка не выполнялась.
// * Рекомендация - см. НоваяРекомендация.
//
Функция НовыйРезультатПроверки()
РезультатПроверки = Новый Структура;
РезультатПроверки.Вставить("Результат", Неопределено);
РезультатПроверки.Вставить("Рекомендация", НоваяРекомендация());
Возврат РезультатПроверки;
КонецФункции
// Инициализирует результат проверки наличия интернет-соединения.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево, Неопределено - результат выполнения проверки. Если Неопределено - проверка не выполнялась.
// * Рекомендация - см. НоваяРекомендация.
//
Функция НовыйРезультатНаличиеИнтернетСоединения()
Результат = Новый Структура;
Результат.Вставить("Результат", Неопределено);
Результат.Вставить("Рекомендация", НоваяРекомендация());
Возврат Результат;
КонецФункции
// Инициализирует результат диагностики сервисов.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево, Неопределено - результат диагностики проверки. Если Неопределено - диагностика не выполнялась.
// * Сервисы - Массив из Структура - описание проверяемых сервисов.
// * Рекомендация - см. НоваяРекомендация.
//
Функция НовыйРезультатДиагностикиСервисов()
Результат = Новый Структура;
Результат.Вставить("Результат", Неопределено);
Результат.Вставить("Сервисы", Новый Массив);
Результат.Вставить("Рекомендация", НоваяРекомендация());
Возврат Результат;
КонецФункции
// Инициализирует результат проверки наличия программы криптографии.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево, Неопределено - результат выполнения проверки. Если Неопределено - проверка не выполнялась.
// * Рекомендация - см. НоваяРекомендация.
//
Функция НовыйРезультатНаличиеПрограммыКриптографии()
Результат = Новый Структура;
Результат.Вставить("Результат", Неопределено);
Результат.Вставить("Рекомендация", НоваяРекомендация());
Возврат Результат;
КонецФункции
// Инициализирует результат проверки наличия корневого сертификата головного удостоверяющего центра.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево, Неопределено - результат выполнения проверки. Если Неопределено - проверка не выполнялась.
// * Сертификаты - Массив Из ДвоичныеДанные ,Неопределено - корневой сертификат головного удостоверяющего центра.
// * Рекомендация - см. НоваяРекомендация.
//
Функция НовыйРезультатНаличиеКорневогоСертификатаГУЦ()
Результат = Новый Структура;
Результат.Вставить("Результат", Неопределено);
Результат.Вставить("Сертификаты", Новый Массив);
Результат.Вставить("Рекомендация", НоваяРекомендация());
Возврат Результат;
КонецФункции
// Инициализирует описание результата проверки.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Результат - Булево, Неопределено - результат выполнения проверки. Если Неопределено - проверка не выполнялась.
// * Сертификаты - Соответствие Из КлючИЗначение,
// - Массив Из ДвоичныеДанные - сертификаты.
// * Рекомендация - см. НоваяРекомендация.
//
Функция НовоеОписаниеРезультатаССертификатами(ИспользоватьСоответствие = Ложь)
Результат = Новый Структура;
Результат.Вставить("Результат", Неопределено);
Результат.Вставить("Сертификаты", ?(ИспользоватьСоответствие, Новый Соответствие, Новый Массив));
Результат.Вставить("Рекомендация", НоваяРекомендация());
Возврат Результат;
КонецФункции
// Возвращает рекомендацию.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Краткая - Строка - краткая рекомендация для пользователя.
// * Подробная - Строка - подробная рекомендация для администратора.
// * Отступ - Строка - будет добавлен в отчет перед заголовком и текстом рекомендации.
//
Функция НоваяРекомендация()
Рекомендация = Новый Структура;
Рекомендация.Вставить("Краткая", "");
Рекомендация.Вставить("Подробная", "");
Рекомендация.Вставить("Отступ", "");
Возврат Рекомендация;
КонецФункции
// Возвращает отчет для администратора.
//
// Возвращаемое значение:
// Структура - с ключами:
// * Текст - Строка - подробный отчет с результатами диагностики.
// * Заголовок - Строка - заголовок отчета.
//
Функция НовыйОтчетДляАдминистратора()
НовыйОтчетДляАдминистратора = Новый Структура();
НовыйОтчетДляАдминистратора.Вставить("Текст", "");
НовыйОтчетДляАдминистратора.Вставить("Заголовок", "");
Возврат НовыйОтчетДляАдминистратора;
КонецФункции
#КонецОбласти
#Область ОтчетДляАдминистратора
Функция ОтчетДляАдминистратора(РезультатВидаДиагностики, ВидДиагностики, ПараметрыВыполнения, ПредставленияПроверок)
ПредставлениеВидаДиагностики = ДиагностикаЭДОКлиентСервер.ПолучитьСклонение(ВидДиагностики, "Родительный");
Отчет = Новый ТекстовыйДокумент;
Если ПараметрыВыполнения.ИнформационнаяБазаФайловая И ЗначениеЗаполнено(ПараметрыВыполнения.ИмяКомпьютераКлиент) Тогда
ПредставлениеКомпьютера = СтрШаблон(НСтр("ru = 'на компьютере ""%1""'"), ПараметрыВыполнения.ИмяКомпьютераКлиент);
Иначе
ИмяКомпьютера = ИмяКомпьютера();
ПредставлениеКомпьютера = СтрШаблон(НСтр("ru = 'на сервере ""%1""'"), ИмяКомпьютера);
КонецЕсли;
Шапка = СтрШаблон(НСтр("ru = 'Результаты диагностики %1 %2'"), ПредставлениеВидаДиагностики, ПредставлениеКомпьютера);
Результаты = РезультатВидаДиагностики.Результаты;
Отчет.ДобавитьСтроку(Шапка);
Отчет.ДобавитьСтроку("");
МаксимальнаяДлинаСтроки = 0;
Для каждого Проверка Из ПредставленияПроверок Цикл
МаксимальнаяДлинаСтроки = Макс(МаксимальнаяДлинаСтроки, ДлинаПоследнейСтрокиТекста(Проверка.ПредставлениеПроверки));
ВложенныеПроверки = Неопределено;
Если Проверка.Свойство("ВложенныеПроверки", ВложенныеПроверки) И ЗначениеЗаполнено(ВложенныеПроверки) Тогда
Для каждого ВложеннаяПроверка Из ВложенныеПроверки Цикл
МаксимальнаяДлинаСтроки = Макс(МаксимальнаяДлинаСтроки, ДлинаПоследнейСтрокиТекста(ВложеннаяПроверка.ПредставлениеПроверки));
КонецЦикла;
КонецЕсли;
КонецЦикла;
Для каждого Проверка Из ПредставленияПроверок Цикл
ВложенныеПроверки = Неопределено;
Проверка.Свойство("ВложенныеПроверки", ВложенныеПроверки);
ДобавитьСтрокуВОтчет(Отчет, Проверка.ПредставлениеПроверки, Результаты[Проверка.НазваниеПроверки], МаксимальнаяДлинаСтроки,
Не ЗначениеЗаполнено(ВложенныеПроверки));
Если ЗначениеЗаполнено(ВложенныеПроверки) Тогда
Сч = 0;
ИндексПоследнегоЭлемента = ВложенныеПроверки.ВГраница();
Для каждого ВложеннаяПроверка Из Проверка.ВложенныеПроверки Цикл
Если Сч > Результаты[Проверка.НазваниеПроверки][Проверка.ИмяКоллекцииВложенныхПроверок].Количество() - 1 Тогда
РезультатВложеннойПроверки = Неопределено;
Иначе
РезультатВложеннойПроверки = Результаты[Проверка.НазваниеПроверки][Проверка.ИмяКоллекцииВложенныхПроверок][Сч];
КонецЕсли;
Если РезультатВложеннойПроверки = Неопределено Тогда
ВложеннаяПроверка.Свойство("РезультатПроверки", РезультатВложеннойПроверки);
КонецЕсли;
ДобавитьСтрокуВОтчет(Отчет, ВложеннаяПроверка.ПредставлениеПроверки, РезультатВложеннойПроверки,
МаксимальнаяДлинаСтроки, Сч = ИндексПоследнегоЭлемента);
ДобавитьРекомендациюВОтчет(Отчет, РезультатВложеннойПроверки);
Сч = Сч + 1;
КонецЦикла;
КонецЕсли;
Если ДобавитьРекомендациюВОтчет(Отчет, Результаты[Проверка.НазваниеПроверки]) Тогда
Отчет.ДобавитьСтроку("");
КонецЕсли;
КонецЦикла;
ОтчетДляАдминистратора = Новый Структура;
ОтчетДляАдминистратора.Вставить("Заголовок", СтрШаблон(НСтр("ru = 'Диагностика %1. Отчет для администратора'"), ПредставлениеВидаДиагностики));
ОтчетДляАдминистратора.Вставить("Текст", Отчет.ПолучитьТекст());
Возврат ОтчетДляАдминистратора;
КонецФункции
Процедура ДобавитьПроверку(ПредставленияПроверок, НазваниеПроверки, ПредставлениеПроверки,
РезультатПроверки = Неопределено, ВложенныеПроверки = Неопределено, ИмяКоллекцииВложенныхПроверок = "")
Проверка = Новый Структура;
Проверка.Вставить("НазваниеПроверки", НазваниеПроверки);
Проверка.Вставить("ПредставлениеПроверки", ПредставлениеПроверки);
Если РезультатПроверки <> Неопределено Тогда
Проверка.Вставить("РезультатПроверки", РезультатПроверки);
КонецЕсли;
Если ВложенныеПроверки <> Неопределено Тогда
Проверка.Вставить("ВложенныеПроверки", ВложенныеПроверки);
Проверка.Вставить("ИмяКоллекцииВложенныхПроверок", ИмяКоллекцииВложенныхПроверок);
КонецЕсли;
ПредставленияПроверок.Добавить(Проверка);
КонецПроцедуры
Функция ДобавитьРекомендациюВОтчет(Отчет, РезультатОперацииДиагностики)
Если РезультатОперацииДиагностики.Результат <> Ложь
Или (РезультатОперацииДиагностики.Свойство("Сервисы")
И РезультатОперацииДиагностики.Сервисы.Количество() = 0) Тогда
Возврат Ложь;
КонецЕсли;
Рекомендация = Неопределено;
Если Не РезультатОперацииДиагностики.Свойство("Рекомендация", Рекомендация)
Или Не ЗначениеЗаполнено(Рекомендация.Подробная) Тогда
Возврат Ложь;
КонецЕсли;
Отчет.ДобавитьСтроку(Рекомендация.Отступ + СтрШаблон(ШаблонРекомендации(), Рекомендация.Отступ + Рекомендация.Подробная));
Возврат Истина;
КонецФункции
Функция ДлинаСтроки(Текст)
Возврат СтрДлина(Текст) + СтрЧислоВхождений(Текст, Символы.Таб) * 3;
КонецФункции
Процедура ДобавитьСтрокуВОтчет(Отчет, ПредставлениеРезультата, РезультатПроверки, МаксимальнаяДлинаСтроки,
ДобавлятьПустуюСтроку = Истина)
ДлинаПоследнейСтроки = ДлинаПоследнейСтрокиТекста(ПредставлениеРезультата);
ДлинаДополнения = (МаксимальнаяДлинаСтроки - ДлинаПоследнейСтроки) + 1;
Отчет.ДобавитьСтроку(ПредставлениеРезультата + ":"
+ СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов(" ", ДлинаДополнения)
+ ПредставлениеРезультатаПроверки(РезультатПроверки.Результат));
Если ДобавлятьПустуюСтроку Тогда
Отчет.ДобавитьСтроку("");
КонецЕсли;
КонецПроцедуры
Функция ПредставлениеРезультатаПроверки(Результат)
Если Результат = Истина Тогда
Возврат НСтр("ru = 'успешно'");
ИначеЕсли Результат = Ложь Тогда
Возврат НСтр("ru = 'неуспешно'");
Иначе
Возврат НСтр("ru = 'не выполнялась'");
КонецЕсли;
КонецФункции
Функция ДлинаПоследнейСтрокиТекста(МногострочнаяСтрока)
МассивСтрок = СтрРазделить(МногострочнаяСтрока, Символы.ПС);
ДлинаПоследнейСтроки = ДлинаСтроки(МассивСтрок[МассивСтрок.ВГраница()]);
Возврат ДлинаПоследнейСтроки;
КонецФункции
Функция ШаблонРекомендации()
Возврат НСтр("ru = 'Рекомендации:
|%1'");
КонецФункции
#КонецОбласти
#Область Прочее
// Выполняет диагностику обмена электронными документами.
// Виды выполняемых проверок:
// * Интернет-соединение
// ** Наличие интернет-соединения
// ** Активность сервисов: работоспособны ли ресурсы: https://1c-edo.ru, https://1c-api.taxcom.ru, и т.п.
// ** Доступность сервисов: доступны ли из клиентского приложения ресурсы: https://1c-edo.ru,
// https://1c-api.taxcom.ru, и т.п.
// ** Наличие корневых сертификатов сервисов: установлены ли в хранилище сертификатов корневые сертификаты ресурсов:
// https://1c-edo.ru, https://1c-api.taxcom.ru, и т.п.
// * Криптография
// ** Наличие программы криптографии: установлена ли программа для защиты информации.
// ** Наличие корневого сертификата ГУЦ: установлен ли в хранилище сертификатов сертификат
// головного удостоверяющего центра.
// ** Наличие сертификатов: имеются ли в программе сертификаты для работы с электронным документооборотом.
// ** Неполученные сертификаты: имеются ли заказанные, но не полученные сертификаты для работы
// с электронным документооборотом.
// ** Непривязанные сертификаты: имеются ли сертификаты, не привязанные к учетным записям (требующие
// регистрации в сервисе).
// ** Проверки сертификатов:
// *** Наличие сертификата в личном списке: установлен ли сертификат в личный список (личное хранилище)
// на компьютере.
// *** Корректность данных сертификата: проверка данных сертификата с помощью программы электронной подписи
// и шифрования.
// Данные сертификата, загруженные из файла сертификата или другим путем, могут быть некорректны по разным
// причинам, но самые частые следующие:
// - закончился срок действия сертификата;
// - сертификат в списке отозванных.
// *** Наличие программы для подписания и расшифровки: имеется ли на компьютере программа, указанная в сертификате
// для закрытого ключа, которая позволяет подписывать и расшифровывать данные.
// *** Подписание данных: возможно ли подписать данные закрытым ключом сертификата с помощью программы электронной
// подписи и шифрования. Требуется пароль.
// *** Проверка созданной подписи: возможна ли проверка имеющейся подписи открытым ключом сертификата с помощью
// программы электронной подписи и шифрования.
// *** Шифрование данных: возможно ли шифрование данных открытым ключом сертификата с помощью программы электронной
// подписи и шифрования.
// *** Расшифровка данных: возможна ли расшифровка данных закрытым ключом сертификата с помощью программы электронной
// подписи и шифрования. Требуется пароль.
// * Работа с файлами
// ** Длина пути к файлу: не превышает ли длина пути к файлу 256 символов.
// * Интернет-поддержка
// ** Внедрение БИП: внедрена ли в конфигурацию библиотека интернет-поддержки.
// ** Корректность данных интернет-поддержки: верно ли указаны логин и пароль от сервиса интернет-поддержки.
//
// Параметры:
// ПараметрыВыполнения - Структура - параметры выполнения диагностики,
// см. ДиагностикаЭДОКлиентСервер.НовыеПараметрыВыполненияДиагностики.
//
// Возвращаемое значение:
// - Структура - Результат диагностики, см. НовыйРезультатДиагностики.
//
// Пример:
// //Вариант 1
// ПараметрыВыполнения = ДиагностикаЭДОКлиентСервер.НовыеПараметрыВыполненияДиагностики();
// ПараметрыВыполнения.ВидыДиагностики.Добавить(ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение());
// РезультатДиагностики = ВыполнитьДиагностику(ПараметрыВыполнения);
// //Вариант 2
// РезультатДиагностики = ВыполнитьДиагностику().
//
Функция ВыполнитьДиагностику(ПараметрыВыполнения = Неопределено) Экспорт
Перем ВидыДиагностики;
Если ПараметрыВыполнения = Неопределено Тогда
ПараметрыВыполнения = ДиагностикаЭДОКлиентСервер.НовыеПараметрыВыполненияДиагностики();
КонецЕсли;
Если ПараметрыВыполнения.ИнформационнаяБазаФайловая = Неопределено Тогда
ПараметрыВыполнения.ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая();
КонецЕсли;
ПараметрыВыполнения.ИмяКомпьютераСервер = ИмяКомпьютера();
ПараметрыВыполнения.Свойство("ВидыДиагностики", ВидыДиагностики);
Если ВидыДиагностики = Неопределено Тогда
ВидыДиагностики = Новый Массив;
КонецЕсли;
РезультатДиагностики = НовыйРезультатДиагностики(ВидыДиагностики);
Если ЕстьВидДиагностики(РезультатДиагностики, ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение(), Неопределено)
Или ЕстьВидДиагностики(РезультатДиагностики, ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография(), Неопределено) Тогда
ДанныеКорневыхСертификатов = ДанныеКорневыхСертификатов();
Иначе
ДанныеКорневыхСертификатов = Неопределено;
КонецЕсли;
Контекст = Новый Структура;
Контекст.Вставить("ДанныеКорневыхСертификатов", ДанныеКорневыхСертификатов);
ЗаполнитьДоступныеУчетныеЗаписи(РезультатДиагностики, ПараметрыВыполнения);
ЗаполнитьДанныеУчетныхЗаписей(РезультатДиагностики, ПараметрыВыполнения);
ДиагностикаКриптографии(РезультатДиагностики, ПараметрыВыполнения, Контекст);
ДиагностикаИнтернетСоединения(РезультатДиагностики, ПараметрыВыполнения, Контекст);
ДиагностикаИнтернетПоддержки(РезультатДиагностики, ПараметрыВыполнения, Контекст);
ДиагностикаРаботыСФайлами(РезультатДиагностики, ПараметрыВыполнения, Контекст);
ОбщийРезультат = Истина;
Для каждого РезультатВидаДиагностики Из РезультатДиагностики.Результаты Цикл
ОбщийРезультат = ОбщийРезультат И РезультатВидаДиагностики.Значение.Результат;
КонецЦикла;
РезультатДиагностики.Результат = ОбщийРезультат;
Возврат РезультатДиагностики;
КонецФункции
Функция ПоддерживаемыеВидыДиагностики()
ПоддерживаемыеВидыДиагностики = Новый Массив;
ПоддерживаемыеВидыДиагностики.Добавить(ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение());
ПоддерживаемыеВидыДиагностики.Добавить(ДиагностикаЭДОКлиентСервер.ВидДиагностикиКриптография());
ПоддерживаемыеВидыДиагностики.Добавить(ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетПоддержка());
ПоддерживаемыеВидыДиагностики.Добавить(ДиагностикаЭДОКлиентСервер.ВидДиагностикиРаботаСФайлами());
ПоддерживаемыеВидыДиагностики.Добавить(ДиагностикаЭДОКлиентСервер.ВидДиагностикиТестАутентификации());
Возврат ПоддерживаемыеВидыДиагностики;
КонецФункции
Процедура ЗаписатьОшибкуВЖурналРегистрации(ВидДиагностики, Ошибка)
ОбработкаНеисправностейБЭД.ОбработатьОшибку(НСтр("ru = 'Выполнение диагностики ЭДО'"),
ОбщегоНазначенияБЭДКлиентСервер.ПодсистемыБЭД().ОбменСКонтрагентами, Ошибка);
КонецПроцедуры
// Параметры:
// РезультатДиагностики - см. НовыйРезультатДиагностики
// УчетныеЗаписи - Массив из Строка
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Строка
// * Значение - Строка
Функция ПроверяемыеСервисыИнтернетСоединение(РезультатДиагностики, УчетныеЗаписи)
Сервисы = Новый Соответствие;
Сервис = СервисНастроекЭДО.АдресСервисаНастроек();
Сервисы.Вставить(Сервис, ПредставлениеСервисаЭДО(Сервис));
Сервис = СервисНастроекЭДО.АдресОблачногоХранилищаНастроек();
Сервисы.Вставить(Сервис, ПредставлениеСервисаЭДО(Сервис));
ДобавитьСервисыЦентровЭДО(Сервисы, УчетныеЗаписи);
Если УчетныеЗаписи.Количество() = 0 Тогда
ДобавитьСервисы1СЭДО(Сервисы);
ДобавитьСервисыТакском(Сервисы);
Иначе
Для Каждого УчетнаяЗапись Из УчетныеЗаписи Цикл
ДанныеУчетнойЗаписи = РезультатДиагностики.ДанныеУчетныхЗаписей[УчетнаяЗапись];
Если ДанныеУчетнойЗаписи = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ДанныеУчетнойЗаписи.СпособОбменаЭД = Перечисления.СпособыОбменаЭД.ЧерезСервис1СЭДО Тогда
ДобавитьСервисы1СЭДО(Сервисы);
ИначеЕсли ДанныеУчетнойЗаписи.СпособОбменаЭД = Перечисления.СпособыОбменаЭД.ЧерезОператораЭДОТакском Тогда
ДобавитьСервисыТакском(Сервисы);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Сервисы;
КонецФункции
Процедура ДобавитьСервисы1СЭДО(Сервисы)
Сервис = СервисЭДО.ПараметрыСервиса1СЭДО().АдресДляПроверкиАктивности;
Сервисы.Вставить(Сервис, ПредставлениеСервисаЭДО(Сервис));
Сервис = "https://login.1c.ru/";
Сервисы.Вставить(Сервис, ПредставлениеСервисаЭДО(Сервис));
КонецПроцедуры
Процедура ДобавитьСервисыТакском(Сервисы)
Сервис = СервисЭДО.ПараметрыСервиса1СТакском().АдресДляПроверкиАктивности;
Сервисы.Вставить(Сервис, ПредставлениеСервисаЭДО(Сервис));
Сервис = "https://webits.1c.ru/services/WebItsSimpleService";
Сервисы.Вставить(Сервис, ПредставлениеСервисаЭДО(Сервис));
КонецПроцедуры
// Параметры:
// Сервисы - Соответствие из КлючИЗначение:
// * Ключ - Строка
// * Значение - Строка
// УчетныеЗаписи - Массив из Строка
Процедура ДобавитьСервисыЦентровЭДО(Сервисы, УчетныеЗаписи)
Если Не НастройкиЭДО.ИспользоватьИнтеграциюЦентраЭДО() Тогда
Возврат;
КонецЕсли;
МодульИнтеграцияЦентраЭДО = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияЦентраЭДО");
ОписанияСервисов = МодульИнтеграцияЦентраЭДО.ОписанияСервисовУчетныхЗаписейЭДО(УчетныеЗаписи);
Для Каждого ОписаниеСервиса Из ОписанияСервисов Цикл
Сервисы.Вставить(ОписаниеСервиса.АдресРесурса, ПредставлениеСервисаЭДО(ОписаниеСервиса.АдресСервиса));
КонецЦикла;
КонецПроцедуры
Функция ДоступнаУстановкаСертификатов() Экспорт
Возврат ОбщегоНазначения.ИнформационнаяБазаФайловая()
И ОбщегоНазначения.ЭтоWindowsКлиент()
И Не ОбщегоНазначения.ЭтоВебКлиент();
КонецФункции
Функция ЕстьВидДиагностики(РезультатДиагностики, ВидДиагностики, ЗначениеВидаДиагностики)
Возврат РезультатДиагностики.Результаты.Свойство(ВидДиагностики, ЗначениеВидаДиагностики);
КонецФункции
Функция ПредставлениеСервисаЭДО(Сервис) Экспорт
СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(Сервис);
ИмяСервера = СтруктураURI.ИмяСервера;
Возврат ИмяСервера;
КонецФункции
Функция ПараметрыКриптографии() Экспорт
ПроверятьЭлектронныеПодписиНаСервере = ЭлектроннаяПодпись.ПроверятьЭлектронныеПодписиНаСервере();
СоздаватьЭлектронныеПодписиНаСервере = ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере();
ПараметрыКриптографии = Новый Структура;
ПараметрыКриптографии.Вставить("ЕстьКриптографияНаСервере", ПроверятьЭлектронныеПодписиНаСервере Или СоздаватьЭлектронныеПодписиНаСервере);
ПараметрыКриптографии.Вставить("ЕстьКриптографияНаКлиенте", Не ПроверятьЭлектронныеПодписиНаСервере Или Не СоздаватьЭлектронныеПодписиНаСервере);
Возврат ПараметрыКриптографии;
КонецФункции
Функция УчетныеЗаписиИзОтбора(ЗначениеОтбора)
Если Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
Возврат Новый Массив;
ИначеЕсли ТипЗнч(ЗначениеОтбора[0]) = Тип("РегистрСведенийКлючЗаписи.УчетныеЗаписиЭДО") Тогда
МассивУчетныхЗаписей = Новый Массив;
Для каждого КлючЗаписи Из ЗначениеОтбора Цикл
МассивУчетныхЗаписей.Добавить(КлючЗаписи.ИдентификаторЭДО);
КонецЦикла;
Иначе
МассивУчетныхЗаписей = ЗначениеОтбора;
КонецЕсли;
Возврат МассивУчетныхЗаписей;
КонецФункции
// Параметры:
// ПараметрыВыполненияДиагностики - см. ДиагностикаЭДОКлиентСервер.НовыеПараметрыВыполненияДиагностики
// ОтборСертификатов - Неопределено
// - см. КриптографияБЭД.НовыйОтборСертификатов
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования
// * Отпечаток - Строка
// * ИдентификаторЭДО - Строка
// * ПривязанКУчетнойЗаписи - Булево
// * ТребуетсяПривязкаКУчетнойЗаписи - Булево
// * ОжидаетсяВыпускСертификата - Булево
Функция ТаблицаДоступныхСертификатов(ПараметрыВыполненияДиагностики, ОтборСертификатов = Неопределено)
Сертификаты = Новый Массив;
Если ПараметрыВыполненияДиагностики.Отбор.Свойство("Сертификат")
И ЗначениеЗаполнено(ПараметрыВыполненияДиагностики.Отбор.Сертификат) Тогда
Если ТипЗнч(ПараметрыВыполненияДиагностики.Отбор.Сертификат) = Тип("Массив") Тогда
Сертификаты = ПараметрыВыполненияДиагностики.Отбор.Сертификат;
Иначе
Сертификаты = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПараметрыВыполненияДиагностики.Отбор.Сертификат);
КонецЕсли;
КонецЕсли;
УчетныеЗаписи = Новый Массив;
Если ПараметрыВыполненияДиагностики.Отбор.Свойство("УчетнаяЗапись")
И ЗначениеЗаполнено(ПараметрыВыполненияДиагностики.Отбор.УчетнаяЗапись)Тогда
УчетныеЗаписи = УчетныеЗаписиИзОтбора(ПараметрыВыполненияДиагностики.Отбор.УчетнаяЗапись);
КонецЕсли;
Запросы = Новый Массив;
ЗапросСертификатов = КриптографияБЭД.ЗапросДействующихСертификатов("Сертификаты", ОтборСертификатов);
Запросы.Добавить(ЗапросСертификатов);
ЗапросСертификатовУчетныхЗаписей = СинхронизацияЭДО.ЗапросСертификатовУчетныхЗаписей("СертификатыУчетныхЗаписей");
Запросы.Добавить(ЗапросСертификатовУчетныхЗаписей);
Запрос = Новый Запрос("ВЫБРАТЬ
|Сертификаты.Ссылка,
|Сертификаты.Отпечаток,
|ЕСТЬNULL(СертификатыУчетныхЗаписей.ИдентификаторЭДО, """") КАК ИдентификаторЭДО,
|НЕ СертификатыУчетныхЗаписей.ИдентификаторЭДО ЕСТЬ NULL КАК ПривязанКУчетнойЗаписи,
|Сертификаты.ВыпущенЧерезСервис1СПодпись И СертификатыУчетныхЗаписей.ИдентификаторЭДО ЕСТЬ NULL КАК ТребуетсяПривязкаКУчетнойЗаписи,
|Сертификаты.ОжидаетсяВыпускСертификата
|ИЗ
|Сертификаты КАК Сертификаты
|ЛЕВОЕ СОЕДИНЕНИЕ СертификатыУчетныхЗаписей КАК СертификатыУчетныхЗаписей
|ПО Сертификаты.Ссылка = СертификатыУчетныхЗаписей.Сертификат");
ИтоговыйЗапрос = ОбщегоНазначенияБЭД.СоединитьЗапросы(Запрос, Запросы);
ТаблицаСертификатовБезОтбора = ИтоговыйЗапрос.Выполнить().Выгрузить();
ТаблицаСертификатов = ТаблицаСертификатовБезОтбора.СкопироватьКолонки();
Для Каждого СтрокаТаблицы Из ТаблицаСертификатовБезОтбора Цикл
Если Сертификаты.Количество() Тогда
КопироватьСтроку = Сертификаты.Найти(СтрокаТаблицы.Ссылка) <> Неопределено;
Иначе
КопироватьСтроку = Истина;
КонецЕсли;
Если КопироватьСтроку И УчетныеЗаписи.Количество() Тогда
КопироватьСтроку = УчетныеЗаписи.Найти(СтрокаТаблицы.ИдентификаторЭДО) <> Неопределено;
КонецЕсли;
Если КопироватьСтроку Тогда
ЗаполнитьЗначенияСвойств(ТаблицаСертификатов.Добавить(), СтрокаТаблицы);
КонецЕсли;
КонецЦикла;
Возврат ТаблицаСертификатов;
КонецФункции
Функция ДанныеКорневыхСертификатов()
АдресКаталога = АдресКаталогаССертификатами();
РезультатЗагрузки = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(АдресКаталога + "files_structure.json");
Если РезультатЗагрузки.Статус Тогда
ДанныеФайла = ПолучитьИзВременногоХранилища(РезультатЗагрузки.Путь);
УдалитьИзВременногоХранилища(РезультатЗагрузки.Путь);
ДанныеКорневыхСертификатов = ОбщегоНазначенияБЭД.JSONЗначение(ДанныеФайла, Истина);
Иначе
ЗаписатьОшибкуВЖурналРегистрации(ДиагностикаЭДОКлиентСервер.ВидДиагностикиИнтернетСоединение(),
РезультатЗагрузки.СообщениеОбОшибке);
ДанныеКорневыхСертификатов = Неопределено;
КонецЕсли;
Возврат ДанныеКорневыхСертификатов;
КонецФункции
Функция АдресКаталогаССертификатами()
АдресКаталогаССертификатами = СервисНастроекЭДО.АдресОблачногоХранилищаНастроек() + "/ServiceCertificates/";
Если Не СтрЗаканчиваетсяНа(АдресКаталогаССертификатами, "/") Тогда
АдресКаталогаССертификатами = АдресКаталогаССертификатами + "/";
КонецЕсли;
Возврат АдресКаталогаССертификатами;
КонецФункции
Функция АдресСертификатаПоОтпечатку(Отпечаток)
Возврат АдресКаталогаССертификатами() + Отпечаток + ".cer";
КонецФункции
Процедура ЗаполнитьДанныеУчетныхЗаписей(РезультатДиагностики, ПараметрыВыполненияДиагностики)
Запросы = Новый Массив;
Отбор = СинхронизацияЭДО.НовыйОтборУчетныхЗаписей();
Отбор.УчетныеЗаписи = "&УчетныеЗаписи";
ЗапросУчетныхЗаписей = СинхронизацияЭДО.ЗапросУчетныхЗаписей("УчетныеЗаписиЭДО", Отбор);
Запросы.Добавить(ЗапросУчетныхЗаписей);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УчетныеЗаписиЭДО.ИдентификаторЭДО КАК ИдентификаторЭДО,
| УчетныеЗаписиЭДО.НаименованиеУчетнойЗаписи КАК НаименованиеУчетнойЗаписи,
| УчетныеЗаписиЭДО.СпособОбменаЭД КАК СпособОбменаЭД
|ИЗ
| УчетныеЗаписиЭДО КАК УчетныеЗаписиЭДО";
ИтоговыйЗапрос = ОбщегоНазначенияБЭД.СоединитьЗапросы(Запрос, Запросы);
ИтоговыйЗапрос.УстановитьПараметр("УчетныеЗаписи", РезультатДиагностики.ДоступныеУчетныеЗаписи);
РезультатЗапроса = ИтоговыйЗапрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДанныеУчетнойЗаписи = Новый Структура;
ДанныеУчетнойЗаписи.Вставить("НаименованиеУчетнойЗаписи");
ДанныеУчетнойЗаписи.Вставить("СпособОбменаЭД");
ДанныеУчетнойЗаписи.Вставить("ЭтоПрямойОбмен",
СинхронизацияЭДО.ЭтоПрямойОбмен(ВыборкаДетальныеЗаписи.СпособОбменаЭД));
ЗаполнитьЗначенияСвойств(ДанныеУчетнойЗаписи, ВыборкаДетальныеЗаписи);
РезультатДиагностики.ДанныеУчетныхЗаписей.Вставить(ВыборкаДетальныеЗаписи.ИдентификаторЭДО, ДанныеУчетнойЗаписи);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
// См. СтандартныеПодсистемыСервер.ПриОпределенииМетодовРазрешенныхДляВызоваКакПроизвольныйКод
Процедура ПриОпределенииМетодовРазрешенныхДляВызоваКакПроизвольныйКод(Методы) Экспорт
Методы.Вставить("ВыполнитьДиагностику", Истина);
КонецПроцедуры
#КонецОбласти