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

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
	НастроитьЭлементыФормы();

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

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

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

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

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

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

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

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

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

Процедура КоличествоПотоковОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Элемент.Значение = 1;

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

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

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

Процедура ДобавитьВРезультатыПоследнийПрочитанныйОбъект()

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

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

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

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

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

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

Процедура ИмяФайлаПриИзменении(Элемент)
	
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	
КонецПроцедуры

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

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирКлиент.СоздатьМенеджерСохраненияНастроекФормыЛкс(ЭтаФорма);
	Панель1ПриСменеСтраницы();
	ирКлиент.УстановитьДоступностьВыполненияНаСервереЛкс(ЭтаФорма);
	ирКлиент.НастроитьПоляВводаПараметровПотоковЛкс(ЭтаФорма);
	
КонецПроцедуры

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

Процедура ОбновлениеОтображения()
	
	ЭтаФорма.КоличествоОшибок = РезультатОбработки.Количество();
	
КонецПроцедуры

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

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

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

Процедура УзелОтбораОбъектовПриИзменении(Элемент)
	
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	
КонецПроцедуры

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

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

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник); 

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

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

Процедура ОбработчикОжиданияСПараметрамиЛкс() Экспорт 
	
	ирКлиент.ОбработчикОжиданияСПараметрамиЛкс();

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

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	
КонецПроцедуры

Процедура ДействияФормыПараметрыЗаписи(Кнопка)
	
	ирКлиент.ОткрытьОбщиеПараметрыЗаписиЛкс();
	
КонецПроцедуры

Процедура РезультатЗагрузкиПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

Процедура РезультатЗагрузкиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);

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

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);

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

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

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

Процедура НастроитьЭлементыФормы()
	
	ДоступностьМногопоточности = ВыполнятьНаСервере И ЭлементыФормы.ВыполнятьНаСервере.Доступность И Не ирКэш.ЛиФайловаяБазаЛкс();
	ЭлементыФормы.КоличествоПотоков.Доступность = ДоступностьМногопоточности;
	ЭлементыФормы.КоличествоОбъектовВПорции.Доступность = КоличествоПотоков > 1 И ДоступностьМногопоточности;
	
КонецПроцедуры

Процедура ВыполнятьНаСервереПриИзменении(Элемент)
	
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

Процедура ТипыВыгружаемыеПоСсылкеПриИзменении(Элемент)

	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, "ТипыВыгружаемыеПоСсылке");

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

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

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

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирВыгрузкаЗагрузкаДанныхЧерезФайл.Форма.Форма");


