///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Переопределяет представление сертификата.
// 
// Параметры:
//  Сертификат - СертификатКриптографии
//  РазницаСУниверсальнымВременем - Число
//  Представление - Строка
//
Процедура ПриПолученииПредставленияСертификата(Знач Сертификат, Знач РазницаСУниверсальнымВременем, Представление) Экспорт
	
	// Локализация
	Если ТипЗнч(Сертификат) = Тип("Структура") Тогда
		Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1, до %2'"),
			ПредставлениеСубъекта(Сертификат.Сертификат, Ложь), Формат(Сертификат.ДействителенДо, "ДФ=MM.yyyy"));
	Иначе
		ДатыСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатыСертификата(Сертификат, РазницаСУниверсальнымВременем);
		Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1, до %2'"),
			ПредставлениеСубъекта(Сертификат, Ложь), Формат(ДатыСертификата.ДатаОкончания, "ДФ=MM.yyyy"));
	КонецЕсли;
	// Конец Локализация
	
КонецПроцедуры

// Переопределяет представление субъекта сертификата.
// 
// Параметры:
//  Сертификат - СертификатКриптографии
//  Представление - Строка
//
Процедура ПриПолученииПредставленияСубъекта(Знач Сертификат, Представление) Экспорт
	
	// Локализация
	Представление = ПредставлениеСубъекта(Сертификат, Истина);
	// Конец Локализация
	
КонецПроцедуры

// Переопределяет структуру расширенных свойств субъекта сертификата.
// 
// Параметры:
//  Субъект - ФиксированнаяСтруктура
//  Свойства - Структура
//
Процедура ПриПолученииРасширенныхСвойствСубъектаСертификата(Знач Субъект, Свойства) Экспорт
	
	// Локализация
	Свойства = Новый Структура;
	Свойства.Вставить("ОГРН");
	Свойства.Вставить("ОГРНИП");
	Свойства.Вставить("СНИЛС");
	Свойства.Вставить("ИНН");
	Свойства.Вставить("Фамилия");
	Свойства.Вставить("Имя");
	Свойства.Вставить("Отчество");
	Свойства.Вставить("Должность");
	Свойства.Вставить("Организация");
	Свойства.Вставить("ОбщееИмя");
	Свойства.Вставить("ИННЮЛ");
	
	Если Субъект.Свойство("OGRN")Тогда
		Свойства.ОГРН = ПодготовитьСтроку(Субъект.OGRN);
		
	ИначеЕсли Субъект.Свойство("OID1_2_643_100_1") Тогда
		Свойства.ОГРН = ПодготовитьСтроку(Субъект.OID1_2_643_100_1);
	КонецЕсли;
	
	Если Субъект.Свойство("OGRNIP") Тогда
		Свойства.ОГРНИП = ПодготовитьСтроку(Субъект.OGRNIP);
		
	ИначеЕсли Субъект.Свойство("OID1_2_643_100_5") Тогда
		Свойства.ОГРНИП = ПодготовитьСтроку(Субъект.OID1_2_643_100_5);
	КонецЕсли;
	
	Если Субъект.Свойство("SNILS") Тогда
		Свойства.СНИЛС = ПодготовитьСтроку(Субъект.SNILS);
		
	ИначеЕсли Субъект.Свойство("OID1_2_643_100_3") Тогда
		Свойства.СНИЛС = ПодготовитьСтроку(Субъект.OID1_2_643_100_3);
	КонецЕсли;
	
	ЗаполнитьИНН(Свойства, Субъект);
	
	Если Субъект.Свойство("CN") Тогда
		Свойства.ОбщееИмя = ПодготовитьСтроку(Субъект.CN);
	КонецЕсли;
	
	Если Субъект.Свойство("O") Тогда
		Свойства.Организация = ПодготовитьСтроку(Субъект.O);
	КонецЕсли;
	
	Если Субъект.Свойство("SN") Тогда // Наличие фамилии (обычно для должностного лица).
		
		// Извлечение ФИО из поля SN и GN.
		Свойства.Фамилия = ПодготовитьСтроку(Субъект.SN);
		
		Если Субъект.Свойство("GN") Тогда
			Отчество = ПодготовитьСтроку(Субъект.GN);
			Позиция = СтрНайти(Отчество, " ");
			Если Позиция = 0 Тогда
				Свойства.Имя = Отчество;
			Иначе
				Свойства.Имя = Лев(Отчество, Позиция - 1);
				Свойства.Отчество = ПодготовитьСтроку(Сред(Отчество, Позиция + 1));
			КонецЕсли;
		КонецЕсли;
		
	ИначеЕсли ЗначениеЗаполнено(Свойства.ОГРНИП)    // Признак индивидуального предпринимателя.
	      Или Субъект.Свойство("T")                 // Признак должностного лица.
	      Или Субъект.Свойство("OID2_5_4_12")       // Признак должностного лица.
	      Или ЗначениеЗаполнено(Свойства.СНИЛС)     // Признак физического лица.
	      Или ЭтоИННФизЛица(Свойства.ИНН) И НЕ ЗначениеЗаполнено(Свойства.ИННЮЛ) Тогда // Признак физического лица.
		
		Если Свойства.ОбщееИмя <> Свойства.Организация
			   И Не (Субъект.Свойство("T")           И Свойства.ОбщееИмя = ПодготовитьСтроку(Субъект.T))
			   И Не (Субъект.Свойство("OID2_5_4_12") И Свойства.ОбщееИмя = ПодготовитьСтроку(Субъект.OID2_5_4_12)) Тогда
				
				// Извлечение ФИО из поля CN.
				Массив = СтрРазделить(Свойства.ОбщееИмя, " ", Ложь);
				
				Если Массив.Количество() < 4 Тогда
					Если Массив.Количество() > 0 Тогда
						Свойства.Фамилия = СокрЛП(Массив[0]);
					КонецЕсли;
					Если Массив.Количество() > 1 Тогда
						Свойства.Имя = СокрЛП(Массив[1]);
					КонецЕсли;
					Если Массив.Количество() > 2 Тогда
						Свойства.Отчество = СокрЛП(Массив[2]);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Свойства.Фамилия) Или ЗначениеЗаполнено(Свойства.Имя) Тогда
		Если Субъект.Свойство("T") Тогда
			Свойства.Должность = ПодготовитьСтроку(Субъект.T);
			
		ИначеЕсли Субъект.Свойство("OID2_5_4_12") Тогда
			Свойства.Должность = ПодготовитьСтроку(Субъект.OID2_5_4_12);
		КонецЕсли;
	КонецЕсли;
	
	// Конец Локализация
	
КонецПроцедуры

// Переопределяет структуру расширенных свойств издателя сертификата.
// 
// Параметры:
//  Издатель - ФиксированнаяСтруктура
//  Свойства - Структура
//
Процедура ПриПолученииРасширенныхСвойствИздателяСертификата(Знач Издатель, Свойства) Экспорт
	
	// Локализация
	Свойства = Новый Структура;
	Свойства.Вставить("ОГРН");
	Свойства.Вставить("ИНН");
	Свойства.Вставить("ИННЮЛ");
	
	Если Издатель.Свойство("OGRN") Тогда
		Свойства.ОГРН = ПодготовитьСтроку(Издатель.OGRN);
		
	ИначеЕсли Издатель.Свойство("OID1_2_643_100_1") Тогда
		Свойства.ОГРН = ПодготовитьСтроку(Издатель.OID1_2_643_100_1);
	КонецЕсли;
	
	ЗаполнитьИНН(Свойства, Издатель);
	// Конец Локализация
	
КонецПроцедуры

// Переопределяет результат сравнения сертификатов по свойствам субъекта.
// 
// Параметры:
//  СвойстваНового - Структура
//  СвойстваСтарого - Структура
//  Результат - Булево
//
Процедура ПриСравненииСертификатов(СвойстваНового, СвойстваСтарого, Результат) Экспорт
	
	// Локализация
	Если СвойстваНового.ОбщееИмя = СвойстваСтарого.ОбщееИмя
			И СвойстваНового.Организация = СвойстваСтарого.Организация
			И СвойстваНового.Фамилия = СвойстваСтарого.Фамилия
			И СвойстваНового.Имя = СвойстваСтарого.Имя
			И СвойстваНового.Отчество = СвойстваСтарого.Отчество
			И СвойстваНового.ИНН = СвойстваСтарого.ИНН
			И СвойстваНового.ИННЮЛ = СвойстваСтарого.ИННЮЛ
			Тогда 
		Результат = Истина;
		Возврат;
	КонецЕсли;
	Результат = Ложь;
	// Конец Локализация
	
КонецПроцедуры

// При получении конверта XML.
// 
// Параметры:
//  Параметры - Структура
//  КонвертXML - Строка
//
Процедура ПриПолученииКонвертаXML(Параметры, КонвертXML) Экспорт
	
	// Локализация
	Если Параметры.Вариант = КонвертПоУмолчанию() Тогда
		КонвертXML = КонвертXML1();
	ИначеЕсли Параметры.Вариант = "dmdk.goznak.ru_v1" Тогда
		КонвертXML = КонвертXML2();
	КонецЕсли;
	// Конец Локализация
	
КонецПроцедуры

// При получении варианта конверта по умолчанию.
// 
// Параметры:
//  КонвертXML - Строка
//
Процедура ПриПолученииВариантаКонвертаПоУмолчанию(КонвертXML) Экспорт

	// Локализация
	КонвертXML = КонвертПоУмолчанию();
	// Конец Локализация
	
КонецПроцедуры

// Адрес списка отзыва, расположенного на другом ресурсе.
// 
// Параметры:
//  ИмяИздателя - Строка - имя издателя латиницей в нижнем регистре
//  СвойстваСертификата  - ДвоичныеДанные - данные сертификата.
//                       - Строка - адрес данных сертификата.
//                       - Структура - см. ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСертификата
//  КаталогиСписковОтзываУЦ - Строка - имена каталогов для кэширования списков отзыва на собственном ресурсе
//                        из настроек классификатора аккредитованных УЦ, совпадают с именами издателя сертификата.
// 
// Возвращаемое значение:
//  Структура:
//   * АдресВнутренний - Строка - идентификатор для поиска в базе
//   * АдресВнешний - Строка - адрес ресурса для скачивания
//
Функция АдресСпискаОтзываВнутренний(ИмяИздателя, СвойстваСертификата, КаталогиСписковОтзываУЦ) Экспорт
	
	Результат = Новый Структура("АдресВнешний, АдресВнутренний");
	
	ИмяИздателя = СтрЗаменить(ИмяИздателя, " ", "_");
	ИмяИздателя = СокрЛП(СтрСоединить(СтрРазделить(ИмяИздателя, "!*'();«»:@&=+$,/?%#[]\|<>", Истина), ""));
	
	ИмяИздателя = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяИздателя, "");
	
	Если Не ЗначениеЗаполнено(ИмяИздателя) Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если ТипЗнч(СвойстваСертификата) <> Тип("Структура") Тогда
		СвойстваСертификата = 
			ЭлектроннаяПодписьСлужебныйКлиентСервер.ДополнительныеСвойстваСертификата(СвойстваСертификата, 0);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(СвойстваСертификата.ИдентификаторКлючаУдостоверяющегоЦентра) Тогда
		Возврат Результат;
	КонецЕсли;
	
	Результат.АдресВнутренний = СтрШаблон("%1/%2", ИмяИздателя, НРег(СвойстваСертификата.ИдентификаторКлючаУдостоверяющегоЦентра));
	
	// Локализация
	
	Массив = СтрРазделить(КаталогиСписковОтзываУЦ, ";");
	Если Массив.Найти(ИмяИздателя) <> Неопределено Тогда
		Результат.АдресВнешний = СтрШаблон("http://ca.1c.ru/crls/%1.zip", Результат.АдресВнутренний);
	КонецЕсли;
	
	// Конец Локализация
	
	Возврат Результат;
	
КонецФункции

// Каталоги списков отзыва УЦ.
// 
// Параметры:
//  АккредитованныеУдостоверяющиеЦентры - Структура
// 
// Возвращаемое значение:
//  Строка - каталоги списков отзыва УЦ
//
Функция КаталогиСписковОтзываУЦ(АккредитованныеУдостоверяющиеЦентры) Экспорт
	
	// Локализация
	Если АккредитованныеУдостоверяющиеЦентры = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	КаталогиСписковОтзываУЦ = АккредитованныеУдостоверяющиеЦентры.ДругиеНастройки.Получить("КаталогиСписковОтзываУЦ");

	Если КаталогиСписковОтзываУЦ = Неопределено Тогда
		Возврат "federalnaya_nalogovaya_sluzhba";
	КонецЕсли;

	Если ЗначениеЗаполнено(КаталогиСписковОтзываУЦ) Тогда
		Возврат КаталогиСписковОтзываУЦ;
	КонецЕсли;
	
	// Конец Локализация
	Возврат "";
	
КонецФункции

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

// При определении ссылки на инструкцию по работе с программами.
// 
// Параметры:
//  Раздел - Строка
//  НавигационнаяСсылка - Строка
//
Процедура ПриОпределенииСсылкиНаИнструкциюПоРаботеСПрограммами(Раздел, НавигационнаяСсылка) Экспорт
	
	// Локализация
	
	Если Раздел = "УчетВГосударственныхУчреждениях" Тогда
		НавигационнаяСсылка = "http://its.1c.ru/bmk/bud/digsig";
	Иначе
		НавигационнаяСсылка = "http://its.1c.ru/bmk/comm/digsig";
	КонецЕсли;
	
	// Конец Локализация
	
КонецПроцедуры

// При определении ссылки на поиск по ошибкам при работе с электронной подписью.
// 
// Параметры:
//  НавигационнаяСсылка - Строка
//  СтрокаПоиска - Строка - строка поиска
//
Процедура ПриОпределенииСсылкиНаПоискПоОшибкамПриРаботеСЭлектроннойПодписью(НавигационнаяСсылка, СтрокаПоиска = "") Экспорт
	
	// Локализация
	
	НавигационнаяСсылка = "https://edo.1c.ru/handbook"
		+ ?(ПустаяСтрока(СтрокаПоиска), "", "//?q=" + СтрокаПоиска);
	
	// Конец Локализация
	
КонецПроцедуры

// Преобразование передаваемого названия алгоритма в зависимости от передаваемого представления.
// 
// Параметры:
//  АлгоритмШифрования  - Строка
// 
// Возвращаемое значение:
//  Строка
//
Функция ПреобразованныйАлгоритмШифрования(АлгоритмШифрования) Экспорт
	
	Результат = "";
	
	// Локализация
	
	Если ИменаАлгоритмовШифрованияГОСТ_Р_34_12_2015_Магма().Найти(АлгоритмШифрования) <> Неопределено
		Или АлгоритмШифрования = "Магма" Тогда
		Результат = "1.2.643.7.1.1.5.1.1";
	ИначеЕсли ИменаАлгоритмовШифрованияГОСТ_Р_34_12_2015_Кузнечик().Найти(АлгоритмШифрования) <> Неопределено
		Или АлгоритмШифрования = "Кузнечик" Тогда
		Результат = "1.2.643.7.1.1.5.2.1";
	ИначеЕсли ИменаАлгоритмовШифрованияГОСТ_28147_89().Найти(АлгоритмШифрования) <> Неопределено Тогда
		Результат = "1.2.643.2.2.21";
	Иначе
		Результат = АлгоритмШифрования;
	КонецЕсли;
	
	// Конец Локализация
	
	Если ПустаяСтрока(Результат) Тогда
		Результат = АлгоритмШифрования;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Реализует альтернативную установку параметров менеджера криптографии.
// Например, если требуется учесть специфику программы электронной подписи и шифрования.
//
// Параметры:
//  ОписаниеПрограммы - см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы
//  Менеджер - МенеджерКриптографии
//  АлгоритмШифрования - Строка
//  Результат - Булево
//
Процедура ПриУстановкеПараметровМенеджераКриптографии(ОписаниеПрограммы, Менеджер, АлгоритмШифрования, Результат) Экспорт
	
	// Локализация
	Результат = ВыполненОбходНарушенияОбратнойСовместимостиВVipNetCSP_4_4(ОписаниеПрограммы, Менеджер, АлгоритмШифрования);
	// Конец Локализация
	
КонецПроцедуры

// Добавляет наборы алгоритмов для создания подписи с национальной спецификой.
//
// Параметры:
//  Наборы	 - Массив
//
Процедура ПриУстановкеНаборовАлгоритмовДляСозданияПодписи(Наборы) Экспорт
	
	// Локализация
	
	// ГОСТ 94
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовДляСозданияПодписи();
	Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.2.2.20";
	Свойства.ИдентификаторАлгоритмаПодписи        = "1.2.643.2.2.4";
	Свойства.ИменаАлгоритмаПодписи                = ИменаАлгоритмовПодписиГОСТ_34_10_94();
	Свойства.ИдентификаторАлгоритмаХеширования    = "1.2.643.2.2.9";
	Свойства.ИменаАлгоритмаХеширования            = ИменаАлгоритмовХешированияГОСТ_34_11_94();
	Свойства.ИмяАлгоритмаПодписиXML     = "http://www.w3.org/2001/04/xmldsig-more#gostr341094-gostr3411";
	Свойства.ИмяАлгоритмаХешированияXML = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
	Наборы.Добавить(Свойства);
	
	// ГОСТ 2001
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовДляСозданияПодписи();
	Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.2.2.19";
	Свойства.ИдентификаторАлгоритмаПодписи        = "1.2.643.2.2.3";
	Свойства.ИменаАлгоритмаПодписи                = ИменаАлгоритмовПодписиГОСТ_34_10_2001();
	Свойства.ИдентификаторАлгоритмаХеширования    = "1.2.643.2.2.9";
	Свойства.ИменаАлгоритмаХеширования            = ИменаАлгоритмовХешированияГОСТ_34_11_94();
	Свойства.ИмяАлгоритмаПодписиXML     = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
	Свойства.ИмяАлгоритмаХешированияXML = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
	Наборы.Добавить(Свойства);
	
	// ГОСТ 2012/256
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовДляСозданияПодписи();
	Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.7.1.1.1.1";
	Свойства.ИдентификаторАлгоритмаПодписи        = "1.2.643.7.1.1.3.2";
	Свойства.ИменаАлгоритмаПодписи                = ИменаАлгоритмовПодписиГОСТ_34_10_2012_256();
	Свойства.ИдентификаторАлгоритмаОбмена         = "1.2.643.7.1.1.6.1";
	Свойства.ИдентификаторАлгоритмаХеширования    = "1.2.643.7.1.1.2.2";
	Свойства.ИменаАлгоритмаХеширования            = ИменаАлгоритмовХешированияГОСТ_34_11_2012_256();
	Свойства.ИмяАлгоритмаПодписиXML     = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
	Свойства.ИмяАлгоритмаХешированияXML = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
	Наборы.Добавить(Свойства);
	
	// ГОСТ 2012/512
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовДляСозданияПодписи();
	Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.7.1.1.1.2";
	Свойства.ИдентификаторАлгоритмаПодписи        = "1.2.643.7.1.1.3.3";
	Свойства.ИменаАлгоритмаПодписи                = ИменаАлгоритмовПодписиГОСТ_34_10_2012_512();
	Свойства.ИдентификаторАлгоритмаОбмена         = "1.2.643.7.1.1.6.2";
	Свойства.ИдентификаторАлгоритмаХеширования    = "1.2.643.7.1.1.2.3";
	Свойства.ИменаАлгоритмаХеширования            = ИменаАлгоритмовХешированияГОСТ_34_11_2012_512();
	Свойства.ИмяАлгоритмаПодписиXML     = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512";
	Свойства.ИмяАлгоритмаХешированияXML = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512";
	Наборы.Добавить(Свойства);
		
	// Конец Локализация
	
КонецПроцедуры

// Добавляет наборы алгоритмов шифрования с национальной спецификой.
//
// Параметры:
//  Наборы	 - Массив
//
Процедура ПриУстановкеНаборовАлгоритмовШифрования(Наборы) Экспорт
	
	// Локализация
	
	// ГОСТ 28147-89
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовШифрования();
	Свойства.ИдентификаторАлгоритмаШифрования = "1.2.643.2.2.21";
	Свойства.ИменаАлгоритмаШифрования = ИменаАлгоритмовШифрованияГОСТ_28147_89();
	Наборы.Добавить(Свойства);
	
	// ГОСТ Р 34.12-2015 К
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовШифрования();
	Свойства.ИдентификаторАлгоритмаШифрования = "1.2.643.7.1.1.5.2.1";
	Свойства.ИменаАлгоритмаШифрования = ИменаАлгоритмовШифрованияГОСТ_Р_34_12_2015_Кузнечик();
	Наборы.Добавить(Свойства);
	
	// ГОСТ Р 34.12-2015 М
	Свойства = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыйНаборАлгоритмовШифрования();
	Свойства.ИдентификаторАлгоритмаШифрования = "1.2.643.7.1.1.5.1.1";
	Свойства.ИменаАлгоритмаШифрования = ИменаАлгоритмовШифрованияГОСТ_Р_34_12_2015_Магма();
	Наборы.Добавить(Свойства);
	
	// Конец Локализация
	
КонецПроцедуры

// Добавляет национальные алгоритмы подписи в список актуальных алгоритмов.
// 
// Возвращаемое значение:
//  Массив
//
Функция АктуальныеАлгоритмыПрограмм() Экспорт
	
	Результат = Новый Массив;
	
	// Локализация
	Результат = ИменаАлгоритмовПодписиГОСТ_34_10_2012_256();
	// Конец Локализация
	
	Возврат Результат;
	
КонецФункции


// Только для внутреннего использования.
// 
// Параметры:
//  Сертификат - СертификатКриптографии
//  КонтекстПроверки - см. КонтекстПроверкиУдостоверяющегоЦентраСертификата
// 
// Возвращаемое значение:
//   См. ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПроверкиУдостоверяющегоЦентраПоУмолчанию
//
Функция РезультатПроверкиУдостоверяющегоЦентраСертификата(Сертификат, КонтекстПроверки) Экспорт
	
	РезультатПроверкиУдостоверяющегоЦентра = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПроверкиУдостоверяющегоЦентраПоУмолчанию();
	
	// Локализация
	
	ДанныеУдостоверяющегоЦентра = КонтекстПроверки.ДанныеУдостоверяющегоЦентра;
	Если ДанныеУдостоверяющегоЦентра = Неопределено Тогда
		
		Если КонтекстПроверки.ПроверятьСертификат = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТолькоКвалифицированные() Тогда
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Сертификат неквалифицированный, так как выпущен удостоверяющим центром %1, не аккредитованным на момент выпуска сертификата.'"),
				КонтекстПроверки.НаименованиеУдостоверяющегоЦентра);
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Ложь;
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = ТекстОшибки;
			Возврат РезультатПроверкиУдостоверяющегоЦентра;
		КонецЕсли;
		
		Возврат РезультатПроверкиУдостоверяющегоЦентра;
	КонецЕсли;
	
	РезультатПроверкиУдостоверяющегоЦентра.НайденВСпискеУдостоверяющихЦентров = Истина;
	РезультатПроверкиУдостоверяющегоЦентра.Государственный = ДанныеУдостоверяющегоЦентра.Государственный;
	
	СвойстваСертификата = КонтекстПроверки.СвойстваСертификата;
	ДатаВыдачиСертификатаДляСравнения = СвойстваСертификата.ДатаНачала - КонтекстПроверки.РазницаСУниверсальнымВременем;
	
	Количество = ДанныеУдостоверяющегоЦентра.ПериодыДействия.Количество();
	
	ЭтоКвалифицированныйСертификат = Ложь;
	
	Для НомерСКонца = 1 По Количество Цикл
		
		ПериодДействия = ДанныеУдостоверяющегоЦентра.ПериодыДействия[Количество - НомерСКонца];
		
		Если ДатаВыдачиСертификатаДляСравнения < ПериодДействия.ДатаС Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ПериодДействия.ДатаПо) Или ДатаВыдачиСертификатаДляСравнения <= ПериодДействия.ДатаПо Тогда
			ЭтоКвалифицированныйСертификат = Истина;
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если Не ЭтоКвалифицированныйСертификат Тогда
		
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Сертификат неквалифицированный, так как выпущен удостоверяющим центром %1, не аккредитованным на момент выпуска сертификата.'"),
				КонтекстПроверки.НаименованиеУдостоверяющегоЦентра);
				
		Если КонтекстПроверки.ПроверятьСертификат = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТолькоКвалифицированные() Тогда
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Ложь;
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = ТекстОшибки;
			Возврат РезультатПроверкиУдостоверяющегоЦентра;
		КонецЕсли;
		
		Если КонтекстПроверки.ЭтоПроверкаПодписи Тогда
			РезультатПроверкиУдостоверяющегоЦентра.Действует = ДанныеУдостоверяющегоЦентра.РазрешенныйНеаккредитованный;
			Если ДанныеУдостоверяющегоЦентра.РазрешенныйНеаккредитованный Тогда
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ДополнительныеСведения = ТекстОшибки;
			Иначе
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = ТекстОшибки;
			КонецЕсли;
		Иначе
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ДополнительныеСведения = ТекстОшибки;
		КонецЕсли;
		Возврат РезультатПроверкиУдостоверяющегоЦентра;
	КонецЕсли;
	
	РезультатПроверкиУдостоверяющегоЦентра.Действует = Ложь;
	РезультатПроверкиУдостоверяющегоЦентра.ЭтоКвалифицированныйСертификат = Истина;
	
	НаДату = КонтекстПроверки.НаДату;
	ДатаДляСравнения = НаДату - КонтекстПроверки.РазницаСУниверсальнымВременем;
	
	ДатаПрекращенияАккредитацииУЦ = Неопределено;
	
	Для НомерСКонца = 1 По Количество Цикл
		
		ПериодДействия = ДанныеУдостоверяющегоЦентра.ПериодыДействия[Количество - НомерСКонца];
		
		Если ДатаДляСравнения < ПериодДействия.ДатаС Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ПериодДействия.ДатаПо) Или ДатаДляСравнения <= ПериодДействия.ДатаПо Тогда
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Истина;
			Прервать;
		КонецЕсли;
		
		Если ДатаДляСравнения > ПериодДействия.ДатаПо Тогда
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Ложь;
			ДатаПрекращенияАккредитацииУЦ = ПериодДействия.ДатаПо + КонтекстПроверки.РазницаСУниверсальнымВременем;
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	СвойстваСубъекта = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСубъектаСертификата(Сертификат);
	ЭтоИННФизЛица = ЗначениеЗаполнено(СвойстваСубъекта.ИНН) И ЭтоИННФизЛица(СвойстваСубъекта.ИНН);
	
	ЭтоЮридическоеЛицо = ЗначениеЗаполнено(СвойстваСубъекта.ИННЮЛ) Или Не ЭтоИННФизЛица;
	ЭтоИндивидуальныйПредприниматель = ЗначениеЗаполнено(СвойстваСубъекта.ОГРНИП);
	ЭтоОбезличенныйСертификат = Не ЗначениеЗаполнено(СвойстваСубъекта.Фамилия);
	ЭтоФизическоеЛицо = Не ЭтоЮридическоеЛицо И Не ЭтоИндивидуальныйПредприниматель;
	
	ДатаПрекращенияДействия = ДанныеУдостоверяющегоЦентра.ДругиеНастройки.Получить("ДатаПрекращенияДействияСертификатовВыданныхКоммерческимиУЦ");
	Если ЗначениеЗаполнено(ДатаПрекращенияДействия) Тогда
		ДатаПрекращенияДействия = ДатаПрекращенияДействия + КонтекстПроверки.РазницаСУниверсальнымВременем;
	КонецЕсли;
	
	Если ЭтоОбезличенныйСертификат И Не ДанныеУдостоверяющегоЦентра.Государственный Тогда
		РезультатПроверкиУдостоверяющегоЦентра = ЭлектроннаяПодписьСлужебныйКлиентСервер.РезультатПроверкиУдостоверяющегоЦентраПоУмолчанию();
		Возврат РезультатПроверкиУдостоверяющегоЦентра;
	КонецЕсли;
	
	ВозможенПеревыпуск = ЭтоФизическоеЛицо Или Не ДанныеУдостоверяющегоЦентра.Государственный;
	
	// Аккредитация удостоверяющего центра прекращена.
	Если Не РезультатПроверкиУдостоверяющегоЦентра.Действует Тогда
		
		Если ЗначениеЗаполнено(ДатаПрекращенияАккредитацииУЦ) 
			И (СтрНачинаетсяС(КонтекстПроверки.ЗначенияПоиска, "1024001434049") И ДатаПрекращенияАккредитацииУЦ - КонтекстПроверки.РазницаСУниверсальнымВременем = Дата(2024, 7, 20, 21, 0, 0)
			 Или СтрНачинаетсяС(КонтекстПроверки.ЗначенияПоиска, "1197746000000") И ДатаПрекращенияАккредитацииУЦ - КонтекстПроверки.РазницаСУниверсальнымВременем = Дата(2024, 8, 16, 21, 0, 0)) Тогда
			
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Ложь;
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.РазрешитьПодписание = Ложь;
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Сертификат не действует с %1, так как аккредитация удостоверяющего центра %2, выдавшего сертификат, прекращена.'"),
				Формат(ДатаПрекращенияАккредитацииУЦ, "ДЛФ=DT"), КонтекстПроверки.НаименованиеУдостоверяющегоЦентра);
			Если Не КонтекстПроверки.ЭтоПроверкаПодписи Тогда
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Подайте <a href = ""%1"">заявление</a> на новый сертификат.'"), "ПодатьЗаявлениеНаСертификат");
			КонецЕсли;
			Возврат РезультатПроверкиУдостоверяющегоЦентра;
		КонецЕсли;
		
		Если ДанныеУдостоверяющегоЦентра.РазрешенныйНеаккредитованный Тогда
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Истина;
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ДополнительныеСведения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Сертификат выдан удостоверяющим центром %1, аккредитация которого прекращена %2, но использование разрешено администратором.'"),
				КонтекстПроверки.НаименованиеУдостоверяющегоЦентра,
				Формат(ДатаПрекращенияАккредитацииУЦ, "ДЛФ=DT"));
			Возврат РезультатПроверкиУдостоверяющегоЦентра;
		КонецЕсли;
		
		РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Сертификат не действует с %1, так как аккредитация удостоверяющего центра %2, выдавшего сертификат, прекращена.'"),
				Формат(ДатаПрекращенияАккредитацииУЦ, "ДЛФ=DT"), КонтекстПроверки.НаименованиеУдостоверяющегоЦентра);
				
		РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.РазрешитьПодписание = Ложь;
			
		Если Не КонтекстПроверки.ЭтоПроверкаПодписи Тогда
			
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ВозможенПеревыпуск = ВозможенПеревыпуск;
			
			Если ВозможенПеревыпуск Тогда
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Подайте <a href = ""%1"">заявление</a> на новый сертификат. Если юридическая значимость подписей не требуется, добавьте удостоверяющий центр %2 в <a href = ""%3"">список разрешенных</a> неаккредитованных УЦ.'"),
					"ПодатьЗаявлениеНаСертификат", КонтекстПроверки.НаименованиеУдостоверяющегоЦентра,
					"ДобавитьУдостоверяющийЦентрВСписокРазрешенныхНеаккредитованных");
			Иначе
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Получите новый сертификат в <a href = ""%1"">соответствующем удостоверяющем центре</a>. Если юридическая значимость подписей не требуется, добавьте удостоверяющий центр %2 в <a href = ""%3"">список разрешенных</a> неаккредитованных УЦ.'"),
					СсылкаНаСтатьюОбУдостоверяющихЦентрах(), КонтекстПроверки.НаименованиеУдостоверяющегоЦентра,
					"ДобавитьУдостоверяющийЦентрВСписокРазрешенныхНеаккредитованных");
			КонецЕсли;
			
		КонецЕсли;
		
		Возврат РезультатПроверкиУдостоверяющегоЦентра;
		
	КонецЕсли;
	
	ДатаПредупреждения = Неопределено;
	
	// Сертификаты ЮЛ и ИП, выданные коммерческими АУЦ не действуют или не будут действовать.
	Если Не ДанныеУдостоверяющегоЦентра.Государственный И Не ЭтоФизическоеЛицо Тогда
		
		ДатаОкончанияВыдачиСертификатовСотрудниковКоммерческимиУЦ = ДатаОкончанияВыдачиСертификатовСотрудниковКоммерческимиУЦ();
		
		Если СвойстваСертификата.ДатаНачала - КонтекстПроверки.РазницаСУниверсальнымВременем > ДатаОкончанияВыдачиСертификатовСотрудниковКоммерческимиУЦ Тогда
			
			РезультатПроверкиУдостоверяющегоЦентра.Действует = Ложь;
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ВозможенПеревыпуск = Ложь;
	
			ТекстОшибки = НСтр(
				"ru = 'Сертификат не действует, так как выдан коммерческим аккредитованным удостоверяющим центром после %1.'");
	
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				ТекстОшибки, Формат(ДатаОкончанияВыдачиСертификатовСотрудниковКоммерческимиУЦ, "ДЛФ=D"));
				
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Причина = НСтр(
				"ru = 'Сертификаты юридическим лицам и индивидуальным предпринимателям выдают только государственные удостоверяющие центры.'");
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
				"ru = 'Если это тестовый сертификат, поставьте флажок <b>Разрешить подписание</b> в <a href=""%1"">карточке сертификата</a>.'"), "ОткрытьСертификат");

		ИначеЕсли ДатаПрекращенияДействия <> Неопределено И (НаДату >= ДатаПрекращенияДействия 
			Или НаДату + 30*24*60*60 >= ДатаПрекращенияДействия И Не КонтекстПроверки.ЭтоПроверкаПодписи) Тогда
		
			РезультатПроверкиУдостоверяющегоЦентра.Действует = (НаДату < ДатаПрекращенияДействия);
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ВозможенПеревыпуск = Истина;
	
			Если НаДату < ДатаПрекращенияДействия Тогда
				Если ЭтоИндивидуальныйПредприниматель Тогда
					ТекстОшибки = НСтр(
						"ru = 'С %1 нельзя будет подписывать документы этим сертификатом, так как не будут действовать сертификаты, выданные коммерческими аккредитованными удостоверяющими центрами индивидуальным предпринимателям.'");
				Иначе
					ТекстОшибки = НСтр(
						"ru = 'С %1 нельзя будет подписывать документы этим сертификатом, так как не будут действовать сертификаты, выданные коммерческими аккредитованными удостоверяющими центрами юридическим лицам и их сотрудникам.'");
				КонецЕсли;
				ДатаПредупреждения = ДатаПрекращенияДействия;
			Иначе
				Если ЭтоИндивидуальныйПредприниматель Тогда
					ТекстОшибки = НСтр(
						"ru = 'Сертификат не действует c %1, так как с этой даты не действуют сертификаты, выданные коммерческими аккредитованными удостоверяющими центрами индивидуальным предпринимателям.'");
				Иначе
					ТекстОшибки = НСтр(
						"ru = 'Сертификат не действует c %1, так как с этой даты не действуют сертификаты, выданные коммерческими аккредитованными удостоверяющими центрами юридическим лицам и их сотрудникам.'");
				КонецЕсли;
			КонецЕсли;
	
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				ТекстОшибки, Формат(ДатаПрекращенияДействия, "ДЛФ=D"));
	
			Если Не КонтекстПроверки.ЭтоПроверкаПодписи Тогда
	
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ДополнительныеСведения = РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ТекстОшибки;
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Подайте <a href = ""%1"">заявление</a> на новый сертификат.'"), "ПодатьЗаявлениеНаСертификат");
			
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Не РезультатПроверкиУдостоверяющегоЦентра.Действует Или КонтекстПроверки.ЭтоПроверкаПодписи Тогда
		
		Возврат РезультатПроверкиУдостоверяющегоЦентра;
		
	КонецЕсли;
	
	Если СвойстваСертификата.ДействителенДо < НаДату Тогда
		Возврат РезультатПроверкиУдостоверяющегоЦентра;
	КонецЕсли;
	
	// Аккредитация удостоверяющего центра скоро закончится.
	Если ЗначениеЗаполнено(ДанныеУдостоверяющегоЦентра.ДатаОкончанияДействия) Тогда
		
		ДатаОкончанияДействия = ДанныеУдостоверяющегоЦентра.ДатаОкончанияДействия + КонтекстПроверки.РазницаСУниверсальнымВременем;
		
		Если ДатаОкончанияДействия > НаДату 
			И (ДатаПредупреждения = Неопределено Или ДатаОкончанияДействия < ДатаПредупреждения) Тогда
			
			ДатаПредупреждения = ДатаОкончанияДействия;
			
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ДополнительныеСведения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'С %1 нельзя будет подписывать документы этим сертификатом, так как аккредитация удостоверяющего центра %2, выдавшего сертификат, будет прекращена.'"),
			Формат(ДатаОкончанияДействия, "ДЛФ=D"), КонтекстПроверки.НаименованиеУдостоверяющегоЦентра);
			
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ВозможенПеревыпуск = ВозможенПеревыпуск;
			
			Если ВозможенПеревыпуск Тогда
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Подайте <a href = ""%1"">заявление</a> на новый сертификат.'"), "ПодатьЗаявлениеНаСертификат");
			Иначе
				РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Получите новый сертификат в <a href = ""%1"">соответствующем удостоверяющем центре</a>.'"),
					СсылкаНаСтатьюОбУдостоверяющихЦентрах());
			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
	
	// Срок действия сертификата скоро закончится.
	Если СвойстваСертификата.ДействителенДо <= НаДату + КоличествоДнейДляОповещенияОбОкончанииСрокаДействия()*24*60*60
		И (ДатаПредупреждения = Неопределено Или СвойстваСертификата.ДействителенДо < ДатаПредупреждения)Тогда
		
		РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ДополнительныеСведения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'С %1 нельзя будет подписывать документы этим сертификатом, так как срок действия сертификата закончится.'"),
			Формат(СвойстваСертификата.ДействителенДо, "ДЛФ=D"));
		
		РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.ВозможенПеревыпуск = ВозможенПеревыпуск;
			
		Если ВозможенПеревыпуск Тогда
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Подайте <a href = ""%1"">заявление</a> на новый сертификат.'"), "ПодатьЗаявлениеНаСертификат");
		Иначе
			РезультатПроверкиУдостоверяющегоЦентра.Предупреждение.Решение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Получите новый сертификат в <a href = ""%1"">соответствующем удостоверяющем центре</a>.'"),
					СсылкаНаСтатьюОбУдостоверяющихЦентрах());
		КонецЕсли;
	КонецЕсли;
	
	// Конец Локализация
	
	Возврат РезультатПроверкиУдостоверяющегоЦентра;
	
КонецФункции

// При получении имени программы электронной подписи.
// 
// Параметры:
//  Криптопровайдер - Структура
//  Результат - Строка
//
Процедура ПриПолученииИмениПрограммыЭлектроннойПодписи(Криптопровайдер, Результат) Экспорт
	
	// Локализация
	
	Если ПустаяСтрока(Криптопровайдер.Идентификатор) Тогда
		Возврат;
	КонецЕсли;
	
	Если СтрНайти(Криптопровайдер.Идентификатор, "CryptoPro") <> 0 Тогда
		Результат = ИмяПрограммыКриптоПро();
		Возврат;
	КонецЕсли;
	
	Если СтрНайти(Криптопровайдер.Идентификатор, "VipNet") <> 0 Тогда
		Результат = ИмяПрограммыVipNet();
		Возврат;
	КонецЕсли;
	
	Если СтрНайти(Криптопровайдер.Идентификатор, "Lissi") <> 0 Тогда
		Результат = НСтр("ru = 'ЛИССИ CSP'");
		Возврат;
	КонецЕсли;
	
	Если СтрНайти(Криптопровайдер.Идентификатор, "SignalCom") <> 0 Тогда
		Результат = НСтр("ru = 'Сигнал-КОМ CSP'");
		Возврат;
	КонецЕсли;
	
	// Конец Локализация
	
КонецПроцедуры

// Это ошибка из-за не установленных библиотек токена.
// 
// Параметры:
//  ТекстОшибки - Строка
//  Результат - Булево
//
Процедура ПриОпределенииОшибкиЗагрузкиБиблиотекТокена(ТекстОшибки, Результат) Экспорт
	
	// Локализация
	Если ТекстОшибки = НеУстановленаПанельРутокен()
		Или ТекстОшибки = НеУстановленЕдиныйКлиентДжакарта()
		Или ТекстОшибки = НеУстановленаOpenSSL()
		Или ТекстОшибки = НеУстановленБиблиотекаИнтеграцииСOpenSSL() Тогда
		Результат = Истина;
	КонецЕсли;
	// Конец Локализация
	
КонецПроцедуры

// Ссылка на статью об удостоверяющих центрах.
// 
// Возвращаемое значение:
//  Строка - ссылка на статью об удостоверяющих центрах
//
Функция СсылкаНаСтатьюОбУдостоверяющихЦентрах() Экспорт
	
	Ссылка = "";
	// Локализация
	Ссылка = "https://its.1c.ru/bmk/esig_uc";
	// Конец Локализация
	Возврат Ссылка;
	
КонецФункции

#КонецОбласти

// Локализация

#Область СлужебныеПроцедурыИФункции

// Контекст проверки удостоверяющего центра сертификата.
// 
// Возвращаемое значение:
//  Структура
//
Функция КонтекстПроверкиУдостоверяющегоЦентраСертификата() Экспорт
	
	Структура = Новый Структура;
	
	Структура.Вставить("ДанныеУдостоверяющегоЦентра");
	Структура.Вставить("ЗначенияПоиска");
	Структура.Вставить("НаименованиеУдостоверяющегоЦентра", "");
	Структура.Вставить("РазницаСУниверсальнымВременем");
	Структура.Вставить("НаДату");
	Структура.Вставить("ЭтоПроверкаПодписи", Ложь);
	Структура.Вставить("СвойстваСертификата");
	Структура.Вставить("ПроверятьСертификат", ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверятьКвалифицированные());
	
	Возврат Структура;
	
КонецФункции

Функция ДанныеДляПроверкиУдостоверяющегоЦентра(Сертификат) Экспорт
	
	Результат = Новый Структура("ЗначенияПоиска, НаименованиеУдостоверяющегоЦентра");
	
	СвойстваИздателя = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваИздателяСертификата(Сертификат);
	
	Результат.НаименованиеУдостоверяющегоЦентра = СвойстваИздателя.ОбщееИмя;
	
	ЗначенияПоиска = Новый Массив;
	
	Если СвойстваИздателя.Свойство("ОГРН") И ЗначениеЗаполнено(СвойстваИздателя.ОГРН) Тогда
		ЗначенияПоиска.Добавить(СвойстваИздателя.ОГРН);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(СвойстваИздателя.ОбщееИмя) Тогда
		ЗначенияПоиска.Добавить(СвойстваИздателя.ОбщееИмя);
	КонецЕсли;
	
	Если ЗначенияПоиска.Количество() > 0 Тогда
		Результат.ЗначенияПоиска = СтрСоединить(ЗначенияПоиска, ",");
	КонецЕсли;
	
	Возврат Результат;

КонецФункции

Функция ПодготовитьЗначениеПоиска(Знач ЗначениеПоиска) Экспорт
	
	ЗначениеПоиска = ВРег(ЗначениеПоиска);
	ЗначениеПоиска = СтрЗаменить(ЗначениеПоиска, """", "");
	ЗначениеПоиска = СтрЗаменить(ЗначениеПоиска, "«", "");
	ЗначениеПоиска = СтрЗаменить(ЗначениеПоиска, "»", "");
	ЗначениеПоиска = СтрЗаменить(ЗначениеПоиска, "“", "");
	ЗначениеПоиска = СтрЗаменить(ЗначениеПоиска, "”", "");
	
	Возврат ЗначениеПоиска;
	
КонецФункции

Функция ИмяПрограммыVipNet() Экспорт
	Возврат НСтр("ru = 'ViPNet CSP'");
КонецФункции

Функция ИмяПрограммыКриптоПро() Экспорт
	Возврат НСтр("ru = 'КриптоПро CSP'");
КонецФункции

Функция ВыполненОбходНарушенияОбратнойСовместимостиВVipNetCSP_4_4(ОписаниеПрограммы, Менеджер, АлгоритмШифрования = "")
	
	АлгоритмПодписи     = Строка(ОписаниеПрограммы.АлгоритмПодписи);
	АлгоритмХеширования = Строка(ОписаниеПрограммы.АлгоритмХеширования);
	Если ПустаяСтрока(АлгоритмШифрования) Тогда
		АлгоритмШифрования = ПреобразованныйАлгоритмШифрования(Строка(ОписаниеПрограммы.АлгоритмШифрования));
	Иначе
		АлгоритмШифрования = ПреобразованныйАлгоритмШифрования(АлгоритмШифрования);
	КонецЕсли;

#Если ВебКлиент Тогда
	
	Если ИменаАлгоритмовПодписиГОСТ_34_10_2012_256().Найти(АлгоритмПодписи) <> Неопределено Тогда
		АлгоритмПодписи = "1.2.643.7.1.1.1.1"; // ГОСТ 34.10-2012 256
	ИначеЕсли ИменаАлгоритмовПодписиГОСТ_34_10_2012_512().Найти(АлгоритмПодписи) <> Неопределено Тогда
		АлгоритмПодписи = "1.2.643.7.1.1.1.2"; // ГОСТ 34.10-2012 512
	КонецЕсли;

	Если ИменаАлгоритмовХешированияГОСТ_34_11_2012_256().Найти(АлгоритмХеширования) <> Неопределено Тогда
		АлгоритмХеширования = "1.2.643.7.1.1.2.2"; // ГОСТ 34.11-2012 256
	ИначеЕсли ИменаАлгоритмовХешированияГОСТ_34_11_2012_512().Найти(АлгоритмХеширования) <> Неопределено Тогда
		АлгоритмХеширования = "1.2.643.7.1.1.2.3"; // ГОСТ 34.11-2012 512
	КонецЕсли;

#Иначе
	Если Не (ОписаниеПрограммы.ИмяПрограммы = "Infotecs GOST 2012/512 Cryptographic Service Provider"
		И ОписаниеПрограммы.ТипПрограммы = 77) И Не (ОписаниеПрограммы.ИмяПрограммы = "Infotecs GOST 2012/1024 Cryptographic Service Provider"
		И ОписаниеПрограммы.ТипПрограммы = 78) Тогда
		Возврат Ложь;
	КонецЕсли;
#КонецЕсли

	АлгоритмыУстановлены = Истина;
	Попытка
		Менеджер.АлгоритмПодписи     = АлгоритмПодписи;
		Менеджер.АлгоритмХеширования = АлгоритмХеширования;
		Менеджер.АлгоритмШифрования  = АлгоритмШифрования;
	Исключение
		АлгоритмыУстановлены = Ложь;
	КонецПопытки;

	Если АлгоритмыУстановлены Тогда
		Возврат Истина;
	КонецЕсли;
	
	Если АлгоритмПодписи      = "GOST 34.10-2012 256"
		И АлгоритмХеширования = "GOST 34.11-2012 256" Тогда
		
		АлгоритмПодписи     = "GR 34.10-2012 256";
		АлгоритмХеширования = "GR 34.11-2012 256";
		
	ИначеЕсли АлгоритмПодписи = "GR 34.10-2012 256"
		И АлгоритмХеширования = "GR 34.11-2012 256" Тогда
	
		АлгоритмПодписи     = "GOST 34.10-2012 256";
		АлгоритмХеширования = "GOST 34.11-2012 256";
		
	ИначеЕсли АлгоритмПодписи = "GOST 34.10-2012 512"
		И АлгоритмХеширования = "GOST 34.11-2012 512" Тогда
		
		АлгоритмПодписи     = "GR 34.10-2012 512";
		АлгоритмХеширования = "GR 34.11-2012 512";
		
	ИначеЕсли АлгоритмПодписи = "GR 34.10-2012 512"
		И АлгоритмХеширования = "GR 34.11-2012 512" Тогда
	
		АлгоритмПодписи     = "GOST 34.10-2012 512";
		АлгоритмХеширования = "GOST 34.11-2012 512";
		
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
	АлгоритмыУстановлены = Истина;
	Попытка
		Менеджер.АлгоритмПодписи     = АлгоритмПодписи;
		Менеджер.АлгоритмХеширования = АлгоритмХеширования;
		Менеджер.АлгоритмШифрования  = АлгоритмШифрования;
	Исключение
		АлгоритмыУстановлены = Ложь;
	КонецПопытки;
	
	Возврат АлгоритмыУстановлены;
	
КонецФункции

Функция ИменаАлгоритмовПодписиГОСТ_34_10_94()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.10-94"); // Представление.
	Имена.Добавить("GOST R 34.10-94");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовПодписиГОСТ_34_10_2001()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.10-2001"); // Представление.
	Имена.Добавить("GOST R 34.10-2001");
	Имена.Добавить("ECR3410-CP");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовПодписиГОСТ_34_10_2012_256()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.10-2012 256"); // Представление.
	Имена.Добавить("GR 34.10-2012 256");
	Имена.Добавить("GOST 34.10-2012 256");
	Имена.Добавить("GOST R 34.10-12 256");
	Имена.Добавить("GOST3410-12-256");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовПодписиГОСТ_34_10_2012_512()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.10-2012 512"); // Представление.
	Имена.Добавить("GR 34.10-2012 512");
	Имена.Добавить("GOST 34.10-2012 512");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовХешированияГОСТ_34_11_94()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.11-94"); // Представление.
	Имена.Добавить("GOST R 34.11-94");
	Имена.Добавить("RUS-HASH-CP");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовХешированияГОСТ_34_11_2012_256()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.11-2012 256"); // Представление.
	Имена.Добавить("GR 34.11-2012 256");
	Имена.Добавить("GOST 34.11-2012 256");
	Имена.Добавить("GOST R 34.11-12 256");
	Имена.Добавить("GOST3411-12-256");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовХешированияГОСТ_34_11_2012_512()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 34.11-2012 512"); // Представление.
	Имена.Добавить("GR 34.11-2012 512");
	Имена.Добавить("GOST 34.11-2012 512");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовШифрованияГОСТ_28147_89()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ 28147-89"); // Представление.
	Имена.Добавить("GOST 28147-89");
	Имена.Добавить("GOST28147");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовШифрованияГОСТ_Р_34_12_2015_Кузнечик()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ Р 34.12-2015 К"); // Представление.
	Имена.Добавить("GR 34.12-15 K");
	Имена.Добавить("kuznyechik-ctracpkm");
	
	Возврат Имена;
	
КонецФункции

Функция ИменаАлгоритмовШифрованияГОСТ_Р_34_12_2015_Магма()
	
	Имена = Новый Массив;
	Имена.Добавить("ГОСТ Р 34.12-2015 М"); // Представление.
	Имена.Добавить("GR 34.12-15 M");
	Имена.Добавить("magma-ctracpkm");
	
	Возврат Имена;
	
КонецФункции

#Область ШаблоныКонвертаXML

Функция КонвертПоУмолчанию()
	
	Возврат "furs.mark.crpt.ru_v1";
	
КонецФункции

// Вариант "furs.mark.crpt.ru_v1".
Функция КонвертXML1()
	
	Возврат
	"<soap:Envelope
	|    xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""
	|    xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd""
	|    xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
	|  <soap:Header>
	|    <wsse:Security soap:actor=""http://smev.gosuslugi.ru/actors/smev"">
	|      <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#"">
	|        <SignedInfo xmlns=""http://www.w3.org/2000/09/xmldsig#"">
	|          <CanonicalizationMethod Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#""/>
	|          <SignatureMethod Algorithm=""%SignatureMethod%""/>
	|          <Reference URI=""#body"">
	|            <Transforms>
	|              <Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature""/>
	|              <Transform Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#""/>
	|            </Transforms>
	|            <DigestMethod Algorithm=""%DigestMethod%""/>
	|            <DigestValue>%DigestValue%</DigestValue>
	|          </Reference>
	|        </SignedInfo>
	|        <SignatureValue xmlns=""http://www.w3.org/2000/09/xmldsig#"">
	|          %SignatureValue%
	|        </SignatureValue>
	|        <ds:KeyInfo>
	|          <wsse:SecurityTokenReference>
	|            <wsse:Reference URI=""#SenderCertificate""
	|                            ValueType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3""/>
	|          </wsse:SecurityTokenReference>
	|        </ds:KeyInfo>
	|      </ds:Signature>
	|      <wsse:BinarySecurityToken
	|              EncodingType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary""
	|              ValueType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3""
	|              wsu:Id=""SenderCertificate"">
	|        %BinarySecurityToken%
	|      </wsse:BinarySecurityToken>
	|    </wsse:Security>
	|  </soap:Header>
	|  <soap:Body wsu:Id=""body"">
	|    %MessageXML%
	|  </soap:Body>
	|</soap:Envelope>";
	
КонецФункции

// Вариант "dmdk.goznak.ru_v1".
Функция КонвертXML2()
	
	Возврат
	"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""
	|    xmlns:ns=""urn://xsd.dmdk.goznak.ru/exchange/1.0""
	|    xmlns:ns1=""urn://xsd.dmdk.goznak.ru/batch/1.0""
	|    xmlns:ns2=""urn://xsd.dmdk.goznak.ru/contractor/1.0""
	|    xmlns:ns3=""urn://xsd.dmdk.goznak.ru/types/1.0"">
	|  <soapenv:Header />
	|  <soapenv:Body>
	|    <ns:CheckBatchRequest>
	|      <ns:CallerSignature>
	|        <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#"">
	|          <ds:SignedInfo>
	|            <ds:CanonicalizationMethod Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#"" />
	|            <ds:SignatureMethod Algorithm=""%SignatureMethod%"" />
	|            <ds:Reference URI=""#body"">
	|              <ds:Transforms>
	|                <ds:Transform Algorithm=""http://www.w3.org/2001/10/xml-exc-c14n#"" />
	|                <ds:Transform Algorithm=""urn://smev-gov-ru/xmldsig/transform"" />
	|              </ds:Transforms>
	|              <ds:DigestMethod Algorithm=""%DigestMethod%"" />
	|              <ds:DigestValue>%DigestValue%</ds:DigestValue>
	|            </ds:Reference>
	|          </ds:SignedInfo>
	|          <ds:SignatureValue>%SignatureValue%</ds:SignatureValue>
	|          <ds:KeyInfo>
	|            <ds:X509Data>
	|              <ds:X509Certificate>%BinarySecurityToken%</ds:X509Certificate>
	|            </ds:X509Data>
	|          </ds:KeyInfo>
	|        </ds:Signature>
	|      </ns:CallerSignature>
	|      <ns:RequestData Id=""body"">
	|        %MessageXML%
	|      </ns:RequestData>
	|    </ns:CheckBatchRequest>
	|  </soapenv:Body>
	|</soapenv:Envelope>";
	
КонецФункции

#КонецОбласти

Функция ПредставлениеСубъекта(Знач Сертификат, Знач Отчество) 
	
	Субъект = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваСубъектаСертификата(Сертификат);
	
	Если ЗначениеЗаполнено(Субъект.Фамилия)
	   И ЗначениеЗаполнено(Субъект.Имя) Тогда
		
		Представление = Субъект.Фамилия + " " + Субъект.Имя;
		
	ИначеЕсли ЗначениеЗаполнено(Субъект.Фамилия) Тогда
		Представление = Субъект.Фамилия;
		
	ИначеЕсли ЗначениеЗаполнено(Субъект.Имя) Тогда
		Представление = Субъект.Имя;
	КонецЕсли;
	
	Если Отчество И ЗначениеЗаполнено(Субъект.Отчество) Тогда
		Представление = Представление + " " + Субъект.Отчество;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Представление) Тогда
		Если ЗначениеЗаполнено(Субъект.Организация) Тогда
			Представление = Представление + ", " + Субъект.Организация;
		КонецЕсли;
		Если ЗначениеЗаполнено(Субъект.Подразделение) Тогда
			Представление = Представление + ", " + Субъект.Подразделение;
		КонецЕсли;
		Если ЗначениеЗаполнено(Субъект.Должность) Тогда
			Представление = Представление + ", " + Субъект.Должность;
		КонецЕсли;
		
	ИначеЕсли ЗначениеЗаполнено(Субъект.ОбщееИмя) Тогда
		Представление = Субъект.ОбщееИмя;
	КонецЕсли;
	Возврат Представление;
	
КонецФункции

Функция ПодготовитьСтроку(СтрокаИзСертификата)
	Возврат СокрЛП(ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(СтрокаИзСертификата));
КонецФункции

Функция ЭтоИННФизЛица(ИНН)
	
	Если СтрДлина(ИНН) <> 12 Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Для НомерСимвола = 1 По 12 Цикл
		Если СтрНайти("0123456789", Сред(ИНН,НомерСимвола,1)) = 0 Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Если СтрНачинаетсяС(ИНН, "00") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

Процедура ЗаполнитьИНН(Свойства, Данные)
	
	ИННЮЛ = Неопределено;
	ИНН = Неопределено;
	
	Если Данные.Свойство("INN") Тогда
		ИНН = Данные.INN;
	ИначеЕсли Данные.Свойство("OID1_2_643_3_131_1_1") Тогда
		ИНН = ПодготовитьСтроку(Данные.OID1_2_643_3_131_1_1);
	КонецЕсли;
	
	Если Данные.Свойство("INNLE") Тогда
		ИННЮЛ = Данные.INNLE;
	ИначеЕсли Данные.Свойство("OID1_2_643_100_4")
			И СтрДлина(Данные.OID1_2_643_100_4) = 10 Тогда
		ИННЮЛ = ПодготовитьСтроку(Данные.OID1_2_643_100_4);
	ИначеЕсли Данные.Свойство("_1_2_643_100_4") Тогда
		ИННЮЛ = ПодготовитьСтроку(Данные._1_2_643_100_4);
	КонецЕсли;
		
	Свойства.ИННЮЛ = ИННЮЛ;
	Свойства.ИНН = ИНН;
	
КонецПроцедуры

Функция КоличествоДнейДляОповещенияОбОкончанииСрокаДействия()
	
	Возврат 30;
	
КонецФункции

Функция ДатаОкончанияВыдачиСертификатовСотрудниковКоммерческимиУЦ()

	Возврат Дата(2023, 08, 31, 21, 0, 0); // Универсальная дата от московского времени.

КонецФункции

Функция НеУстановленаПанельРутокен() Экспорт
	Возврат НСтр("ru= 'Не установлена Панель управления Рутокен.'");
КонецФункции

Функция НеУстановленаOpenSSL() Экспорт
	Возврат НСтр("ru= 'Требуется установка библиотеки OpenSSL.'");
КонецФункции

Функция НеУстановленБиблиотекаИнтеграцииСOpenSSL() Экспорт
	Возврат НСтр("ru= 'Требуется установка библиотеки интеграции с OpenSSL rtengine.dll.'");
КонецФункции

Функция НеУстановленЕдиныйКлиентДжакарта() Экспорт
	Возврат НСтр("ru= 'Не установлен Единый клиент JaCarta.'");
КонецФункции

#КонецОбласти

// Конец Локализация