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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

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

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

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

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

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

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

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

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли