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

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

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

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

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

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

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

&НаКлиенте
Процедура КомандаРасшифровать(Команда)
	
	ПродолжитьАвтообмен = Истина;
	ЗакрытьФормуИНачатьРасшифровку();
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ЗакрытьФормуИНачатьРасшифровку()
	
	// Расшифровка будет запущена сразу после закрытия этой формы вместе с формой бублика.
	ДополнительныеПараметры = РезультатВыбораПользователя();
	Закрыть(ДополнительныеПараметры);
	
КонецПроцедуры

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

&НаСервере
Процедура ОпределитьКоличествоСообщенийКРасшифровке()
	
	КоличествоСообщенийКРасшифровке = ТаблицаРасшифровкиПоОрганизациям.Итог("КоличествоСообщений");
	
	СообщенияСтрокой = ДлительнаяОтправкаКлиентСервер.ЧислоИПредметИсчисления(
		КоличествоСообщенийКРасшифровке,
		НСтр("ru = 'сообщение'"),
		НСтр("ru = 'сообщения'"),
		НСтр("ru = 'сообщений'"),
		"с");
	
	ДниОжиданияСтрокой = "";
	Если НЕ ПараметрыПоказа.ВсеСообщения Тогда
		Если ПараметрыПоказа.ДниОжидания >= 62 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '2 месяцев'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 31 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '1 месяца'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 21 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '3 недель'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 14 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '2 недель'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 7 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '1 недели'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 6 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '6 дней'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 5 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '5 дней'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 4 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '4 дней'");
		ИначеЕсли ПараметрыПоказа.ДниОжидания >= 3 Тогда
			ДниОжиданияСтрокой = НСтр("ru = '3 дней'");
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ТекстНадписи.Заголовок = СообщенияСтрокой
		+ ?(ЗначениеЗаполнено(ДниОжиданияСтрокой), " " + НСтр("ru = 'более'") + " " + ДниОжиданияСтрокой, "")
		+ " " + ОбщегоНазначенияЭДКОКлиентСервер.ПростоеСклонение(КоличествоСообщенийКРасшифровке,
				НСтр("ru = 'ожидает'"), НСтр("ru = 'ожидают'"), НСтр("ru = 'ожидают'")) + " "
			+ НСтр("ru = 'расшифровки другими пользователями.'");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПоказатьПозжеПослеПредупреждения(ДополнительныеПараметры) Экспорт
	
	Закрыть(ПараметрыПоказа);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОтложитьПоказ(НапомнитьЧерез)
	
	ДатаСеанса = ТекущаяДатаСеанса();
	Если НапомнитьЧерез = "1" Тогда
		ДатаРасшифровкаДляДругихПользователей = ДатаСеанса + 7*24*60*60;
	ИначеЕсли НапомнитьЧерез = "2" Тогда
		ДатаРасшифровкаДляДругихПользователей = ДатаСеанса + 30*24*60*60;
	ИначеЕсли НапомнитьЧерез = "3" Тогда
		ДатаРасшифровкаДляДругихПользователей = ДатаСеанса + 3*24*60*60;
	ИначеЕсли НапомнитьЧерез = "4" Тогда
		ДатаРасшифровкаДляДругихПользователей = ДатаСеанса + 14*24*60*60;
	ИначеЕсли НапомнитьЧерез = "-1" Тогда
		ДатаРасшифровкаДляДругихПользователей = '39991231';
	Иначе
		ДатаРасшифровкаДляДругихПользователей = ДатаСеанса + 24*60*60;
	КонецЕсли;
	
	ХранилищеОбщихНастроек.Сохранить("ДокументооборотСКонтролирующимиОрганами_ДатаРасшифровкаДляДругихПользователей",,
		ДатаРасшифровкаДляДругихПользователей);
	
КонецПроцедуры

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

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