Документооборот с контролирующими органами / Ошибка отправки письма ВФНС / Модуль формы

файл
&НаКлиенте
Перем КонтекстЭДОКлиент Экспорт;

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

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

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

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

&НаКлиенте
Процедура ПослеПолученияКонтекстаЭДО(ВхКонтекст, ДопПараметры) Экспорт
	
	Если ВхКонтекст.КонтекстЭДО <> Неопределено Тогда 
		КонтекстЭДОКлиент = ВхКонтекст.КонтекстЭДО;
	КонецЕсли;
	
КонецПроцедуры

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


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

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


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

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

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

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

&НаСервере
Функция ПакетСДопДокуменами()

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

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

&НаСервере
Функция СоздатьСкан()

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

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

&НаСервере
Функция СкопироватьФайлыИзПисьмаВСканы()

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

&НаСервере
Функция РезультатПроверкиФайлов()

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

	КонецЦикла;
		
	Возврат ОписанияФайлов;
	
КонецФункции

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

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

&НаСервере
Функция СоздатьОпись(Сканы = Неопределено)

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

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


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

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