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