#Область ОбработчикиСобытий
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ОбработкаЗагрузки(КлючОтчета, КлючВарианта, Настройки, ОписаниеНастроек, Пользователь)
Если Не ВариантыОтчетовПовтИсп.ПравоЧтения() Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(КлючОтчета) = Тип("Строка") Тогда
ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(КлючОтчета, Истина);
ОтчетСсылка = ОтчетИнформация.Отчет;
Иначе
ОтчетСсылка = КлючОтчета;
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ВариантыОтчетов.Представление,
| ВариантыОтчетов.Настройки
|ИЗ
| Справочник.ВариантыОтчетов КАК ВариантыОтчетов
|ГДЕ
| ВариантыОтчетов.Отчет = &Отчет
| И ВариантыОтчетов.КлючВарианта = &КлючВарианта");
Запрос.УстановитьПараметр("Отчет", ОтчетСсылка);
Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если ОписаниеНастроек = Неопределено Тогда
ОписаниеНастроек = Новый ОписаниеНастроек;
ОписаниеНастроек.КлючОбъекта = КлючОтчета;
ОписаниеНастроек.КлючНастроек = КлючВарианта;
ОписаниеНастроек.Пользователь = Пользователь;
КонецЕсли;
ОписаниеНастроек.Представление = Выборка.Представление;
Настройки = Выборка.Настройки.Получить();
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаСохранения(КлючОтчета, КлючВарианта, Настройки, ОписаниеНастроек, Пользователь)
Если Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда
ВызватьИсключение(НСтр("ru = 'Недостаточно прав для сохранения вариантов отчетов.'"),
КатегорияОшибки.НарушениеПравДоступа);
КонецЕсли;
ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(КлючОтчета, Истина);
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВариантыОтчетов.Ссылка
|ИЗ
| Справочник.ВариантыОтчетов КАК ВариантыОтчетов
|ГДЕ
| ВариантыОтчетов.Отчет = &Отчет
| И ВариантыОтчетов.КлючВарианта = &КлючВарианта");
Запрос.УстановитьПараметр("Отчет", ОтчетИнформация.Отчет);
Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
Возврат;
КонецЕсли;
СсылкаВарианта = Выборка.Ссылка;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя());
ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаВарианта);
Блокировка.Заблокировать();
ВариантОбъект = СсылкаВарианта.ПолучитьОбъект();
Если ТипЗнч(Настройки) = Тип("НастройкиКомпоновкиДанных") Тогда
Адрес = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Настройки.ДополнительныеСвойства, "Адрес");
Если ТипЗнч(Адрес) = Тип("Строка") И ЭтоАдресВременногоХранилища(Адрес) Тогда
НастройкиИзХранилища = ПолучитьИзВременногоХранилища(Адрес);
КонецЕсли;
Настройки.ДополнительныеСвойства.Удалить("Адрес");
Настройки = ?(НастройкиИзХранилища = Неопределено, Настройки, НастройкиИзХранилища);
Контекст = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Настройки.ДополнительныеСвойства, "КонтекстВарианта");
Если ЗначениеЗаполнено(Контекст) Тогда
ВариантОбъект.Контекст = Контекст;
КонецЕсли;
КонецЕсли;
ВариантОбъект.Настройки = Новый ХранилищеЗначения(Настройки, Новый СжатиеДанных(9));
Если ОписаниеНастроек <> Неопределено Тогда
ВариантОбъект.Наименование = ОписаниеНастроек.Представление;
КонецЕсли;
ВариантОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ОбработкаПолученияОписания(КлючОтчета, КлючВарианта, ОписаниеНастроек, Пользователь)
Если Не ВариантыОтчетовПовтИсп.ПравоЧтения() Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(КлючОтчета) = Тип("Строка") Тогда
ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(КлючОтчета, Истина);
ОтчетСсылка = ОтчетИнформация.Отчет;
Иначе
ОтчетСсылка = КлючОтчета;
КонецЕсли;
Если ОписаниеНастроек = Неопределено Тогда
ОписаниеНастроек = Новый ОписаниеНастроек;
КонецЕсли;
ОписаниеНастроек.КлючОбъекта = КлючОтчета;
ОписаниеНастроек.КлючНастроек = КлючВарианта;
Если ТипЗнч(Пользователь) = Тип("Строка") Тогда
ОписаниеНастроек.Пользователь = Пользователь;
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| Варианты.Представление,
| Варианты.ПометкаУдаления,
| Варианты.Пользовательский
|ИЗ
| Справочник.ВариантыОтчетов КАК Варианты
|ГДЕ
| Варианты.Отчет = &Отчет
| И Варианты.КлючВарианта = &КлючВарианта");
Запрос.УстановитьПараметр("Отчет", ОтчетСсылка);
Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОписаниеНастроек.Представление = Выборка.Представление;
ОписаниеНастроек.ДополнительныеСвойства.Вставить("ПометкаУдаления", Выборка.ПометкаУдаления);
ОписаниеНастроек.ДополнительныеСвойства.Вставить("Пользовательский", Выборка.Пользовательский);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаУстановкиОписания(КлючОтчета, КлючВарианта, ОписаниеНастроек, Пользователь)
Если Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда
ВызватьИсключение(НСтр("ru = 'Недостаточно прав для сохранения вариантов отчетов.'"),
КатегорияОшибки.НарушениеПравДоступа);
КонецЕсли;
Если ТипЗнч(КлючОтчета) = Тип("Строка") Тогда
ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(КлючОтчета, Истина);
ОтчетСсылка = ОтчетИнформация.Отчет;
Иначе
ОтчетСсылка = КлючОтчета;
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| Варианты.Ссылка
|ИЗ
| Справочник.ВариантыОтчетов КАК Варианты
|ГДЕ
| Варианты.Отчет = &Отчет
| И Варианты.КлючВарианта = &КлючВарианта");
Запрос.УстановитьПараметр("Отчет", ОтчетСсылка);
Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
Возврат;
КонецЕсли;
СсылкаВарианта = Выборка.Ссылка;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя());
ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаВарианта);
Блокировка.Заблокировать();
ВариантОбъект = СсылкаВарианта.ПолучитьОбъект();
ВариантОбъект.Наименование = ОписаниеНастроек.Представление;
ВариантОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
#КонецЕсли
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьСписок(КлючОтчета, Знач Пользователь = Неопределено) Экспорт
Список = Новый СписокЗначений;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
ВариантыОтчетовАвтора = ВариантыОтчетовАвтора(КлючОтчета, Пользователь);
Если ВариантыОтчетовАвтора <> Неопределено Тогда
Для Каждого ВариантОтчета Из ВариантыОтчетовАвтора Цикл
Список.Добавить(ВариантОтчета.КлючВарианта, ВариантОтчета.Наименование);
КонецЦикла;
КонецЕсли;
#КонецЕсли
Возврат Список;
КонецФункции
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Функция ВариантыОтчетовАвтора(КлючОтчета, Автор)
Если ТипЗнч(КлючОтчета) = Тип("Строка") Тогда
ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(КлючОтчета, Истина);
Отчет = ОтчетИнформация.Отчет;
Иначе
Отчет = КлючОтчета;
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Варианты.КлючВарианта,
| Варианты.Наименование
|ИЗ
| Справочник.ВариантыОтчетов КАК Варианты
|ГДЕ
| Варианты.Отчет = &Отчет
| И Варианты.Автор = &Автор
| И Варианты.Автор.ИдентификаторПользователяИБ = &GUID
| И НЕ Варианты.ПометкаУдаления
| И Варианты.Пользовательский");
Запрос.УстановитьПараметр("Отчет", Отчет);
Если Автор = "" Тогда
Автор = Пользователи.СсылкаНеуказанногоПользователя();
ИначеЕсли Автор = Неопределено Тогда
Автор = Пользователи.АвторизованныйПользователь();
КонецЕсли;
Если ТипЗнч(Автор) = Тип("СправочникСсылка.Пользователи") Тогда
Запрос.УстановитьПараметр("Автор", Автор);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Варианты.Автор.ИдентификаторПользователяИБ = &GUID", "");
Иначе
Если ТипЗнч(Автор) = Тип("УникальныйИдентификатор") Тогда
ИдентификаторПользователя = Автор;
Иначе
Если ТипЗнч(Автор) = Тип("Строка") Тогда
УстановитьПривилегированныйРежим(Истина);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Автор);
УстановитьПривилегированныйРежим(Ложь);
Если ПользовательИБ = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ИначеЕсли ТипЗнч(Автор) = Тип("ПользовательИнформационнойБазы") Тогда
ПользовательИБ = Автор;
Иначе
Возврат Неопределено;
КонецЕсли;
ИдентификаторПользователя = ПользовательИБ.УникальныйИдентификатор;
КонецЕсли;
Запрос.УстановитьПараметр("GUID", ИдентификаторПользователя);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Варианты.Автор = &Автор", "");
КонецЕсли;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
#КонецЕсли
Процедура Удалить(КлючОтчета, КлючВарианта, Знач Пользователь) Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Варианты.Ссылка
|ИЗ
| Справочник.ВариантыОтчетов КАК Варианты
|ГДЕ
| Варианты.Отчет = &Отчет
| И Варианты.Автор = &Автор
| И Варианты.Автор.ИдентификаторПользователяИБ = &GUID
| И Варианты.КлючВарианта = &КлючВарианта
| И НЕ Варианты.ПометкаУдаления
| И Варианты.Пользовательский";
Запрос = Новый Запрос;
Если КлючОтчета = Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Варианты.Отчет = &Отчет", "ИСТИНА");
Иначе
ОтчетИнформация = ВариантыОтчетов.ИнформацияОбОтчете(КлючОтчета, Истина);
Запрос.УстановитьПараметр("Отчет", ОтчетИнформация.Отчет);
КонецЕсли;
Если КлючВарианта = Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И Варианты.КлючВарианта = &КлючВарианта", "");
Иначе
Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);
КонецЕсли;
Если Пользователь = "" Тогда
Пользователь = Пользователи.СсылкаНеуказанногоПользователя();
КонецЕсли;
Если Пользователь = Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И Варианты.Автор = &Автор", "");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И Варианты.Автор.ИдентификаторПользователяИБ = &GUID", "");
ИначеЕсли ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда
Запрос.УстановитьПараметр("Автор", Пользователь);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И Варианты.Автор.ИдентификаторПользователяИБ = &GUID", "");
Иначе
Если ТипЗнч(Пользователь) = Тип("УникальныйИдентификатор") Тогда
ИдентификаторПользователя = Пользователь;
Иначе
Если ТипЗнч(Пользователь) = Тип("Строка") Тогда
УстановитьПривилегированныйРежим(Истина);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Пользователь);
УстановитьПривилегированныйРежим(Ложь);
Если ПользовательИБ = Неопределено Тогда
Возврат;
КонецЕсли;
ИначеЕсли ТипЗнч(Пользователь) = Тип("ПользовательИнформационнойБазы") Тогда
ПользовательИБ = Пользователь;
Иначе
Возврат;
КонецЕсли;
ИдентификаторПользователя = ПользовательИБ.УникальныйИдентификатор;
КонецЕсли;
Запрос.УстановитьПараметр("GUID", ИдентификаторПользователя);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И Варианты.Автор = &Автор", "");
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
ВариантОбъект.УстановитьПометкуУдаления(Истина);
КонецЦикла;
#КонецЕсли
КонецПроцедуры
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Функция ДобавитьВариантыВнешнегоОтчета(ВариантыОтчета, ПолноеИмяОтчета, ИмяОтчета) Экспорт
Попытка
ОтчетОбъект = ОтчетыСервер.ОтчетОбъект(ПолноеИмяОтчета);
Исключение
ШаблонСообщения = НСтр("ru = 'Не удалось получить список предопределенных вариантов внешнего отчета ""%1"":%2%3'");
Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонСообщения, ИмяОтчета, Символы.ПС, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВариантыОтчетов.ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, Сообщение, ПолноеИмяОтчета);
Возврат Ложь;
КонецПопытки;
Если ОтчетОбъект.СхемаКомпоновкиДанных = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого ВариантНастроекКД Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
Вариант = ВариантыОтчета.Добавить();
Вариант.Пользовательский = Ложь;
Вариант.Наименование = ВариантНастроекКД.Представление;
Вариант.КлючВарианта = ВариантНастроекКД.Имя;
Вариант.ТолькоДляАвтора = Ложь;
Вариант.АвторТекущийПользователь = Ложь;
Вариант.Порядок = 1;
Вариант.ИндексКартинки = 5;
КонецЦикла;
Возврат Истина;
КонецФункции
#КонецЕсли
#КонецОбласти