Бизнес-сеть / Документы обмена без электронной подписи / Модуль формы

файл

#Область ОбработчикиСобытийФормы

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ЗначениеЗаполнено(ФоновоеЗаданиеПоиска) Тогда
		ОжидатьЗавершенияФоновогоЗадания(Ложь);
	КонецЕсли;

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

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
	
	ОбновитьСписокДокументов();
	
КонецПроцедуры

&НаКлиенте
Процедура ВидДокументаПриИзменении(Элемент)
	
	ОбновитьСписокДокументов();

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

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

&НаКлиенте
Процедура ОтборВидДокументаОчистка(Элемент, СтандартнаяОбработка)
	
	Если НесколькоВидовДокументовВОтборе Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОрганизацияОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	
	ОбновитьСписокДокументов();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокДокументов

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

&НаКлиенте
Процедура СписокДокументовПередУдалением(Элемент, Отказ)
	
	Если Элементы.Список.ВыделенныеСтроки.Количество() = 0 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выбрать документ.'"));
		Возврат;
	КонецЕсли;
	
	Отказ = Истина;
	Оповещение = Новый ОписаниеОповещения("УдалитьДокументВСервисеПослеВопроса", ЭтотОбъект);
	ТекстВопроса = НСтр("ru = 'Выделенные документы будут удалены в сервисе 1С:Бизнес-сеть.
							  |Документы учета информационной базы не изменятся.
							  |Продолжить выполнение операции?'");
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

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

&НаКлиенте
Процедура СписокДокументовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура Обновить(Команда)
	
	ОбновитьСписокДокументов();
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьДокумент(Команда)
	
	Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда
		ВывестиЭДНаПросмотр(Элементы.Список.ТекущиеДанные);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОтклонитьДокументы(Команда)
	
	Если Элементы.Список.ВыделенныеСтроки.Количество() = 0 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выбрать документ.'"));
		Возврат;
	КонецЕсли;
	
	Отказ = Истина;
	Оповещение = Новый ОписаниеОповещения("ОтклонитьДокументыПродолжение", ЭтотОбъект);
	ТекстВопроса = НСтр("ru = 'Выделенные документы будут отклонены для загрузки.
							  |Продолжить выполнение операции?'");
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

&НаКлиенте
Процедура НайтиДокументПоQRКоду(Команда)
	
	ОткрытьФорму("Обработка.БизнесСеть.Форма.ПоискДокументаПоQRКоду", , ЭтотОбъект);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

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

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

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

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

&НаКлиенте
Процедура ОбновитьСписокДокументов()
	
	СледующаяСтраница = Ложь;
	ПолучитьДокументыПродолжение(СледующаяСтраница);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

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

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

#Область Пейджинг

// Конструктор параметров страниц сервиса.
//
// Параметры:
//  РазмерСтраницы	 - Число - количество записей на одной странице для запроса.
//  Страница		 - Число - номер страницы для запроса.
// 
// Возвращаемое значение:
//  Структура - 
//    * Страница - Число - установленное значение.
//    * РазмерСтраницы - Число - установленное значение.
//    * КоличествоСтрок - Число - количество строк в ответе.
//    * КоличествоСтраниц - Число - количество страниц в ответе.
//
&НаСервере
Функция НовыеПараметрыСтраницСервиса(РазмерСтраницы = 0, Страница = 0)

	Результат = Новый Структура;
	Результат.Вставить("Страница",          Страница); // Номер страницы для запроса.
	Результат.Вставить("РазмерСтраницы",    РазмерСтраницы); // Количество записей на одной странице для запроса.
	
	Возврат Результат;
	
КонецФункции

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

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

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

&НаСервере
Процедура ЗагрузитьРезультатФоновогоЗадания(АдресРезультата, СледующаяСтраница)

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

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

&НаКлиенте
Процедура ПолучитьДокументыПродолжение(СледующаяСтраница)
	
	ОчиститьСообщения();
	
	Если Не ЗначениеЗаполнено(ОтборОрганизация) Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Не выбрана организация'"));
		Возврат;
	КонецЕсли;

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

#КонецОбласти

#Область Загрузка

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбработатьОшибкиФоновогоЗадания(Результат, Отказ = Ложь, ОшибкиВыведены = Ложь)

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

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

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

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

#КонецОбласти

#КонецОбласти

Связанные материалы