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

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

	ПользователиИБ.Очистить();
	СписокПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
	Для Каждого ТекПользователь Из СписокПользователей Цикл
		СтрокаПользователя = ПользователиИБ.Добавить();
		СтрокаПользователя.ИмяПользователя = ТекПользователь.Имя;
	КонецЦикла;
	ПользователиИБ.Сортировать("ИмяПользователя");
	
КонецПроцедуры

Процедура ДобавитьФормуВТаблицу(ПолноеИмяОбъекта, ПредставлениеОбъекта, ТипОбъекта, ВидОбъекта, КартинкаОбъекта)

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

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

Функция КартинкаПоТипуОбъекта(ТипОбъекта) Экспорт

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

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

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

Процедура ДобавитьСтандартнуюФорму(Префикс, ПрефиксПредставления, ОбъектМетаданных, Знач ИмяФормы, ПредставлениеОбъекта, ИмяОбъектаМетаданных, ИмяВидаОбъекта)
	
	Если ОбъектМетаданных["Основная" + СтрЗаменить(ИмяФормы, "ФормаВыбора", "ФормаДляВыбора")] = Неопределено Тогда
		ДобавитьФормуВТаблицу(Префикс + "." + ИмяФормы, ПрефиксПредставления + "." + ПредставлениеОбъекта, ИмяОбъектаМетаданных, ИмяВидаОбъекта, КартинкаПоТипуОбъекта(ИмяОбъектаМетаданных));
	КонецЕсли;
	
КонецПроцедуры

Функция ПолучитьМенеджерХранилищаПоИмени(ИмяРаздела) Экспорт 

	Если ИмяРаздела = "ХранилищеСистемныхНастроек" Тогда
		Возврат ХранилищеСистемныхНастроек;
	ИначеЕсли ИмяРаздела = "ХранилищеОбщихНастроек" Тогда
		Возврат ХранилищеОбщихНастроек;
	ИначеЕсли ИмяРаздела = "ХранилищеНастроекДанныхФорм" Тогда
		Возврат ХранилищеНастроекДанныхФорм;
	ИначеЕсли ИмяРаздела = "ХранилищеВариантовОтчетов" Тогда
		Возврат ХранилищеВариантовОтчетов;
	ИначеЕсли ИмяРаздела = "ХранилищеПользовательскихНастроекОтчетов" Тогда
		Возврат ХранилищеПользовательскихНастроекОтчетов;
	ИначеЕсли ИмяРаздела = "ХранилищеПользовательскихНастроекДинамическихСписков" Тогда
		Возврат Вычислить("ХранилищеПользовательскихНастроекДинамическихСписков"); // 8.3+
	ИначеЕсли ИмяРаздела = "ХранилищеВнешнихДанныхНавигационныхСсылок" Тогда
		Возврат Вычислить("ХранилищеВнешнихДанныхНавигационныхСсылок"); // Совместимость 8.3.19+
	Иначе
	    Возврат ХранилищаНастроек[ИмяРаздела];
	КонецЕсли;	

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

Процедура ПолучитьОписаниеНастроек(ПользователиНазначения, ФормыНазначения, ИмяРаздела, Знач ОтборКлючНастроек = "", Знач ОтборИмяОбъекта = "") Экспорт

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

Процедура ЗагрузитьНастройкиИзХранилища(Знач Отбор, Знач ФормыНазначения, Знач ИмяРаздела, Знач ОтборКлючНастроек = "", Знач ОтборИмяОбъекта = "")

	МенеджерХранилища = ПолучитьМенеджерХранилищаПоИмени(ИмяРаздела);
	#Если Сервер И Не Сервер Тогда
		ТаблицаФормыИБ = ФормыИБ;
		МенеджерХранилища = ХранилищеОбщихНастроек;
		Отбор = Новый Структура;
	#КонецЕсли
	Если ТипЗнч(МенеджерХранилища) <> Тип("СтандартноеХранилищеНастроекМенеджер") Тогда
		ИмяМД = Метаданные.НайтиПоТипу(ТипЗнч(МенеджерХранилища)).ПолноеИмя();
		ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонЛкс("Получение списка нестандартного хранилища настроек (%1) невозможно.", ИмяМД));
		Возврат;                                          
	КонецЕсли;
	Если Истина
		И Не ЛиНастройкиПоУмолчанию
		И ОтборПросмотраПриЗагрузке
		И (Ложь
			Или ЗначениеЗаполнено(ОтборИмяОбъекта)
			Или ЗначениеЗаполнено(ОтборКлючНастроек))
	Тогда
		ИмяТаблицыСУБД = ирКэш.СтруктураХраненияБДЛкс(Истина).Найти(ИмяРаздела, "ИмяТаблицы").ИмяТаблицыХранения;
		Условия = Новый Массив;
		Если ЗначениеЗаполнено(ОтборКлючНастроек) Тогда
			Условия.Добавить(Символы.ПС + "AND _SettingsKey LIKE '%' + '" + ОтборКлючНастроек + "' + '%'");
		КонецЕсли; 
		Если ЗначениеЗаполнено(ОтборИмяОбъекта) Тогда 
			Условия.Добавить(Символы.ПС + "AND _ObjectKey LIKE '%' + '" + ОтборИмяОбъекта + "' + '%'");
		КонецЕсли;
		Если Отбор.Свойство("Пользователь") Тогда
			Условия.Добавить(Символы.ПС + "AND _UserId = '" + Отбор.Пользователь + "'");
		КонецЕсли; 
		ТекстЗапроса = "SELECT _SettingsKey, _ObjectKey, _UserId FROM " + ИмяТаблицыСУБД + " WHERE 1=1 " + ирОбщий.СтрСоединитьЛкс(Условия, "");
		ТаблицаРезультата = ирОбщий.ВыполнитьЗапросЭтойСУБДЛкс(ТекстЗапроса);
		#Если Сервер И Не Сервер Тогда
			ТаблицаРезультата = Новый ТаблицаЗначений;
		#КонецЕсли
		Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТаблицаРезультата.Количество(), "Настройки");
		Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
			Отбор.Вставить("КлючОбъекта", СтрокаРезультата._ObjectKey);
			Отбор.Вставить("КлючНастроек", СтрокаРезультата._SettingsKey);
			Выборка = МенеджерХранилища.Выбрать(Отбор);
			ЗагрузитьНастройкиИзХранилищаФрагмент(Выборка, Индикатор, ФормыНазначения);
		КонецЦикла; 
	Иначе
		Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(, "Настройки");
		Если ЛиНастройкиПоУмолчанию Тогда
			Выборка = МенеджерХранилища.ВыбратьНастройкиПоУмолчанию(Отбор); 
		Иначе
			Выборка = МенеджерХранилища.Выбрать(Отбор); 
		КонецЕсли;
		ЗагрузитьНастройкиИзХранилищаФрагмент(Выборка, Индикатор, ФормыНазначения);
	КонецЕсли;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();

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

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

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

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

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

Процедура УстановитьЗначениеНастройкиВСтроке(Знач СтрокаТЧ, Знач ЗначениеНастройки) Экспорт 
	
	#Если Сервер И Не Сервер Тогда
		СтрокаТЧ = ОписаниеНастроек.Добавить();
	#КонецЕсли
	Если ТипЗнч(СтрокаТЧ.Настройка) <> ТипЗнч(ЗначениеНастройки) Тогда
		СтрокаТЧ.Настройка = ирОбщий.РасширенноеПредставлениеЛкс(ЗначениеНастройки,,,,,, 5);
	КонецЕсли; 
	СтрокаТЧ.ТипНастройки = ТипЗнч(ЗначениеНастройки);

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

Процедура УдалитьНастройкиПользователей(ТабКУдалению, ИмяРаздела) Экспорт

	МенеджерХранилища = ПолучитьМенеджерХранилищаПоИмени(ИмяРаздела);
	Для каждого Строка Из ТабКУдалению Цикл
		МенеджерХранилища.Удалить(Строка.КлючОбъекта, Строка.КлючНастроек, Строка.Пользователь);	
	КонецЦикла; 

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

Процедура СкопироватьНастройкиПользователей(ТабОписаний, ПользователиНазначения, ИмяРаздела) Экспорт

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

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

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

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

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

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

Процедура ОткрытьЗнач(текЗначениеНастройки, КлючУникальности = "") Экспорт

	ТипЗначенияНастройки = ТипЗнч(текЗначениеНастройки);
	Если ТипЗначенияНастройки = Тип("Строка") Тогда
		ирКлиент.ОткрытьТекстЛкс(текЗначениеНастройки, "XDTO " + ТипЗначенияНастройки, "");
	ИначеЕсли Ложь
		Или ТипЗначенияНастройки = Тип("Массив")
		Или ТипЗначенияНастройки = Тип("ФиксированныйМассив")
		Или ТипЗначенияНастройки = Тип("Структура")
		Или ТипЗначенияНастройки = Тип("ФиксированнаяСтруктура")
		Или ТипЗначенияНастройки = Тип("Соответствие")
		Или ТипЗначенияНастройки = Тип("ФиксированноеСоответствие")
		Или ТипЗначенияНастройки = Тип("СписокЗначений")
		Или ТипЗначенияНастройки = Тип("ТаблицаЗначений")
	Тогда
		ирОбщий.ИсследоватьЛкс(текЗначениеНастройки,, Истина);
	Иначе	
		ОткрытьАвто = Ложь;
		XMLТип = XMLТипЗнч(ТипЗначенияНастройки);
		Если Истина
			И XMLТип <> Неопределено
			И Найти(XMLТип.ИмяТипа, "Ref.") > 0
		Тогда
			ирКлиент.ОткрытьЗначениеЛкс(текЗначениеНастройки);
		Иначе
			Текст = ирОбщий.ОбъектВСтрокуXMLЛкс(текЗначениеНастройки,,, Ложь);
			Если Текст <> Неопределено Тогда
				ирКлиент.ОткрытьТекстЛкс(Текст, "XDTO " + ТипЗначенияНастройки, "XML", Истина);
			Иначе
				ирОбщий.ИсследоватьЛкс(текЗначениеНастройки);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

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

#КонецЕсли

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