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

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

&НаКлиенте
Перем ОписаниеДлительнойОперации;

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВыбратьВсех(Команда)
	
	ПроставитьПометкиВсем(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьВсех(Команда)
	
	ПроставитьПометкиВсем(Ложь);
	
КонецПроцедуры

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

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

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

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

	Если НайденныеСтроки.Количество() = 0 Тогда
		
		Возврат ТребованияФНСВызовСервера.ЭДООбязательноПоОрганизации(Организация);
		
	Иначе
		
		Возврат НайденныеСтроки[0].ЭДООбязателен;
		
	КонецЕсли;
		
КонецФункции

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

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

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

&НаКлиенте
Процедура ПодтвердитьПриемПоследовательно_ОтправитьСледующееПодтверждение(ЭДООбязателен, ВходящийКонтекст) Экспорт

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

&НаКлиенте
Функция ПропуститьПодтверждениеЕслиНеТребуется(ЭДООбязателен, ВходящийКонтекст) Экспорт

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

&НаКлиенте
Процедура ВывестиСостояниеОтправки(ВходящийКонтекст) Экспорт
	
	ТекущийНомер = ВходящийКонтекст.ТекущийНомер;
	Выбранные    = ВходящийКонтекст.Выбранные;	
	
	ШаблонОбщий = НСтр("ru = 'Отправляется %1 из %2...'");
	Представление = ПредставлениеПодтверждений(
		ШаблонОбщий, 
		ТекущийНомер + 1, 
		Выбранные.Количество());
	
	ПараметрыФормы = ДлительнаяОтправкаКлиент.ПараметрыСостоянияУниверсальногоДлительногоДействия();
	ПараметрыФормы.Вставить("Надпись", Представление);

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

&НаКлиенте
Процедура ВывестиРезультатОтправки(ВходящийКонтекст) Экспорт
	
	Выбранные = ВходящийКонтекст.Выбранные;
	Успешные  = ВходящийКонтекст.Успешные;
	
	ШаблонОбщий = НСтр("ru = 'Подтвержден прием %1 из %2'");
	Представление = ПредставлениеТребований(
		ШаблонОбщий, 
		Успешные.Количество(), 
		Выбранные.Количество());

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

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

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

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

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

&НаСервере
Процедура ИзменитьОформлениеИтога(Выбрано)

	// Выбрано 5 из 7 требований
	
	ШаблонОбщий = НСтр("ru = 'Выбрано %1 из %2'");
	ОбщееКоличество = ОбщееКоличество();
	Элементы.ИтогПоТаблице.Заголовок = ПредставлениеТребований(ШаблонОбщий, Выбрано, ОбщееКоличество);
		
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеТребований(ШаблонОбщий, Выбрано, Всего)

	ШаблонВсего = ";%1 требования;;%1 требований;%1 требований;%1 требований";
	ПредставлениеВсего = ДокументооборотСКОКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ШаблонВсего, Всего);
	
	Представление = СтрШаблон(ШаблонОбщий, Выбрано, ПредставлениеВсего);
	
	Возврат Представление;
		
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеПодтверждений(ШаблонОбщий, Выбрано, Всего)

	ШаблонВсего = ";%1 подтверждения;;%1 подтверждений;%1 подтверждений;%1 подтверждений";
	ПредставлениеВсего = ДокументооборотСКОКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ШаблонВсего, Всего);
	
	Представление = СтрШаблон(ШаблонОбщий, Выбрано, ПредставлениеВсего);
	
	Возврат Представление;
		
КонецФункции

&НаСервере
Процедура ЗаполнитьОбщиеСведения(НоваяСтрока, КонтекстЭДОСервер, Требование, РасчетСрока)

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

&НаСервере
Процедура ЗаполнитьТаблицуТребований()

	ДобавитьТребующиеПодтверждения();
	СортироватьДерево();
	
КонецПроцедуры

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

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

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

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

		КонецЦикла;
	
	КонецЦикла;
		
КонецПроцедуры

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

	ШаблонТребований  = ";Подтвердить прием %1 требования;;Подтвердить прием %1 требований;Подтвердить прием %1 требований;Подтвердить прием %1 требований";
	
	Представление = ДокументооборотСКОКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(ШаблонТребований, Выбрано);
	
	Элементы.ФормаПодтвердитьПрием.Заголовок = Представление;
	
КонецПроцедуры

&НаСервере
Функция ОрганизацииТребований()

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

&НаСервере
Процедура УправлениеФормой()
	
	Выбрано = КоличествоВыбранных();
	
	ИзменитьОформениеКнопки(Выбрано);
	ИзменитьОформлениеИтога(Выбрано);

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

&НаКлиенте
Процедура РазвернутьДерево()
	
	СтрокиДерева = ДеревоТребований.ПолучитьЭлементы();
	Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл
		
		Элементы.ДеревоТребований.Развернуть(
			ТекущаяСтрока.ПолучитьИдентификатор());
			
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПроставитьПометкиВниз(СтрокаДерева)
	
	Потомки = СтрокаДерева.ПолучитьЭлементы();
	
	Если Потомки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеФлажка = СтрокаДерева.Пометка;
	
	Для каждого Потомок из Потомки Цикл
		
		Если ЗначениеФлажка <> 2 И Потомок.Видимость Тогда
			Потомок.Пометка = ЗначениеФлажка;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ПроставитьПометкиВверх(СтрокаДерева)
	
	Родитель = СтрокаДерева.ПолучитьРодителя();
	
	Если Родитель = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВсеИстина = Истина;
	ВсеЛожь = Истина;
	
	Потомки = Родитель.ПолучитьЭлементы();
	Для каждого Потомок из Потомки Цикл
		
		Если НЕ Потомок.Видимость Тогда
			Продолжить;
		КонецЕсли;
		
		ВсеИстина = ВсеИстина И Потомок.Пометка = 1;
		ВсеЛожь = ВсеЛожь И Потомок.Пометка = 0;
		
		Если ВсеИстина = Ложь И ВсеЛожь = Ложь Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ВсеИстина Тогда
		Родитель.Пометка = 1;
	ИначеЕсли ВсеЛожь Тогда
		Родитель.Пометка = 0;
	Иначе
		Родитель.Пометка = 2;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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