#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПередЗагрузкойВариантаНаСервере = Истина;
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
Настройки.События.ПриОпределенииПараметровВыбора = Истина;
Настройки.События.ПриОпределенииСвойствЭлементовФормыНастроек = Истина;
Настройки.РазрешеноЗагружатьСхему = Истина;
Настройки.РазрешеноРедактироватьСхему = Истина;
Настройки.РазрешеноВосстанавливатьСтандартнуюСхему = Истина;
Настройки.ЗагрузитьНастройкиПриИзмененииПараметров = Отчеты.УниверсальныйОтчет.ЗагрузитьНастройкиПриИзмененииПараметров();
КонецПроцедуры
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
РазрешеноИзменятьВарианты = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
Форма.НастройкиОтчета, "РазрешеноИзменятьВарианты", Ложь);
Если РазрешеноИзменятьВарианты Тогда
Форма.НастройкиОтчета.ФормаНастроекРасширенныйРежим = 1;
КонецЕсли;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, "ВыбратьНастройки", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, "СохранитьНастройки", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, "ПоделитьсяНастройками", "Видимость", Ложь);
КонецПроцедуры
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
ДоступныеЗначения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
КомпоновщикНастроек.Настройки.ДополнительныеСвойства, "ДоступныеЗначения", Новый Структура);
ИмяПоля = СтрЗаменить(СвойстваНастройки.ПолеКД, "ПараметрыДанных.", "");
Если СтрНайти(ИмяПоля, ".") > 0 Тогда
Возврат;
КонецЕсли;
ЗначенияДляВыбора = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДоступныеЗначения, ИмяПоля);
Если ЗначенияДляВыбора <> Неопределено Тогда
СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
СвойстваНастройки.ЗначенияДляВыбора = ЗначенияДляВыбора;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗагрузкойВариантаНаСервере(Форма, Настройки, ПередЗагрузкойНастроек = Ложь) Экспорт
ТекущийКлючСхемы = Неопределено;
Схема = Неопределено;
ЭтоЗагруженнаяСхема = Ложь;
Если ТипЗнч(Настройки) = Тип("НастройкиКомпоновкиДанных") Или Настройки = Неопределено Тогда
Если Настройки = Неопределено Тогда
ДополнительныеСвойстваНастроек = КомпоновщикНастроек.Настройки.ДополнительныеСвойства;
Иначе
ДополнительныеСвойстваНастроек = Настройки.ДополнительныеСвойства;
КонецЕсли;
ЭтоОсновнойВариант = Форма.КлючТекущегоВарианта = "Основной"
Или Форма.КлючТекущегоВарианта = "Main";
Если Форма.ТипФормыОтчета = ТипФормыОтчета.Основная
И (Форма.РежимРасшифровки Или Не ЭтоОсновнойВариант) Тогда
ДополнительныеСвойстваНастроек.Вставить("ОтчетИнициализирован", Истина);
КонецЕсли;
ДвоичныеДанныеСхемы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
ДополнительныеСвойстваНастроек, "СхемаКомпоновкиДанных");
Если ТипЗнч(ДвоичныеДанныеСхемы) = Тип("ДвоичныеДанные") Тогда
ЭтоЗагруженнаяСхема = Истина;
ТекущийКлючСхемы = ХешДвоичныхДанных(ДвоичныеДанныеСхемы);
Схема = Отчеты.УниверсальныйОтчет.ИзвлечьСхемуИзДвоичныхДанных(ДвоичныеДанныеСхемы);
КонецЕсли;
ДополнительныеСвойстваНастроек.Удалить("УстановитьФиксированныеПараметры");
ДополнительныеСвойстваНастроек.Удалить("ЗагруженныеНастройкиXML");
Если Не ЭтоОсновнойВариант
И Не ПередЗагрузкойНастроек
И ТипЗнч(Настройки) = Тип("НастройкиКомпоновкиДанных")
И ДополнительныеСвойстваНастроек.Свойство("ДоступныеЗначения") Тогда
Если ДополнительныеСвойстваНастроек.Свойство("СохраняемыеФиксированныеПараметры") Тогда
ДополнительныеСвойстваНастроек.Вставить("УстановитьФиксированныеПараметры");
Иначе
ДополнительныеСвойстваНастроек.Вставить("ЗагруженныеНастройкиXML",
ОбщегоНазначения.ЗначениеВСтрокуXML(Настройки));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЭтоЗагруженнаяСхема Тогда
КлючСхемы = ТекущийКлючСхемы;
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Форма, Схема, КлючСхемы);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
ТекущийКлючСхемы = Неопределено;
Если НовыеНастройкиКД = Неопределено Тогда
НовыеНастройкиКД = КомпоновщикНастроек.Настройки;
КонецЕсли;
ЭтоЗагруженнаяСхема = Ложь;
ДвоичныеДанныеСхемы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
НовыеНастройкиКД.ДополнительныеСвойства, "СхемаКомпоновкиДанных");
Если ТипЗнч(ДвоичныеДанныеСхемы) = Тип("ДвоичныеДанные") Тогда
ТекущийКлючСхемы = ХешДвоичныхДанных(ДвоичныеДанныеСхемы);
Если ТекущийКлючСхемы <> КлючСхемы Тогда
Схема = Отчеты.УниверсальныйОтчет.ИзвлечьСхемуИзДвоичныхДанных(ДвоичныеДанныеСхемы);
ЭтоЗагруженнаяСхема = Истина;
КонецЕсли;
КонецЕсли;
Если НовыеНастройкиКД.ДополнительныеСвойства.Свойство("УстановитьФиксированныеПараметры") Тогда
НовыеНастройкиКД.ДополнительныеСвойства.Удалить("УстановитьФиксированныеПараметры");
Попытка
Отчеты.УниверсальныйОтчет.УстановитьФиксированныеПараметры(ЭтотОбъект,
НовыеНастройкиКД.ДополнительныеСвойства.СохраняемыеФиксированныеПараметры,
НовыеНастройкиКД,
НовыеПользовательскиеНастройкиКД);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для варианта универсального отчета с ключом ""%1""
|не удалось установить фиксированные параметры по причине:
|%2'"),
КлючВарианта,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ЗаписьЖурналаРегистрации(НСтр("ru = 'Варианты отчетов.Настройка параметров универсального отчета'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Справочники.ВариантыОтчетов,,
Комментарий);
КонецПопытки;
ИначеЕсли Не НовыеНастройкиКД.ДополнительныеСвойства.Свойство("ОтчетИнициализирован")
И ТипЗнч(НовыеПользовательскиеНастройкиКД) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
КлючСхемы = "";
КонецЕсли;
ДоступныеЗначения = Неопределено;
ФиксированныеПараметры = Отчеты.УниверсальныйОтчет.ФиксированныеПараметры(
НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД, ДоступныеЗначения, Контекст);
Если НовыеНастройкиКД.ДополнительныеСвойства.Свойство("ЗагруженныеНастройкиXML") Тогда
ЗагруженныеНастройкиXML = НовыеНастройкиКД.ДополнительныеСвойства.ЗагруженныеНастройкиXML;
НовыеНастройкиКД.ДополнительныеСвойства.Удалить("ЗагруженныеНастройкиXML");
Попытка
ЗагруженныеНастройкиКД = ОбщегоНазначения.ЗначениеИзСтрокиXML(ЗагруженныеНастройкиXML);
ЗагруженныеНастройкиКД.ДополнительныеСвойства.Вставить("ДоступныеЗначения", ДоступныеЗначения);
ЗагруженныеНастройкиКД.ДополнительныеСвойства.Вставить("СохраняемыеФиксированныеПараметры", ФиксированныеПараметры);
КлючОтчета = Контекст.НастройкиОтчета.ПолноеИмя;
ОписаниеНастроек = ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолучитьОписание(КлючОтчета, КлючВарианта);
ХранилищаНастроек.ХранилищеВариантовОтчетов.Сохранить(КлючОтчета,
КлючВарианта, ЗагруженныеНастройкиКД, ОписаниеНастроек);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для варианта универсального отчета с ключом ""%1""
|не удалось записать фиксированные параметры по причине:
|%2'"),
КлючВарианта,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ЗаписьЖурналаРегистрации(НСтр("ru = 'Варианты отчетов.Настройка параметров универсального отчета'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Справочники.ВариантыОтчетов,,
Комментарий);
КонецПопытки;
КонецЕсли;
Если ТекущийКлючСхемы = Неопределено Тогда
ТекущийКлючСхемы = ФиксированныеПараметры.ТипОбъектаМетаданных
+ "/" + ФиксированныеПараметры.ИмяОбъектаМетаданных
+ "/" + ФиксированныеПараметры.ИмяТаблицы;
ТекущийКлючСхемы = ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой(ТекущийКлючСхемы, 100);
Если ТекущийКлючСхемы <> КлючСхемы Тогда
КлючСхемы = "";
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(КлючСхемы) И Не ЭтоЗагруженнаяСхема Тогда
Схема = Отчеты.УниверсальныйОтчет.СхемаКомпоновкиДанных(ФиксированныеПараметры);
КонецЕсли;
Если ТекущийКлючСхемы <> Неопределено И (ТекущийКлючСхемы <> КлючСхемы) Тогда
КлючСхемы = ТекущийКлючСхемы;
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, Схема, КлючСхемы);
Если ЭтоЗагруженнаяСхема Тогда
Отчеты.УниверсальныйОтчет.УстановитьСтандартныеНастройкиЗагруженнойСхемы(
ЭтотОбъект, ДвоичныеДанныеСхемы, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
Иначе
Отчеты.УниверсальныйОтчет.УстановитьСтандартныеНастройки(
ЭтотОбъект, ФиксированныеПараметры, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
КонецЕсли;
Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") Тогда
ИнтеграцияПодсистемБСП.ПередЗагрузкойВариантаНаСервере(Контекст, НовыеНастройкиКД);
ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере(Контекст, НовыеНастройкиКД);
ПередЗагрузкойВариантаНаСервере(Контекст, НовыеНастройкиКД, Истина);
ИспользуемыеТаблицы = ВариантыОтчетов.ИспользуемыеТаблицы(СхемаКомпоновкиДанных);
ИспользуемыеТаблицы.Добавить(Метаданные().ПолноеИмя());
Контекст.НастройкиОтчета.Вставить("ИспользуемыеТаблицы", ИспользуемыеТаблицы);
ИначеЕсли ТипЗнч(Контекст) = Тип("Структура") Тогда
АдресСхемы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "АдресСхемы");
Если Не ЭтоАдресВременногоХранилища(АдресСхемы) Тогда
Контекст.Вставить("АдресСхемы", ПоместитьВоВременноеХранилище(Схема, Новый УникальныйИдентификатор));
КонецЕсли;
КонецЕсли;
ДоступныеЗначения = Неопределено;
ФиксированныеПараметры = Отчеты.УниверсальныйОтчет.ФиксированныеПараметры(
НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД, ДоступныеЗначения, Контекст);
Иначе
Отчеты.УниверсальныйОтчет.УстановитьФиксированныеПараметры(
ЭтотОбъект, ФиксированныеПараметры, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
КонецЕсли;
НовыеНастройкиКД.ДополнительныеСвойства.Вставить("СохраняемыеФиксированныеПараметры", ФиксированныеПараметры);
НовыеНастройкиКД.ДополнительныеСвойства.Вставить("ДоступныеЗначения", ДоступныеЗначения);
Отчеты.УниверсальныйОтчет.УстановитьСтандартныйЗаголовокОтчета(
Контекст, НовыеНастройкиКД, ФиксированныеПараметры, ДоступныеЗначения);
Если ТипЗнч(Контекст) = Тип("Структура")
И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "СхемаКД", Неопределено) = Неопределено Тогда
ЗаменитьЗначенияПараметров(НовыеНастройкиКД, НовыеНастройкиКД.ДополнительныеСвойства.ДоступныеЗначения);
КонецЕсли;
КонецПроцедуры
Процедура ПриОпределенииСвойствЭлементовФормыНастроек(ТипФормы, СвойстваЭлементов, ПользовательскиеНастройки) Экспорт
Если ТипФормы <> ТипФормыОтчета.Основная Тогда
Возврат;
КонецЕсли;
СвойстваГруппы = ОтчетыСервер.СвойстваГруппыЭлементовФормы();
СвойстваГруппы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
СвойстваЭлементов.Группы.Вставить("ФиксированныеПараметры", СвойстваГруппы);
ФиксированныеПараметры = Новый Структура("Период, ТипОбъектаМетаданных, ИмяОбъектаМетаданных, ИмяТаблицы");
ШиринаПоля = Новый Структура("ТипОбъектаМетаданных, ИмяОбъектаМетаданных, ИмяТаблицы", 20, 35, 20);
Для Каждого ЭлементНастройки Из ПользовательскиеНастройки Цикл
Если ТипЗнч(ЭлементНастройки) <> Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
Или Не ФиксированныеПараметры.Свойство(ЭлементНастройки.Параметр) Тогда
Продолжить;
КонецЕсли;
СвойстваПоля = СвойстваЭлементов.Поля.Найти(
ЭлементНастройки.ИдентификаторПользовательскойНастройки, "ИдентификаторНастройки");
Если СвойстваПоля = Неопределено Тогда
Продолжить;
КонецЕсли;
СвойстваПоля.ИдентификаторГруппы = "ФиксированныеПараметры";
ИмяПараметра = Строка(ЭлементНастройки.Параметр);
Если ИмяПараметра <> "Период" Тогда
СвойстваПоля.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
СвойстваПоля.Ширина = ШиринаПоля[ИмяПараметра];
СвойстваПоля.РастягиватьПоГоризонтали = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Отчеты.УниверсальныйОтчет.ВывестиКоличествоПодчиненныхЗаписей(Настройки, СхемаКомпоновкиДанных, СтандартнаяОбработка);
ИсходныеЗначенияПараметров = Неопределено;
ЗаменитьЗначенияПараметров(Настройки, Настройки.ДополнительныеСвойства.ДоступныеЗначения, ИсходныеЗначенияПараметров);
Если СтандартнаяОбработка Тогда
Возврат;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ЗаменитьЗначенияПараметров(ДанныеРасшифровки.Настройки, Настройки.ДополнительныеСвойства.ДоступныеЗначения, ИсходныеЗначенияПараметров);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ХешДвоичныхДанных(ДвоичныеДанные)
ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
ХешированиеДанных.Добавить(ДвоичныеДанные);
Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "") + "_" + Формат(ДвоичныеДанные.Размер(), "ЧГ=");
КонецФункции
Процедура ЗаменитьЗначенияПараметров(Настройки, ДоступныеЗначения, ИсходныеЗначения = Неопределено)
ЗаменятьНаПредставления = ИсходныеЗначения = Неопределено;
Если ИсходныеЗначения = Неопределено Тогда
ИсходныеЗначения = Новый Соответствие;
КонецЕсли;
ИменаПараметров = Новый Массив;
ИменаПараметров.Добавить("ТипОбъектаМетаданных");
ИменаПараметров.Добавить("ИмяОбъектаМетаданных");
ИменаПараметров.Добавить("ИмяТаблицы");
Для Каждого ИмяПараметра Из ИменаПараметров Цикл
Параметр = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если Параметр = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЗаменятьНаПредставления Тогда
Если ДоступныеЗначения.Свойство(ИмяПараметра) Тогда
ДоступныеЗначенияПараметра = ДоступныеЗначения[ИмяПараметра];
ОписаниеЗначенияПараметра = ДоступныеЗначенияПараметра.НайтиПоЗначению(Параметр.Значение);
Если ОписаниеЗначенияПараметра <> Неопределено Тогда
Параметр.Значение = ОписаниеЗначенияПараметра.Представление;
ИсходныеЗначения.Вставить(ОписаниеЗначенияПараметра.Представление, ОписаниеЗначенияПараметра.Значение);
КонецЕсли;
КонецЕсли;
Иначе
ИсходноеЗначение = ИсходныеЗначения.Получить(Параметр.Значение);
Если ИсходноеЗначение <> Неопределено Тогда
Параметр.Значение = ИсходноеЗначение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли