﻿&НаСервереБезКонтекста
Процедура ПроверитьОбработкуНаВозможностьПодключения(ИмяОбработки)
	Обработка = ВнешниеОбработки.Создать(ИмяОбработки,Ложь);
	Попытка
		ПараметрыОбработки = Обработка.ПараметрыОбработки();
	Исключение
		// значит параметры не указаны
		Возврат;
	КонецПопытки;
	
	IgnoreOn82 = Ложь;
	ПараметрыОбработки.Свойство("IgnoreOn82",IgnoreOn82);
	
	Если IgnoreOn82 Тогда
		СистемнаяИнформация = Новый СистемнаяИнформация;
		Если Лев(СистемнаяИнформация.ВерсияПриложения,4) = "8.2." Тогда
			ИмяОбработки = Неопределено;
		Иначе
			Попытка
				ТекущийРежимСовместимости = Вычислить("Метаданные.РежимСовместимости");
				РежимыСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости;
			Исключение
				Возврат;
			КонецПопытки;
			
			Если ТекущийРежимСовместимости = РежимыСовместимости.Версия8_1 Тогда
				ИмяОбработки = Неопределено;
			ИначеЕсли ТекущийРежимСовместимости = РежимыСовместимости.Версия8_2_13 Тогда
				ИмяОбработки = Неопределено;
			ИначеЕсли ТекущийРежимСовместимости = РежимыСовместимости.Версия8_2_16 Тогда
				ИмяОбработки = Неопределено;
			КонецЕсли;	 

		КонецЕсли;	 
	КонецЕсли;	 
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт
	
	Результат = Новый Массив;
	
	// для обеспечения обратной совместимости
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Строка) Тогда 
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
		
	Позиция = Найти(Строка, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Строка, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Результат.Добавить(Подстрока);
		КонецЕсли;
		Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
		Позиция = Найти(Строка, Разделитель);
	КонецЦикла;
	
	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
		Результат.Добавить(Строка);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции 


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

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


&НаСервереБезКонтекста
Функция ПолучитьЗначениеКонстантыСервер(ИмяКонстанты)
	Возврат Константы[ИмяКонстанты].Получить();
КонецФункции	

&НаКлиенте
Процедура ПодключениеОбработкиПродолжение(ИмяОбработки)
	ФормаОбработки = ПолучитьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма.УправляемаяФорма");
	ФормаОбработки.Объект.ЗагрузкаФичПриОткрытии = "Не загружать";
	ФормаОбработки.Открыть();
КонецПроцедуры 

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

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

&НаСервереБезКонтекста
Функция УзнатьЕстьПоддержкаНемодальныхФорм()
	СистемнаяИнформация = Новый СистемнаяИнформация;
	Массив1 = РазложитьСтрокуВМассивПодстрок(СистемнаяИнформация.ВерсияПриложения, ".");
	Массив2 = РазложитьСтрокуВМассивПодстрок("8.3.3.641", ".");
	
	Версия1БольшеИлиРавно = Истина;
	Для Ккк = 0 По Массив1.Количество() - 1 Цикл
		Элем1 = Массив1.Получить(Ккк);
		Элем2 = Массив2.Получить(Ккк);
		
		Если Число(Элем2) > Число(Элем1) Тогда
			Версия1БольшеИлиРавно = Ложь;
		ИначеЕсли Число(Элем2) < Число(Элем1) Тогда
			Прервать;
		КонецЕсли;	 
	КонецЦикла;
	
	Возврат Версия1БольшеИлиРавно;
КонецФункции

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ЕстьПоддержкаНемодальныхФорм    = ЕстьПоддержкаНемодальныхФорм();
	ЕстьПоддержкаАсинхронныхВызовов = ЕстьПоддержкаАсинхронныхВызовов();
	ЕстьЗащитаОтОпасныхДействий     = ЕстьЗащитаОтОпасныхДействий();
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЕстьПоддержкаНемодальныхФорм()
	СистемнаяИнформация = Новый СистемнаяИнформация;
	Массив1 = РазложитьСтрокуВМассивПодстрок(СистемнаяИнформация.ВерсияПриложения, ".");
	Массив2 = РазложитьСтрокуВМассивПодстрок("8.3.3.641", ".");
	
	Версия1БольшеИлиРавно = Истина;
	Для Ккк = 0 По Массив1.Количество() - 1 Цикл
		Элем1 = Массив1.Получить(Ккк);
		Элем2 = Массив2.Получить(Ккк);
		
		Если Число(Элем2) > Число(Элем1) Тогда
			Версия1БольшеИлиРавно = Ложь;
		ИначеЕсли Число(Элем2) < Число(Элем1) Тогда
			Прервать;
		КонецЕсли;	 
	КонецЦикла;
	
	Возврат Версия1БольшеИлиРавно;
КонецФункции

&НаСервереБезКонтекста
Функция ЕстьПоддержкаАсинхронныхВызовов()
	СистемнаяИнформация = Новый СистемнаяИнформация;
	
	Версия1БольшеИлиРавно = ВерсияПриложенияБольшеИлиРавнаЧемЗаданная(СистемнаяИнформация.ВерсияПриложения,"8.3.5.1383");
	
	Рез = Версия1БольшеИлиРавно И Вычислить("Метаданные.РежимИспользованияСинхронныхВызововРасширенийИВнешнихКомпонент <> Метаданные.СвойстваОбъектов.РежимИспользованияСинхронныхВызововРасширенийИВнешнихКомпонент.Использовать");
	
	Возврат Рез;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ВерсияПриложенияБольшеИлиРавнаЧемЗаданная(Версия1, Версия2) Экспорт
	Массив1 = РазложитьСтрокуВМассивПодстрок(Версия1, ".");
	Массив2 = РазложитьСтрокуВМассивПодстрок(Версия2, ".");
	
	Версия1БольшеИлиРавно = Истина;
	Для Ккк = 0 По Массив1.Количество() - 1 Цикл
		Элем1 = Массив1.Получить(Ккк);
		Элем2 = Массив2.Получить(Ккк);
		
		Если Число(Элем2) > Число(Элем1) Тогда
			Версия1БольшеИлиРавно = Ложь;
		ИначеЕсли Число(Элем2) < Число(Элем1) Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Версия1БольшеИлиРавно;
КонецФункции
