////ирПортативный Перем ирПортативный Экспорт;
////ирПортативный Перем ирОбщий Экспорт;
////ирПортативный Перем ирСервер Экспорт;
////ирПортативный Перем ирКэш Экспорт;
////ирПортативный Перем ирКлиент Экспорт;

//ирПортативный Перем ирПлатформа Экспорт;

Перем мКэшТиповВнешнихМетаданных Экспорт;
Перем мНеПодключеныОбработки Экспорт;
Перем мВнешниеМодули Экспорт;
Перем мКаталогОбработки Экспорт;
Перем мКартинки;
Перем мПолучениеФорм;
Перем мИмяСервера;
Перем VBScript;
Перем мВерсия Экспорт;
Перем мКэшФункций;
Перем мСерверныйМодульДоступен;
Перем мСерверныйМодульСсылка;
Перем мДополнительныеОтчетыИОбработки;

//#Область ГлобальныеПортативныеМетоды
// Здесь выполняется программная замена при выпуске портативной версии
//#КонецОбласти

//#Область ОбработчикиИнициализацииФорм
// Здесь выполняется программная замена при выпуске портативной версии
//#КонецОбласти

Процедура ДобавитьСвязиВнешнихМодулей()
	
	Для А = 0 По мВнешниеМодули.ВГраница() Цикл
		Для Б = 0 По мВнешниеМодули.ВГраница() Цикл		
			ЭтотОбъект[мВнешниеМодули[А]][мВнешниеМодули[Б]] = ЭтотОбъект[мВнешниеМодули[Б]];
		КонецЦикла;
		//ЭтотОбъект[мВнешниеМодули[А]]["ирПортативный"] = ЭтаФорма;
	КонецЦикла;
	
КонецПроцедуры

Процедура Уничтожить() Экспорт
	
	Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
		//! ирКэш.ирПлатформа = 0 // ОбработкаОбъект.ирПлатформа
		Если ирКэш.ирПлатформа <> Неопределено Тогда 
			Если ирКэш.ирПлатформа.ирПортативный <> ЭтотОбъект Тогда // Такое возможно при вызове методов текущего объекта без открытия формы
				ирКэш.ирПлатформа.ирПортативный.Уничтожить();
			Иначе
				ирКэш.ирПлатформа.ирКэш = Неопределено;
			КонецЕсли; 
			ирКэш.ирПлатформа.Уничтожить(); // После открытия автодополнения ирПлатформа все равно залипает в памяти
		КонецЕсли; 
		ирКэш.ирПлатформа = Неопределено;
		ирОбщий.ирПлатформа = Неопределено; // Для подстраховки
		Для А = 0 По мВнешниеМодули.ВГраница() Цикл
			УничтожаемыйМодуль = ЭтотОбъект[мВнешниеМодули[А]];
			Если УничтожаемыйМодуль <> Неопределено Тогда 
				Для Б = 0 По мВнешниеМодули.ВГраница() Цикл
					УничтожаемыйМодуль[мВнешниеМодули[Б]] = Неопределено;
				КонецЦикла;
				УничтожаемыйМодуль["ирПортативный"] = Неопределено;
			Иначе
				// Такое возможно при вызове методов текущего объекта без открытия формы
				// при уничтожении неосновного экземпляра объекта ирПортативный
				Пустышка = 0;
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли; 
	мКэшФункций = Неопределено;
	мКэшТиповВнешнихМетаданных = Неопределено;
	мВнешниеМодули.Очистить();
	
КонецПроцедуры  

Процедура УсловныйДеструктор() Экспорт

	Контейнер = Новый Структура();
	#Если Клиент Тогда
	Оповестить("ирПолучитьБазовуюФорму", Контейнер);
	#КонецЕсли
	Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
		Уничтожить();
	КонецЕсли; 
		
КонецПроцедуры
 
Функция ПолучитьНастройкиПоУмолчанию()
	
	Результат = Новый Структура;
	Результат.Вставить("РасположениеПанелиЗапуска", 3); // Сверху
	Результат.Вставить("ОпределениеСерверногоВремени", 1); 
	Возврат Результат;
	
КонецФункции

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

Функция ПолучитьПолноеИмяФайлаНастроек() Экспорт
	
	ПолноеИмяФайла = мКаталогОбработки + "DevToolSettings.xml";
	Возврат ПолноеИмяФайла;

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

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

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

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

// получение списка обработок из файла настроек
Функция ПолучитьНастройкиИнструментовИзФайла() Экспорт
	
	НастройкиИзФайла = ПрочитатьНастройки();
	Если Истина
		И НастройкиИзФайла <> Неопределено 
		И НастройкиИзФайла.Свойство("СписокИнструментов")
	Тогда
		Возврат НастройкиИзФайла.СписокИнструментов;
	Иначе
		Возврат Неопределено;
	КонецЕсли; 
	
КонецФункции

// заполнение списка обработок стандартными настройками
Процедура ЗаполнитьСписокИнструментовСтандартныеНастройки() Экспорт
	
	СписокИнструментов.Очистить();
	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		 мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	мПлатформа.ЗаполнитьСписокИнструментов();
	Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
		ТаблицаСписка = мПлатформа.СписокИнструментов.Выгрузить(Новый Структура("Портативный", Истина));
	ИначеЕсли ирКэш.ЛиЭтоРасширениеКонфигурацииЛкс() Тогда
		ТаблицаСписка = мПлатформа.СписокИнструментов.Выгрузить(Новый Структура("Расширение", Истина));
	Иначе
		ТаблицаСписка = мПлатформа.СписокИнструментов.Выгрузить();
	КонецЕсли; 
	СписокИнструментов.Загрузить(ТаблицаСписка);
	
КонецПроцедуры

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

Процедура ПрочитатьСписокИнструментов() Экспорт 
	
	ЗаполнитьСписокИнструментовСтандартныеНастройки();
	ЗаполнитьСписокИнструментовПользовательскиеНастройки();

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

Функция ТекстСкриптаПолученияВремени()

	Текст =
	"Function GetServerTime(ServerName) 
	|	Set objWMIService = GetObject(""winmgmts:\\"" & ServerName & ""\root\cimv2"") 
	|	Set colItems = objWMIService.ExecQuery(""Select * from Win32_LocalTime"") 
	|	zeroString = ""0""
	|	For Each objItem in colItems
	|		year_ = CStr(objItem.Year)
	|       If len(year_) < 4 Then
	|			year = String(zeroString, 4 - len(year_)) + year_
	|       End If
	|		month_ = CStr(objItem.Month)
	|       If len(month_) = 1 Then
	|			month_ = zeroString + month_
	|       End If
	|		day_ = CStr(objItem.Day)
	|       If len(day_) = 1 Then
	|			day_ = zeroString + day_
	|       End If
	|		hour_ = CStr(objItem.Hour)
	|       If len(hour_) = 1 Then
	|			hour_ = zeroString + hour_
	|       End If
	|		minute_ = CStr(objItem.Minute)
	|       If len(minute_) = 1 Then
	|			minute_ = zeroString + minute_
	|       End If
	|		second_ = CStr(objItem.Second)
	|       If len(second_) = 1 Then
	|			second_ = zeroString + second_
	|       End If    
	|
	|		GetServerTime = CStr(year_) & CStr(month_) & CStr(day_) & CStr(hour_) & CStr(minute_) & CStr(second_)
	|		'Exit Function
	|	Next
	|End Function";
	
	Возврат Текст;

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

Функция ПолучитьТекущуюДатуСервера() Экспорт
	
	Если ирКЭШ.Получить().ЭтоФайловаяБаза Или ОпределениеСерверногоВремени = 1 Тогда
		Возврат ТекущаяДата();
	ИначеЕсли ОпределениеСерверногоВремени = 2 Тогда 
		Возврат ПолучитьОперативнуюОтметкуВремени();
	ИначеЕсли ОпределениеСерверногоВремени = 3 Тогда 
		Попытка
			Возврат Дата(VBScript.Run("GetServerTime", мИмяСервера));			
		Исключение
			ВызватьИсключение "Не удалось получить время сервера с помощью скрипта! Выберите другую опцию получения серверного времени в настройках инструментов!";		
		КонецПопытки;
	Иначе
		Возврат ТекущаяДата();
	КонецЕсли; 
	
КонецФункции

Функция СтрокиРавныЛкс(Знач Строка1, Знач Строка2, СУчетомРегистра = Ложь, БезПравыхНепечатныхСимволов = Ложь) Экспорт
	
	Если Не СУчетомРегистра Тогда
		Строка1 = НРег(Строка1);
		Строка2 = НРег(Строка2);
	КонецЕсли; 
	Если БезПравыхНепечатныхСимволов Тогда
		Строка1 = СокрП(Строка1);
		Строка2 = СокрП(Строка2);
	КонецЕсли; 
	Результат = Строка1 = Строка2;
	Возврат Результат;
	
КонецФункции

// копия ирКэш.РазделительПутиКФайлуЛкс
Функция РазделительПутиКФайлуЛкс() Экспорт 
	СисИнфо = Новый СистемнаяИнформация;
	Если Ложь
		Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86
		Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 
	Тогда 
		Разделитель = "\";
	Иначе
		Разделитель = "/";
	КонецЕсли;
   Возврат Разделитель;
КонецФункции

Функция ПолноеИмяФайлаПортативногоОбъектаМетаданныхЛкс(ИмяОбъекта, ТипМетаданных = "Обработка") Экспорт

	Если Ложь
		Или СтрокиРавныЛкс(ТипМетаданных, "Обработка") 
		Или СтрокиРавныЛкс(ТипМетаданных, "ВнешняяОбработка")
		Или СтрокиРавныЛкс(ТипМетаданных, "DataProcessor")
		Или СтрокиРавныЛкс(ТипМетаданных, "ExternalDataProcessor")
	Тогда
		Расширение = "epf";
	ИначеЕсли Ложь
		Или СтрокиРавныЛкс(ТипМетаданных, "Отчет") 
		Или СтрокиРавныЛкс(ТипМетаданных, "ВнешнийОтчет")
		Или СтрокиРавныЛкс(ТипМетаданных, "Report") 
		Или СтрокиРавныЛкс(ТипМетаданных, "ExternalReport")
	Тогда
		Расширение = "erf";
	Иначе
		ВызватьИсключение "Тип метаданных """ + ТипМетаданных + """ не поддерживается";
	КонецЕсли;
	Если ИмяОбъекта = Метаданные().Имя Тогда
		Результат = мКаталогОбработки + "" + ИмяОбъекта + "." + Расширение;
	Иначе
		Результат = мКаталогОбработки + "Модули" + РазделительПутиКФайлуЛкс() + ИмяОбъекта + "." + Расширение; 
	КонецЕсли; 
	Возврат Результат;

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

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

Функция ПолучитьМенеджерТипаМетаданныхЛкс(ТипМетаданных) Экспорт

	Если Ложь
		Или СтрокиРавныЛкс(ТипМетаданных, "Обработка") 
		Или СтрокиРавныЛкс(ТипМетаданных, "ВнешняяОбработка")
		Или СтрокиРавныЛкс(ТипМетаданных, "DataProcessor")
		Или СтрокиРавныЛкс(ТипМетаданных, "ExternalDataProcessor")
	Тогда
		Менеджер = ВнешниеОбработки;
	ИначеЕсли Ложь
		Или СтрокиРавныЛкс(ТипМетаданных, "Отчет") 
		Или СтрокиРавныЛкс(ТипМетаданных, "ВнешнийОтчет")
		Или СтрокиРавныЛкс(ТипМетаданных, "Report") 
		Или СтрокиРавныЛкс(ТипМетаданных, "ExternalReport")
	Тогда
		Менеджер = ВнешниеОтчеты;
	Иначе
		ВызватьИсключение "Тип метаданных """ + ТипМетаданных + """ не поддерживается";
	КонецЕсли;
	Возврат Менеджер;

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

Функция ПолучитьФормуЛкс(ИмяФормы, Параметры = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено) Экспорт
	
	Возврат мПолучениеФорм.ПолучитьФормуЛкс(ИмяФормы, Параметры, Владелец, Уникальность, Окно);
	
КонецФункции

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

Функция КаталогОбъектовДляОтладкиЛкс() Экспорт

	Результат = мКаталогОбработки + "ОбъектыДляОтладки\";
	ИмяКаталогаБазы = ирОбщий.ИдентификаторИзПредставленияЛкс(СтрокаСоединенияИнформационнойБазы());
	Результат = Результат + ИмяКаталогаБазы + "\";
	Каталог = Новый Файл(Результат);
	Если Не Каталог.Существует() Тогда
		СоздатьКаталог(Результат);
	КонецЕсли; 
	Возврат Результат;

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

Функция КэшФункцииЛкс(ИмяФункции) Экспорт 
	
	Если мКэшФункций = Неопределено Тогда
		мКэшФункций = Новый Соответствие;
	КонецЕсли; 
	КэшФункции = мКэшФункций[ИмяФункции];
	Если КэшФункции = Неопределено Тогда
		КэшФункции = Новый Соответствие;
		мКэшФункций[ИмяФункции] = КэшФункции;
	КонецЕсли; 
	Возврат КэшФункции;
	
КонецФункции

Процедура ОбновитьПовторноИспользуемыеЗначенияЛкс() Экспорт 
	
	мКэшФункций = Неопределено;
	
КонецПроцедуры

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

Процедура ВыполнитьСерверныйМетодЛкс(ИмяМетода, Параметры) Экспорт 

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

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

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

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

	Попытка
		VBScript = Новый COMОбъект("MSScriptControl.ScriptControl");
		VBScript.language = "vbscript";
		VBScript.AddCode(ТекстСкриптаПолученияВремени());
	Исключение
		// В 64-битном процессе этот класс недоступен
		VBScript = Неопределено;
	КонецПопытки;

	мВерсия = "3.80.1"; // Здесь выполняется программная замена при выпуске портативной версии
Исключение
	ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
	мНеПодключеныОбработки = Истина;
	Если ирКэш <> Неопределено Тогда
		Уничтожить();
	КонецЕсли; 
	ВызватьИсключение; 
КонецПопытки;
~ПрочитатьНастройки:
ПрочитатьНастройки();
мКэшТиповВнешнихМетаданных = Новый Соответствие;
~Конец:
