Документооборот с контролирующими органами / Форма группового добавления сканов в заявление / Модуль формы

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

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

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

	ВидыДокументов = Параметры.ВидыДокументов;
	ИнициализироватьТаблицу(Параметры.Сканы);
	ЗаполнитьСписокВыбораВидаДокументов();
	УстановитьУсловноеОформление();

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ТаблицаВложенийПослеУдаления(Элемент)
	УстановитьМодифицированность(ЭтотОбъект);
КонецПроцедуры

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

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

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

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

&НаКлиенте
Функция ВидДокументаПоПредставлению(Представление)
	
	Для каждого ВидДокумента Из ВидыДокументов Цикл
		Если ВидДокумента.Значение.Представление = Представление Тогда
			Возврат ВидДокумента.Ключ;
		КонецЕсли;
	КонецЦикла;
	
	Возврат "";
	
КонецФункции 

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

				КонецЕсли;
			
			КонецЦикла;
			
		КонецЕсли;
	
	КонецЦикла; 
	
	Если ЕстьОшибка Тогда
		Возврат Ложь;
	КонецЕсли;
		
	Возврат Истина;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ИнициализироватьТаблицу(Сканы)
	
	Если Сканы <> Неопределено Тогда
		Для каждого Скан Из Сканы Цикл
			ДобавитьСтрокуТаблицы(Скан);
		КонецЦикла; 
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Функция ВидПоИмени(ИмяФайла)
	
	Если Содержит(ИмяФайла, НСтр("ru = 'паспорт'"))
		ИЛИ Содержит(ИмяФайла, НСтр("ru = 'passport'")) Тогда
		Возврат ВидыДокументов["Паспорт"].Представление;
		
	ИначеЕсли Содержит(ИмяФайла, НСтр("ru = 'СНИЛС'")) Тогда
		Возврат ВидыДокументов["СНИЛС"].Представление;
		
	ИначеЕсли Содержит(ИмяФайла, НСтр("ru = 'ИНН'")) Тогда
		Возврат ВидыДокументов["СвидетельствоОПостановкеНаУчет"].Представление;
		
	ИначеЕсли Содержит(ИмяФайла, НСтр("ru = 'Доверенность'")) Тогда
		Возврат ВидыДокументов["Доверенность"].Представление;
		
	ИначеЕсли Содержит(ИмяФайла, НСтр("ru = 'назначении'"))
		ИЛИ Содержит(ИмяФайла, НСтр("ru = 'приказ'"))
		ИЛИ Содержит(ИмяФайла, НСтр("ru = 'Подтверждение'"))
		ИЛИ Содержит(ИмяФайла, НСтр("ru = 'полномочий'")) Тогда
		Возврат ВидыДокументов["ПодтверждениеПолномочий"].Представление;
		
	ИначеЕсли Содержит(ИмяФайла, НСтр("ru = 'Заявление'")) Тогда
		Возврат ВидыДокументов["Заявление"].Представление;
	КонецЕсли;
	
КонецФункции
	
&НаСервере
Функция Содержит(Знач ИмяФайла, Подстрока)
	
	Возврат СтрНайти(ВРег(ИмяФайла), ВРег(Подстрока)) > 0;
	
КонецФункции

&НаКлиенте
Процедура ПриОткрытииЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	КонтекстЭДОКлиент = Результат.КонтекстЭДО;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием_Завершение(Результат, ВходящийКонтекст) Экспорт
	
	Сохранить();
	
КонецПроцедуры

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

&НаКлиенте
Функция ПараметрыПроцедурыВыбораФайлов(ВидДокумента = "")
	
	ДопустимыеТипыФайлов    = "jpeg;jpg;png;pdf"; 
	МаксимальныйРазмерФайла = 10 * 1024 * 1024;
	Требования              = ЭлектронныйДокументооборотСКонтролирующимиОрганамиКлиент.ТребованияКИзображениямВЗаявленииПо1СОтчетности();
	
	ПараметрыФункции = Новый Структура;
	ПараметрыФункции.Вставить("ВидДокумента", 				ВидДокумента);
	ПараметрыФункции.Вставить("МаксимальныйРазмерФайла", 	МаксимальныйРазмерФайла);
	ПараметрыФункции.Вставить("ДопустимыеТипыФайлов",		ДопустимыеТипыФайлов);
	ПараметрыФункции.Вставить("ВозвращатьРазмер", 			Истина);
	ПараметрыФункции.Вставить("РежимТолькоПросмотр", 		Ложь);
	ПараметрыФункции.Вставить("ИспользоватьСтраницы", 		Ложь);
	ПараметрыФункции.Вставить("Требования", 				Требования);
	
	Возврат ПараметрыФункции;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьМодифицированность(Форма)
	Форма.Модифицированность = Истина;
КонецПроцедуры

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

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