///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

	Если СнимкиОтчетов.Количество() > 0 Тогда
		ТекущийСнимокОтчета = 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ПерейтиККонцу(Команда)
	
	ТекущийСнимокОтчета = СнимкиОтчетов.Количество();
	ПрочитатьСнимокОтчета();
	
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКНачалу(Команда)

	Если СнимкиОтчетов.Количество() > 0 Тогда
		ТекущийСнимокОтчета = 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;

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

&НаКлиенте
Процедура ПерейтиНазад(Команда)
	
	Если ТекущийСнимокОтчета > 1 Тогда
		ТекущийСнимокОтчета = ТекущийСнимокОтчета - 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура УдалитьСнимокОтчета(Команда)
	
	Если ТекущийСнимокОтчета <> 0 Тогда
		УдалитьСнимокОтчетаНаСервере();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

	НачатьТранзакцию();
	Попытка
		Блокировка.Заблокировать();

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

&НаСервере
Процедура УдалитьСнимокОтчетаНаСервере()
	
	СтрокаОтчет = СнимкиОтчетов[ТекущийСнимокОтчета-1];
	
	ОтчетТабличныйДокумент.Очистить();
	
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.СнимкиОтчетов");
	ЭлементБлокировки.УстановитьЗначение("Пользователь", СтрокаОтчет.Пользователь);
	ЭлементБлокировки.УстановитьЗначение("Отчет", СтрокаОтчет.Отчет);
	ЭлементБлокировки.УстановитьЗначение("Вариант", СтрокаОтчет.Вариант);
	ЭлементБлокировки.УстановитьЗначение("ХешПользовательскойНастройки", СтрокаОтчет.ХешПользовательскойНастройки);

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

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