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

Перем мНепустыеЗначения Экспорт ;
Перем мПлатформа Экспорт;
Перем мТекущееПолноеИмяМД Экспорт;

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

Функция ГлобальныйТестОбъектов(ЭтаФорма = Неопределено) Экспорт
	
	#Если ВнешнееСоединение Тогда
		СбойноеИмяМД = мТекущееПолноеИмяМД;
	#КонецЕсли
	ТипыМетаданных = ирКэш.Получить().ПолучитьТаблицуТиповМетаОбъектов(Истина, Ложь, Ложь);
	ИндикаторТиповМетаданных = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТипыМетаданных.Количество(), "Объекты. Типы метаданных");
	Для Каждого СтрокаТипаМетаданных Из ТипыМетаданных Цикл
		ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТиповМетаданных);
		Если ирОбщий.ЛиКорневойТипРегистраБДЛкс(СтрокаТипаМетаданных.Единственное) Тогда
			Подтип = "НаборЗаписей";
		ИначеЕсли СтрокаТипаМетаданных.Единственное = "Константа" Тогда 
			Подтип = "МенеджерЗначения";
		Иначе //Если ирОбщий.ЛиКорневойТипСсылкиЛкс(СтрокаТипаМетаданных.Единственное) Тогда
			Подтип = "Объект";
		КонецЕсли; 
		Если Ложь
			//Или СтрокаТипаМетаданных.Единственное = "ПланОбмена" // Временно. Антибаг платформы 8.2.16.352 http://partners.v8.1c.ru/forum/thread.jsp?id=1080147#1080147
			Или СтрокаТипаМетаданных.Единственное = "Перечисление"
			Или СтрокаТипаМетаданных.Единственное = "Перерасчет"
		Тогда
			Продолжить;
		КонецЕсли; 
		КоллекцияМетаОбъектов = Метаданные[СтрокаТипаМетаданных.Множественное];
		Индикатор2 = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаОбъектов.Количество(), СтрокаТипаМетаданных.Множественное);
		Для Каждого МетаОбъект Из КоллекцияМетаОбъектов Цикл
			ирОбщий.ОбработатьИндикаторЛкс(Индикатор2);
			КоличествоОшибок = Ошибки.Количество();
			мТекущееПолноеИмяМД = МетаОбъект.ПолноеИмя();
			#Если ВнешнееСоединение Тогда
				Если СбойноеИмяМД <> Неопределено Тогда 
					Если СбойноеИмяМД = мТекущееПолноеИмяМД Тогда
						СбойноеИмяМД = Неопределено;
					КонецЕсли; 
					Продолжить;
				КонецЕсли; 
			#КонецЕсли
			Если Истина
				И ОбъектыМетаданных.Количество() > 0
				И ОбъектыМетаданных.НайтиПоЗначению(мТекущееПолноеИмяМД) = Неопределено
			Тогда
				Продолжить;
			КонецЕсли; 
			ИмяОперации = мТекущееПолноеИмяМД + ".Объект";
			Если ВыводитьСообщения Тогда
				Сообщить("" + ТекущаяДата() + " " + ИмяОперации);
			КонецЕсли; 
			ИмяТипаОбъекта = СтрЗаменить(мТекущееПолноеИмяМД, ".", Подтип + ".");
			Попытка
				Объект = Новый (ИмяТипаОбъекта); // Ошибки инициализации здесь все равно не ловятся попыткой. Проектное решение 1С https://partners.v8.1c.ru/forum/t/1302121/m/1302121 
			Исключение
				ИнформацияОбОшибке = ИнформацияОбОшибке();
				ОписаниеОшибки = ИнформацияОбОшибке.Описание;
				Если Найти(ОписаниеОшибки, "Тип не определен") <> 1 Тогда
					ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке, 1);
				КонецЕсли; 
				Продолжить;
			КонецПопытки; 
			НачатьТранзакцию();
			Попытка
				Если Подтип = "Объект" Тогда
					МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(МетаОбъект);
					Если ирОбщий.ЛиКорневойТипСсылкиЛкс(СтрокаТипаМетаданных.Единственное) Тогда
						ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ " + МетаОбъект.ПолноеИмя() + " КАК Т";
						МассивТиповСтрок = Новый Массив;
						МассивТиповСтрок.Добавить(Ложь);
						Если ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаОбъект) Тогда
							ТекстЗапроса = ТекстЗапроса + " ГДЕ Т.ЭтоГруппа = &ЭтоГруппа";
							МассивТиповСтрок.Добавить(Истина);
						КонецЕсли; 
						Запрос = Новый Запрос(ТекстЗапроса);
						Для Каждого ТипСтроки Из МассивТиповСтрок Цикл
							Если ПравоДоступа("Изменение", МетаОбъект) Тогда
								Запрос.УстановитьПараметр("ЭтоГруппа", ТипСтроки);
								Выборка = Запрос.Выполнить().Выбрать();
								Если Выборка.Следующий() Тогда 
									Объект = Выборка.Ссылка.ПолучитьОбъект();
									ПроверитьСсылочныйОбъект(Объект, ИмяОперации, СтрокаТипаМетаданных.Единственное);
									Если ПравоДоступа("Добавление", МетаОбъект) Тогда
										КопияОбъекта = Выборка.Ссылка.Скопировать();
										ПроверитьСсылочныйОбъект(КопияОбъекта, ИмяОперации, СтрокаТипаМетаданных.Единственное, Истина);
									КонецЕсли; 
								КонецЕсли;
							КонецЕсли; 
							Если ПравоДоступа("Добавление", МетаОбъект) Тогда
								Объект = ирОбщий.СоздатьСсылочныйОбъектПоМетаданнымЛкс(МетаОбъект);
								ЗаполнитьРеквизитыНепустымиЗначениями(Объект, МетаОбъект);
								Объект.Скопировать();
								Если ПравоДоступа("Изменение", МетаОбъект) Тогда
									ПроверитьСсылочныйОбъект(Объект, ИмяОперации, СтрокаТипаМетаданных.Единственное, Истина);
								КонецЕсли; 
							КонецЕсли; 
						КонецЦикла;
					КонецЕсли; 
				ИначеЕсли Подтип = "НаборЗаписей" Тогда
					Если ПравоДоступа("Изменение", МетаОбъект) Тогда
						МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(МетаОбъект); // Создаем чисто для проверки компиляции модуля менеджера
						СтрокаНабора = Объект.Добавить();
						ЗаполнитьРеквизитыНепустымиЗначениями(СтрокаНабора, МетаОбъект);
						Для Каждого ЭлементОтбора Из Объект.Отбор Цикл
							ЭлементОтбора.Установить(СтрокаНабора[ЭлементОтбора.Имя]);
						КонецЦикла;
						ирОбщий.ЗаполнитьНаборЗаписейПоОтборуЛкс(Объект);
						Попытка
							ирОбщий.ЗаписатьОбъектЛкс(Объект);
						Исключение
							ОтменитьТранзакцию();
							Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда 
								ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
							КонецЕсли; 
							НачатьТранзакцию();
						КонецПопытки;
					КонецЕсли; 
				Иначе
					Если ПравоДоступа("Изменение", МетаОбъект) Тогда
						Попытка
							ирОбщий.ЗаписатьОбъектЛкс(Объект);
						Исключение
							ОтменитьТранзакцию();
							Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда 
								ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
							КонецЕсли; 
							НачатьТранзакцию();
						КонецПопытки;
					КонецЕсли; 
				КонецЕсли; 
			Исключение
				// Сюда попадаем при ошибках не при записи
				ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке());
			КонецПопытки;
			ОтменитьТранзакцию();
			Если ЭтаФорма <> Неопределено Тогда
				Если КоличествоОшибок <> Ошибки.Количество() Тогда
					ЭтаФорма.ОбновитьОтображение();
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла;
		ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	
КонецФункции

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

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

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

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

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

Функция ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки)
	
	Для Каждого Сигнатура Из ИгнорируемыеСигнатуры Цикл
		Если Сигнатура.Пометка И Найти(ОписаниеОшибки, Сигнатура.Строка) > 0 Тогда
			Возврат Истина;
		КонецЕсли; 
	КонецЦикла;
	Возврат Ложь;
	
КонецФункции

Процедура ИнициализироватьНепустыеЗначения() Экспорт 
	
	мНепустыеЗначения = Новый Соответствие();
	мНепустыеЗначения.Вставить(Тип("Дата"), НачалоМесяца(ТекущаяДата()) + 33);
	мНепустыеЗначения.Вставить(Тип("Число"), 1);
	мНепустыеЗначения.Вставить(Тип("Строка"), "а");
	мНепустыеЗначения.Вставить(Тип("Булево"), Истина);
	мНепустыеЗначения.Вставить(Тип("ХранилищеЗначения"), Новый ХранилищеЗначения(Неопределено));
	мНепустыеЗначения.Вставить(Тип("ОписаниеТипов"), Новый ОписаниеТипов);
	мНепустыеЗначения.Вставить(Тип("УникальныйИдентификатор"), Новый УникальныйИдентификатор());

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

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

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