Документооборот с контролирующими органами / Настройки / Модуль формы

файл
&НаКлиенте
Перем КонтекстЭДО Экспорт;

#Область ОбработчикиСобытийФормы

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриОткрытииЗавершение", ЭтотОбъект);
	
	ДокументооборотСКОКлиент.ПолучитьКонтекстЭДО(ОписаниеОповещения);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	ПрограммноеЗакрытие = Не Модифицированность;
	
	ТекстПредупреждения = НСтр("ru = 'Настройки были изменены. Закрыть без сохранения?'");
	
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"ПриОтказеОтЗакрытияФормы", 
		ЭтотОбъект); 
	
	ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(
		ЭтотОбъект, 
		Отказ, 
		ЗавершениеРаботы,
		ТекстПредупреждения, 
		"ПрограммноеЗакрытие",
		ОписаниеОповещения);
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПолеМодульДокументооборотаПредставлениеОчистка(Элемент, СтандартнаяОбработка)
	
	ИзмененыСвойстваМодуля = Истина;
	ВерсияМодуля           = Неопределено;
	ДанныеМодуля           = Неопределено;
	Модифицированность     = Истина;
	
	УправлениеЭУ();
	
КонецПроцедуры

&НаКлиенте
Процедура ПолеИспользоватьВнешнийМодульПриИзменении(Элемент)
	
	ИзмененыСвойстваМодуля = Истина;
	
	УправлениеЭУ();
	
	Если ИспользоватьВнешнийМодуль Тогда
		ВыбратьВнешнийМодуль();
	ИначеЕсли НЕ ИспользоватьВнешнийМодуль Тогда
		
		ВерсияМодуля        = Неопределено;
		ДанныеМодуля        = Неопределено;
		Модифицированность  = Истина;
		
		УправлениеЭУ();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПолеРазрешитьОбновлениеМодуляПриИзменении(Элемент)
	
	УправлениеЭУ();
	
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПрограммЭлектроннойПодписиИШифрованияНажатие(Элемент)
	
	ЭлектроннаяПодписьКлиент.ОткрытьНастройкиЭлектроннойПодписиИШифрования("Программы");
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "Новая версия модуля документооборота зарегистрирована в информационной базе" Тогда
		
		ИзмененыСвойстваМодуля = Истина;
		Модифицированность     = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПолеМодульДокументооборотаПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыбратьВнешнийМодуль();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СообщенияДляРасшифровкиДругимиПользователямиНажатие(Элемент)
	
	Если ИспользоватьРежимТестирования Тогда
		ПараметрыПриложения["БРО.БольшеНеПоказыватьСообщенияТребующиеРасшифровки"] = Ложь;
		КонтекстЭДО.ПолучитьИОбработатьВходящиеКлиент();
		Возврат;
	КонецЕсли;
	
	ПараметрыПоказа = КонтекстЭДО.ПараметрыПоказаСообщенийТребующихРасшифровки();
	ПараметрыПоказа.ПоказДляТекущегоПользователя 	= Ложь;
	ПараметрыПоказа.ПоказДляДругихПользователей 	= Истина;
	ПараметрыПоказа.ВсеСообщения 					= Истина;
	
	ВходящиеСообщения = КонтекстЭДО.ПолучитьИОбработатьВходящие(УникальныйИдентификатор, ПараметрыПоказа);
	
	// оповещаем открытые формы
	Если ВходящиеСообщения <> Неопределено И ВходящиеСообщения.НовыеСообщения.Количество() > 0 Тогда
		Оповестить("Заполнение списка полученных сообщений", ВходящиеСообщения.НовыеСообщения);
	КонецЕсли;
	
	// выводим диалог
	Если ВходящиеСообщения <> Неопределено И ВходящиеСообщения.ТребующиеРасшифровки.Количество() > 0
		И КонтекстЭДО.ВыполнитьРасшифровкуПриНеобходимости(ВходящиеСообщения.ТребующиеРасшифровки, ПараметрыПоказа) Тогда
		
		Возврат;
	КонецЕсли;
	
	ПоказатьПредупреждение(, НСтр("ru = 'Нет нерасшифрованных сообщений для других пользователей.'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьТранспортныеКонтейнерыВАрхивеНажатие(Элемент)
	
	КонтекстЭДО.ПолучениеПеремещенныхФайлов(Новый Массив, Неопределено, "Архив", Неопределено);

КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура СохранитьИЗакрыть(Команда)
	
	Если СохранитьНастройки() Тогда
		
		Оповестить("ИзменениеНастроекДокументооборота");

		Если ИзмененыСвойстваМодуля Тогда
			ВопросПерезапуститьПрограммуПослеОбновленияМодуля();
		Иначе
			Закрыть();
		КонецЕсли;
		
	Иначе
		// При сохранении были выданы ошибки, форму не закрываем.
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьПараметрыПроксиСервера(Команда)
	
	ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера");
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьКомпоненту(Команда)
	
	ОбновитьГруппуВнешняяКомпонента(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСейчас(Команда)
	
	СохранитьНастройки();
	ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьСейчасЗавершение", ЭтотОбъект);
	ДокументооборотСКОКлиент.ПолучитьКонтекстЭДО(ОписаниеОповещения, Истина);

КонецПроцедуры

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

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

#Область ЗакрытиеФормы

&НаКлиенте
Процедура ВопросПерезапуститьПрограммуПослеОбновленияМодуля() Экспорт
	
	// Если модуль обновлен тогда предлагаем перезапуститься
	ТекстВопроса = "Изменения вступят в силу только после повторного открытия программы!
		|Перезапустить программу сейчас?";
		
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"ВопросПерезапуститьПрограммуПослеОбновленияМодуляЗавершение", 
		ЭтотОбъект);
		
	ПоказатьВопрос(
		ОписаниеОповещения, 
		ТекстВопроса, 
		РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросПерезапуститьПрограммуПослеОбновленияМодуляЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ЗавершитьРаботуСистемы(Истина, Истина);
	Иначе
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОтказеОтЗакрытияФормы(Результат, ВходящийКонтекст) Экспорт
	
	Модифицированность = Ложь;

КонецПроцедуры

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

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

&НаКлиенте
Процедура ПриОткрытииЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	КонтекстЭДО = Результат.КонтекстЭДО;
	
	УправлениеЭУ();
	
	ОбновитьГруппуВнешняяКомпонента();
	
	Если ИспользоватьРежимТестирования = Истина Тогда
		Оповещение = Новый ОписаниеОповещения("ПослеПоискаУстановленныхПрограмм", ЭтотОбъект, Ложь);
		ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы(Оповещение, , Неопределено);	
	КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьВерсиюВнешнегоМодуляИзФайла(Адрес, ВыбранноеИмяФайла)
	
	Файл = Новый Файл(ВыбранноеИмяФайла);
	// сохраняем обработку во временный файл
	Если Адрес <> Неопределено Тогда
		ИмяФайлаОбработки = КаталогВременныхФайлов() + Файл.Имя;
		ПолучитьИзВременногоХранилища(Адрес).Записать(ИмяФайлаОбработки);
	Иначе
		Возврат Неопределено
	КонецЕсли;
	
	// пытаемся извлечь версию внешнего модуля
	Попытка
		Результат = ВнешниеОбработки.Создать(ИмяФайлаОбработки).мВерсияМодуля;
	Исключение
		Результат = Неопределено;
	КонецПопытки;
	
	// удаляем временный файл обработки
	УдалитьФайлы(ИмяФайлаОбработки);
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ДобавитьСтрокуВТаблицуCSP(ИмяКриптопровайдера, КодCSP, ТипCSP)
	
	НовСтр = ТаблицаCSP.Добавить();
	НовСтр.Имя = ИмяКриптопровайдера;
	НовСтр.Код = КодCSP;
	НовСтр.Тип = ТипCSP;
	
КонецПроцедуры

&НаСервере
Процедура ВосстановитьНастройки()
	
	// читаем общие настройки
	Если ПравоДоступа("Чтение", Метаданные.Константы.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль) Тогда
		
		Если ОбщегоНазначения.РазделениеВключено() Тогда
			ТекстЗапроса =
				"ВЫБРАТЬ РАЗРЕШЕННЫЕ
				|	Константы.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль,
				|	Константы.ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля
				|ИЗ
				|	Константы КАК Константы";
				
			Запрос = Новый Запрос(ТекстЗапроса);
			Выборка = Запрос.Выполнить().Выбрать();
			Если Выборка.Следующий() Тогда
				
				ИспользоватьВнешнийМодуль 	= Выборка.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль;
				ВерсияМодуля 				= Выборка.ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля;
				
			КонецЕсли;
		КонецЕсли;
		
		ТекстЗапроса =
			"ВЫБРАТЬ РАЗРЕШЕННЫЕ"
			+ ?(НЕ ОбщегоНазначения.РазделениеВключено(), "
			|	Константы.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль,
			|	Константы.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль,
			|	Константы.ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля,",
			"") + "
			|	Константы.ДокументооборотСКонтролирующимиОрганами_ИмяКриптопровайдера,
			|	Константы.ДокументооборотСКонтролирующимиОрганами_ТипКриптопровайдера,
			|	Константы.ДокументооборотСКонтролирующимиОрганами_РежимТестирования
			|ИЗ
			|	Константы КАК Константы";
			
		Запрос = Новый Запрос(ТекстЗапроса);
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			
			Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда
				ИспользоватьВнешнийМодуль 	= Выборка.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль;
				ДанныеМодуля 				= Выборка.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль.Получить();
				ВерсияМодуля 				= Выборка.ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля;
			КонецЕсли;
			
			ИмяКриптопровайдера = Выборка.ДокументооборотСКонтролирующимиОрганами_ИмяКриптопровайдера;
			ТипКриптопровайдера = Выборка.ДокументооборотСКонтролирующимиОрганами_ТипКриптопровайдера;
			
			ИспользоватьРежимТестирования = Выборка.ДокументооборотСКонтролирующимиОрганами_РежимТестирования; 
			
			СтрCSP = ТаблицаCSP.НайтиСтроки(Новый Структура("Имя, Тип", ИмяКриптопровайдера, ТипКриптопровайдера));
			Если СтрCSP.Количество() > 0 Тогда
				Криптопровайдер = СтрCSP[0].Код;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	сохрРазрешитьОбновлениеМодуля = ХранилищеОбщихНастроек.Загрузить("ДокументооборотСКонтролирующимиОрганами_РазрешитьОнлайнОбновление");
	Если сохрРазрешитьОбновлениеМодуля = Неопределено Тогда
		сохрРазрешитьОбновлениеМодуля = ХранилищеОбщихНастроек.Загрузить("ДокументооборотСНалоговымиОрганами_РазрешитьОнлайнОбновление"); // прежнее имя параметра
	КонецЕсли;
	РазрешитьОбновлениеМодуля = (сохрРазрешитьОбновлениеМодуля = Истина);
	
КонецПроцедуры

&НаСервере
Функция СохранитьНастройки()
	
	Если ИспользоватьВнешнийМодуль И НЕ ОбщегоНазначения.РазделениеВключено() И НЕ ЗначениеЗаполнено(ДанныеМодуля) Тогда
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Выберите внешний модуль.'"));
		Возврат Ложь;
	КонецЕсли;
	
	ИзменениеВнешнегоМодуляРазрешено =
		(ПравоДоступа("Изменение", Метаданные.Константы.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль)
		И ПравоДоступа("Изменение", Метаданные.Константы.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль)
		ИЛИ ПравоДоступа("Изменение", Метаданные.Справочники.УчетныеЗаписиДокументооборота))
		И НЕ ОбщегоНазначения.РазделениеВключено();
	
	// сохраняем общие настройки
	Если ИзменениеВнешнегоМодуляРазрешено Тогда
		УстановитьПривилегированныйРежим(Истина);
	КонецЕсли;
	ИменаКонстантНабора =
		?(НЕ ОбщегоНазначения.РазделениеВключено(),
		"ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль,
		|ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль,
		|ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля,
		|",
		"")
		+ "ДокументооборотСКонтролирующимиОрганами_ИмяКриптопровайдера,
		|ДокументооборотСКонтролирующимиОрганами_ТипКриптопровайдера,
		|ДокументооборотСКонтролирующимиОрганами_РежимТестирования";
	КонстантыНабор = Константы.СоздатьНабор(ИменаКонстантНабора);
	
	Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда
		КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ИспользоватьВнешнийМодуль = ИспользоватьВнешнийМодуль;
		
		Если ЗначениеЗаполнено(ДанныеМодуля) Тогда
			Если ТипЗнч(ДанныеМодуля) = Тип("ДвоичныеДанные") Тогда 
				КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль = Новый ХранилищеЗначения(ДанныеМодуля);
			ИначеЕсли ЭтоАдресВременногоХранилища(ДанныеМодуля) Тогда 
				ДанныеМодуля = ПолучитьИзВременногоХранилища(ДанныеМодуля);
				КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль = Новый ХранилищеЗначения(ДанныеМодуля);
			КонецЕсли;
			КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля = ВерсияМодуля;
		Иначе
			КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль = Неопределено;
			КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ВерсияВнешнегоМодуля = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	ТаблицаCSPЗначение = РеквизитФормыВЗначение("ТаблицаCSP");
	СтрКриптопровайдер = ТаблицаCSPЗначение.Найти(Криптопровайдер, "Код");
	Если ЗначениеЗаполнено(СтрКриптопровайдер) Тогда
		// определение типа (программы) криптопровайдера и получение параметров с алгоритмом по умолчанию для него
		СвойстваКриптопровайдера = КриптографияЭДКОКлиентСервер.СвойстваКриптопровайдера(СтрКриптопровайдер.Имя, СтрКриптопровайдер.Тип);
		Если СвойстваКриптопровайдера <> Неопределено Тогда
			СтрКриптопровайдер = СвойстваКриптопровайдера;
			ПараметрыКриптопровайдера = КриптографияЭДКОКлиентСервер.СвойстваКриптопровайдераПоУмолчанию(СвойстваКриптопровайдера.ТипКриптопровайдера);
			Если ЗначениеЗаполнено(ПараметрыКриптопровайдера.Имя) ИЛИ ЗначениеЗаполнено(ПараметрыКриптопровайдера.Тип) Тогда
				СтрКриптопровайдер = СвойстваКриптопровайдера;
			КонецЕсли;
		КонецЕсли;
		
		КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ИмяКриптопровайдера = СтрКриптопровайдер.Имя;
		КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ТипКриптопровайдера = СтрКриптопровайдер.Тип;
		
	Иначе
		КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ИмяКриптопровайдера = Неопределено;
		КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_ТипКриптопровайдера = Неопределено;
	КонецЕсли;
	
	КонстантыНабор.ДокументооборотСКонтролирующимиОрганами_РежимТестирования = ИспользоватьРежимТестирования;
	
	КонстантыНабор.Записать();
	Если ИзменениеВнешнегоМодуляРазрешено Тогда
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;
	
	// сохраняем индивидуальные настройки
	ХранилищеОбщихНастроек.Сохранить("ДокументооборотСКонтролирующимиОрганами_РазрешитьОнлайнОбновление", , РазрешитьОбновлениеМодуля);
	
	ОбновитьПовторноИспользуемыеЗначения();
	
	Модифицированность 	= Ложь;
	
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Процедура ВыбратьВнешнийМодуль()
	
	ФайлыБылиВыбраны = Ложь;
	ДанныеМодуля = Неопределено;
	МодульДокументооборотаПредставление = "";

	ВыбранноеИмяФайла = "";
	ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьВнешнийМодульЗавершение", ЭтотОбъект);
	НачатьПомещениеФайла(ОписаниеОповещения, ДанныеМодуля, ВыбранноеИмяФайла, Истина, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьВнешнийМодульЗавершение(ФайлыБылиВыбраны, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	ВыбранКорректныйФайл = КонтекстЭДО.ВыбранКорректныйФайл(ВыбранноеИмяФайла, ".epf");
	Если НЕ ВыбранКорректныйФайл Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Загружать можно только файлы с расширением *.epf'"));
	Иначе
		ДанныеМодуля = Адрес;
		ВыбратьВнешнийМодульИзменитьПеременные(ФайлыБылиВыбраны, ВыбранноеИмяФайла);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьВнешнийМодульИзменитьПеременные(ФайлыБылиВыбраны, ВыбранноеИмяФайла)
	
	Если ФайлыБылиВыбраны И ЗначениеЗаполнено(ДанныеМодуля) Тогда
		стрВерсияМодуля = ПолучитьВерсиюВнешнегоМодуляИзФайла(ДанныеМодуля, ВыбранноеИмяФайла);
		Если стрВерсияМодуля = Неопределено Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Выбранный файл не является внешним модулем документооборота!'"));
			
		Иначе
			
			ВерсияМодуля           = стрВерсияМодуля;
			ИзмененыСвойстваМодуля = Истина;
			Модифицированность     = Истина;
			
			УправлениеЭУ();
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура УправлениеЭУВРежимеСервиса()
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда 
		Элементы.ГруппаВнешнийМодуль.Видимость = Ложь;
		Элементы.ГруппаПрокси.Видимость = Ложь;
		Элементы.ГруппаОбновлениеМодуля.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.ГруппаВнешнийМодульВРежимеСервиса.Видимость = ОбщегоНазначения.РазделениеВключено() И ИспользоватьВнешнийМодуль;
	
КонецПроцедуры

&НаКлиенте
Процедура УправлениеЭУ(ПослеЗаменыМодуля = Ложь)
	
	Если НЕ ПослеЗаменыМодуля Тогда
		// поле с представлением внешнего модуля делаем доступным только если установлен
		// признак использования внешнего модуля
		Элементы.ПолеМодульДокументооборотаПредставление.Доступность = ИспользоватьВнешнийМодуль;
	КонецЕсли;
	
	// формируем представление внешнего модуля
	Если НЕ ЗначениеЗаполнено(ДанныеМодуля) Тогда
		МодульДокументооборотаПредставление = "";
	Иначе
		МодульДокументооборотаПредставление = "";
		Если ЗначениеЗаполнено(ВерсияМодуля) Тогда
			МодульДокументооборотаПредставление = "Модуль версии " + ВерсияМодуля;
		КонецЕсли;
		Если НЕ ЗначениеЗаполнено(МодульДокументооборотаПредставление) И ЗначениеЗаполнено(ДанныеМодуля) Тогда
			МодульДокументооборотаПредставление = "Модуль загружен";
		КонецЕсли;
	КонецЕсли;
	
	Если НЕ ПослеЗаменыМодуля Тогда
		// формируем информацию о внешнем модуле для отображения в режиме сервиса
		Если ЗначениеЗаполнено(ВерсияМодуля) Тогда
			Элементы.ДекорацияЗагруженВнешнийМодульВРежимеСервиса.Заголовок = СтрШаблон(
				НСтр("ru = 'Загружен внешний модуль версии %1'"),
				ВерсияМодуля);
		Иначе
			Элементы.ДекорацияЗагруженВнешнийМодульВРежимеСервиса.Заголовок = НСтр("ru = 'Загружен внешний модуль'");
		КонецЕсли;
		
		//путь модуля криптографии задается лишь для линукса
		Если ОбщегоНазначенияЭДКОКлиент.ЭтоКриптопровайдерLinux() Тогда
			Элементы.ГруппаКриптография.Видимость = Истина;
			Элементы.ГруппаВнешняяКомпонента.Отображение = ОтображениеОбычнойГруппы.Нет;
		Иначе
			Элементы.ГруппаКриптография.Видимость = Ложь;
			Элементы.ГруппаВнешняяКомпонента.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьГруппуВнешняяКомпонента(ПредлагатьУстановкуКомпоненты = Ложь)
	
	Оповещение = Новый ОписаниеОповещения(
		"ОбновитьГруппуВнешняяКомпонентаЗавершение", ЭтотОбъект);
	КриптографияЭДКОКлиент.СоздатьМенеджерКриптографии(Оповещение, Ложь,, ПредлагатьУстановкуКомпоненты);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьГруппуВнешняяКомпонентаЗавершение(Результат, ВходящийКонтекст) Экспорт
	
	Если Результат.Выполнено Тогда
		//компонента установлена
		Элементы.ТекущийСтатус.Заголовок = НСтр("ru = 'Внешняя компонента: установлена.'");
		Элементы.УстановитьКомпоненту.Видимость = Ложь;
	Иначе
		//компонента не установлена
		Элементы.ТекущийСтатус.Заголовок = НСтр("ru = 'Внешняя компонента: не установлена.'");
		Элементы.УстановитьКомпоненту.Видимость = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПослеПоискаУстановленныхПрограмм(РезультатПоиска, Переключить) Экспорт 

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

&НаСервереБезКонтекста
Процедура ОчиститьФайлыСведенийСпецоператоры()
	
	УстановитьПривилегированныйРежим(Истина);
	
	НаборЗаписей = РегистрыСведений.ФайлыСведенийСпецоператоры.СоздатьНаборЗаписей();
	НаборЗаписей.Записать(Истина);
	
КонецПроцедуры

&НаКлиенте
Функция РезультатСоздатьМенеджерКриптографии()
	
	Результат = Новый Структура;
	Результат.Вставить("МенеджерКриптографии", Неопределено);
	Результат.Вставить("Выполнено", Ложь);
	Результат.Вставить("ИнформацияОбОшибке", "");
	Результат.Вставить("ИмяПрограммы", "");
	Результат.Вставить("ТипПрограммы", 1);

	Возврат Результат;
	
КонецФункции

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

&НаКлиенте
Процедура СоздатьМенеджерКриптографииЗавершениеПослеПолученияХранилища(Хранилище, КонтекстВозврата) Экспорт
	
	ДанныеДляТестовогоКонтура1С = ДанныеДляТестовогоКонтура1С();
	
	КонтекстВозврата.Вставить("ДанныеДляТестовогоКонтура1С", ДанныеДляТестовогоКонтура1С);
	КонтекстВозврата.Вставить("Количество", ДанныеДляТестовогоКонтура1С.Количество());
	КонтекстВозврата.Вставить("ТекущийНомер", 0);
	КонтекстВозврата.Вставить("Хранилище", Хранилище);

	ПолучениеСертификатовДляТестовогоКонтура1С(Неопределено, КонтекстВозврата)
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучениеСертификатовДляТестовогоКонтура1С(Результат, КонтекстВозврата) Экспорт
	
	Если Результат <> Неопределено Тогда
		СтруктураПредыдущейУчетнойЗаписи = КонтекстВозврата.ДанныеДляТестовогоКонтура1С[КонтекстВозврата.ТекущийНомер - 1];
		СтруктураПредыдущейУчетнойЗаписи.Вставить("Сертификат", Результат);
	КонецЕсли;
	
	Если КонтекстВозврата.ТекущийНомер < КонтекстВозврата.Количество Тогда 
		СтруктураУчетнойЗаписи = КонтекстВозврата.ДанныеДляТестовогоКонтура1С[КонтекстВозврата.ТекущийНомер];
		ОтпечатокДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(СтруктураУчетнойЗаписи.Отпечаток);
		
		КонтекстВозврата.ТекущийНомер = КонтекстВозврата.ТекущийНомер + 1;
		ОписаниеОповещения = Новый ОписаниеОповещения(
			"ПолучениеСертификатовДляТестовогоКонтура1С", 
			ЭтотОбъект, 
			КонтекстВозврата);
		КонтекстВозврата.Хранилище.НачатьПоискПоОтпечатку(ОписаниеОповещения, ОтпечатокДвоичныеДанные);
	Иначе
		КонтекстВозврата.ТекущийНомер = 0;
		ВыгрузкаСертификатовДляТестовогоКонтура1С(Неопределено, КонтекстВозврата)	
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
	
	ОписаниеПрограммы = Контекст.ОписаниеПрограммы;
	
	Если НЕ Подключено Тогда
		Если Контекст.БылаПопыткаУстановкиРасширения Тогда
			РезультатВыполнения = РезультатСоздатьМенеджерКриптографии();
			ВыполнитьОбработкуОповещения(Контекст.ОповещениеВозвратаМенеджерКриптографии, РезультатВыполнения);
		Иначе
			ОписаниеОповещения = Новый ОписаниеОповещения(
				"СоздатьМенеджерКриптографииПослеУстановкиРасширенияРаботыСКриптографией",
				ЭтотОбъект,
				Контекст
			);
			НачатьУстановкуРасширенияРаботыСКриптографией(ОписаниеОповещения);
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	Контекст.Вставить("МенеджерКриптографии", Неопределено);
	Контекст.МенеджерКриптографии = Новый МенеджерКриптографии;
	
	ЭтоLinux = Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент();
	
	Контекст.МенеджерКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения(
			"СоздатьМенеджерКриптографииЦиклПослеИнициализацииЗавершение", 
			ЭтотОбъект, 
			Контекст,
			"СоздатьМенеджерКриптографииЦиклПриОшибкеИнициализации", 
			ЭтотОбъект),
		ОписаниеПрограммы.ИмяПрограммы,
		?(ЭтоLinux, ЭлектроннаяПодписьКлиент.ПерсональныеНастройки().ПутиКПрограммамЭлектроннойПодписиИШифрования.Получить(ОписаниеПрограммы.Ссылка), ""),
		ОписаниеПрограммы.ТипПрограммы);
	
КонецПроцедуры
	
&НаКлиенте
Процедура СоздатьМенеджерКриптографииПослеУстановкиРасширенияРаботыСКриптографией(Контекст) Экспорт

	Контекст.БылаПопыткаУстановкиРасширения = Истина;
	// пытаемся ещё раз подключить расширение
	НачатьПодключениеРасширенияРаботыСКриптографией(
		Новый ОписаниеОповещения(
			"СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией",
			ЭтотОбъект,
			Контекст));

КонецПроцедуры

&НаКлиенте
Процедура СоздатьМенеджерКриптографииЦиклПослеИнициализацииЗавершение(МенеджерКриптографии, Контекст) Экспорт
	
	РезультатВыполнения = РезультатСоздатьМенеджерКриптографии();
	РезультатВыполнения.МенеджерКриптографии = МенеджерКриптографии;
	РезультатВыполнения.Выполнено = Истина;
	
	ВыполнитьОбработкуОповещения(Контекст.ОповещениеВозвратаМенеджерКриптографии, РезультатВыполнения);
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьМенеджерКриптографииЦиклПриОшибкеИнициализации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	РезультатВыполнения = РезультатСоздатьМенеджерКриптографии();
	РезультатВыполнения.ИнформацияОбОшибке = ИнформацияОбОшибке;
	
	ВыполнитьОбработкуОповещения(Контекст.ОповещениеВозвратаМенеджерКриптографии, РезультатВыполнения);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтразитьПодлючениеНаФорме(СтатусПодключения) Экспорт
	
	Если СтатусПодключения = "Недоступен" Тогда
		Элементы.ПереключитьТестовыйКонтур.Доступность = Ложь;
		Элементы.ПереключитьТестовыйКонтур.Видимость = Истина;
		Элементы.ПереключитьТестовыйКонтур.Заголовок = "Тестовый контур 1С не доступен";
		Элементы.ДекорацияКодыТестовогоКонтура1С.Видимость = Ложь;
	ИначеЕсли СтатусПодключения = "Отключен" Тогда
		Элементы.ПереключитьТестовыйКонтур.Доступность = Истина;
		Элементы.ПереключитьТестовыйКонтур.Видимость = Истина;
		Элементы.ПереключитьТестовыйКонтур.Заголовок = "Подключить тестовый контур 1С";
		Элементы.ДекорацияКодыТестовогоКонтура1С.Видимость = Ложь;
	ИначеЕсли СтатусПодключения = "Подключен" Тогда
		Элементы.ПереключитьТестовыйКонтур.Доступность = Истина;
		Элементы.ПереключитьТестовыйКонтур.Видимость = Истина;
		Элементы.ПереключитьТестовыйКонтур.Заголовок = "Отключить тестовый контур 1С";
		Элементы.ДекорацияКодыТестовогоКонтура1С.Видимость = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДанныеДляТестовогоКонтура1С()
	
	УстановитьПривилегированныйРежим(Истина);
														
	МассивРеквизитов = Новый Массив;
	МассивРеквизитов.Добавить("ИНН");
	МассивРеквизитов.Добавить("КПП");
	МассивРеквизитов.Добавить("ОГРН");
	МассивРеквизитов.Добавить("КодПоОКПО");
	МассивРеквизитов.Добавить("РегистрационныйНомерПФР");
	МассивРеквизитов.Добавить("РегистрационныйНомерФСС");
	
	ТекстЗапросаРеквизитов = "Организации.Наименование КАК Наименование";
	Для Каждого ЭлРеквизит Из МассивРеквизитов Цикл
		Если Метаданные.Справочники.Организации.Реквизиты.Найти(ЭлРеквизит) <> Неопределено Тогда
			ТекстЗапросаРеквизитов = ТекстЗапросаРеквизитов + ",
										|	Организации." + ЭлРеквизит + " КАК " + ЭлРеквизит;	
		КонецЕсли;
	КонецЦикла;
	
	Текст = "ВЫБРАТЬ
	        |	ПОДСТРОКА(УчетныеЗаписиДокументооборота.ИдентификаторАбонента, 4, 36) КАК ИдентификаторАбонента,
	        |	УчетныеЗаписиДокументооборота.ИдентификаторСпецоператора КАК ИдентификаторСпецоператора,
			|	УчетныеЗаписиДокументооборота.Ссылка КАК УчетнаяЗапись,
	        |	ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Фамилия, """") КАК Фамилия,
	        |	ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Имя, """") КАК Имя,
	        |	ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Отчество, """") КАК Отчество,
	        |	Организации.Ссылка КАК ОрганизацияСсылка,
	        |	&ТекстЗапросаРеквизитов КАК ТекстЗапросаРеквизитов
	        |ИЗ
	        |	Справочник.Организации КАК Организации
	        |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиДокументооборота КАК УчетныеЗаписиДокументооборота
	        |		ПО Организации.УчетнаяЗаписьОбмена = УчетныеЗаписиДокументооборота.Ссылка
	        |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОФизическихЛицСрезПоследних
	        |		ПО &ТекстСоединенияСФИО
	        |ГДЕ
	        |	Организации.ВидОбменаСКонтролирующимиОрганами = ЗНАЧЕНИЕ(Перечисление.ВидыОбменаСКонтролирующимиОрганами.ОбменВУниверсальномФормате)
	        |	И Организации.ПометкаУдаления = ЛОЖЬ
	        |	И УчетныеЗаписиДокументооборота.ПометкаУдаления = ЛОЖЬ";
	
	Текст = СтрЗаменить(Текст, "&ТекстЗапросаРеквизитов КАК ТекстЗапросаРеквизитов", ТекстЗапросаРеквизитов);
	
	Если Метаданные.Справочники.Организации.Реквизиты.Найти("ИндивидуальныйПредприниматель") <> Неопределено Тогда
		ТекстСоединенияСФИО = "(ФИОФизическихЛицСрезПоследних.ФизическоеЛицо = Организации.ИндивидуальныйПредприниматель)";
	Иначе
		ТекстСоединенияСФИО = "ЛОЖЬ";	
	КонецЕсли;         
	Текст = СтрЗаменить(Текст, "&ТекстСоединенияСФИО", ТекстСоединенияСФИО);
		
	ЗапросУчетныхЗаписей = Новый Запрос(Текст);
	
	РезультатЗапроса = ЗапросУчетныхЗаписей.Выполнить();
	ВыборкаУчетныхЗаписей = РезультатЗапроса.Выбрать();
	МассивДанных = Новый Массив;
	
	Пока ВыборкаУчетныхЗаписей.Следующий() Цикл
		
		Сертификат = Мультирежим.СертификатПользователя(ВыборкаУчетныхЗаписей.УчетнаяЗапись, "Отпечаток");
		Если НЕ Сертификат.Найден Тогда
			Продолжить;
		КонецЕсли;
		
		СтруктураУчетнойЗаписи = Новый Структура;
		СтруктураУчетнойЗаписи.Вставить("Отпечаток", Сертификат.Отпечаток);
		Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
			Если Колонка.Имя <> "УчетнаяЗапись"
				И Колонка.Имя <> "ОрганизацияСсылка" Тогда
				СтруктураУчетнойЗаписи.Вставить(Колонка.Имя, ВыборкаУчетныхЗаписей[Колонка.Имя]); 
			КонецЕсли;
		КонецЦикла;
		СтруктураУчетнойЗаписи.Вставить("ЭтоИП", РегламентированнаяОтчетностьПереопределяемый.ЭтоЮридическоеЛицо(ВыборкаУчетныхЗаписей.ОрганизацияСсылка) = Ложь);
		МассивДанных.Добавить(СтруктураУчетнойЗаписи);
	КонецЦикла;				
	
	Возврат МассивДанных;
			 
КонецФункции

&НаСервереБезКонтекста
Функция СтатусПодключенияКТестовомуКонтуру1С(Переключить = Ложь, ДанныеДляТестовогоКонтура1С = Неопределено)
	
	Возврат ДокументооборотСКО.СтатусПодключенияКТестовомуКонтуру1С(Переключить, ДанныеДляТестовогоКонтура1С);
	
КонецФункции

&НаКлиенте
Процедура ПереключитьТестовыйКонтур(Команда)
	
	Если ИспользоватьРежимТестирования = Истина Тогда
		Оповещение = Новый ОписаниеОповещения("ПослеПоискаУстановленныхПрограмм", ЭтотОбъект, Истина);
		ЭлектроннаяПодписьКлиент.НайтиУстановленныеПрограммы(Оповещение, , Неопределено);
	КонецЕсли;
	
КонецПроцедуры

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

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

Связанные материалы