При записи дополнительного отчета. Обновляет варианты дополнительного отчета при его записи.
// Обновляет варианты дополнительного отчета при его записи.
//
// Места использования:
// Справочник.ДополнительныеОтчетыИОбработки.ПриЗаписиГлобальногоОтчета().
//
Процедура ПриЗаписиДополнительногоОтчета(ТекущийОбъект, Отказ, ВнешнийОбъект) Экспорт
Если Не ВариантыОтчетовПовтИсп.ПравоДобавления() Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Недостаточно прав доступа для записи вариантов дополнительного отчета ""%1"".'"),
ТекущийОбъект.Наименование);
ЗаписатьВЖурнал(УровеньЖурналаРегистрации.Ошибка, ТекстОшибки, ТекущийОбъект.Ссылка);
ОбщегоНазначения.СообщитьПользователю(ТекстОшибки);
Возврат;
КонецЕсли;
ПометкаУдаления = ТекущийОбъект.ПометкаУдаления;
Если ВнешнийОбъект = Неопределено
Или Не ТекущийОбъект.ИспользуетХранилищеВариантов
Или Не ТекущийОбъект.ДополнительныеСвойства.ПубликацияИспользуется Тогда
ПометкаУдаления = Истина;
КонецЕсли;
ПредопределенныеВарианты = Новый Соответствие;
Если ПометкаУдаления = Ложь И ВнешнийОбъект <> Неопределено Тогда
ОтчетМетаданные = ВнешнийОбъект.Метаданные();
СхемаКДМетаданные = ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных;
Если СхемаКДМетаданные <> Неопределено Тогда
СхемаКД = ВнешнийОбъект.ПолучитьМакет(СхемаКДМетаданные.Имя);
Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл
ПредопределенныеВарианты[ВариантНастроекКД.Имя] = ВариантНастроекКД.Представление;
КонецЦикла;
Иначе
ПредопределенныеВарианты[""] = ОтчетМетаданные.Представление();
КонецЕсли;
КонецЕсли;
// При снятии пометки удаления доп. отчета пометка удаления не снимается для пользовательских вариантов,
// помеченных на удаление интерактивно.
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВариантыОтчетов.Ссылка КАК Ссылка,
| ВариантыОтчетов.КлючВарианта КАК КлючВарианта,
| ВариантыОтчетов.Пользовательский КАК Пользовательский,
| ВариантыОтчетов.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.ВариантыОтчетов КАК ВариантыОтчетов
|ГДЕ
| ВариантыОтчетов.Отчет = &Отчет
| И (&ПометкаУдаления
| ИЛИ НЕ ВариантыОтчетов.Пользовательский
| ИЛИ НЕ ВариантыОтчетов.ИнтерактивнаяПометкаУдаления)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Отчет", ТекущийОбъект.Ссылка);
// При установке пометки удаления доп. отчета пометка удаления устанавливается для всех вариантов отчетов.
Запрос.УстановитьПараметр("ПометкаУдаления", ПометкаУдаления = Истина);
// Установка пометки удаления.
ВариантыДополнительногоОтчета = Запрос.Выполнить().Выгрузить();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ВариантыОтчетов");
ЭлементБлокировки.ИсточникДанных = ВариантыДополнительногоОтчета;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Ссылка");
Блокировка.Заблокировать();
Для каждого ВариантОтчета Из ВариантыДополнительногоОтчета Цикл
ПометкаУдаленияВарианта = ПометкаУдаления;
Представление = ПредопределенныеВарианты[ВариантОтчета.КлючВарианта];
Если Не ПометкаУдаленияВарианта И Не ВариантОтчета.Пользовательский И Представление = Неопределено Тогда
// Предопределенный вариант, который не найден в списке предопределенных для данного отчета.
ПометкаУдаленияВарианта = Истина;
КонецЕсли;
Если ВариантОтчета.ПометкаУдаления <> ПометкаУдаленияВарианта Тогда
ВариантОбъект = ВариантОтчета.Ссылка.ПолучитьОбъект();
ВариантОбъект.ДополнительныеСвойства.Вставить("ЗаполнениеПредопределенных", Истина);
Если ПометкаУдаленияВарианта Тогда
ВариантОбъект.ДополнительныеСвойства.Вставить("ИндексироватьСхему", Ложь);
Иначе
ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект);
КонецЕсли;
ВариантОбъект.УстановитьПометкуУдаления(ПометкаУдаленияВарианта);
КонецЕсли;
Если Представление <> Неопределено Тогда
ПредопределенныеВарианты.Удалить(ВариантОтчета.КлючВарианта);
ВариантОбъект = ВариантОтчета.Ссылка.ПолучитьОбъект();
ЛокализацияСервер.ПриЧтенииПредставленийНаСервере(ВариантОбъект);
ВариантОбъект.Наименование = Представление;
ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект);
ЛокализацияСервер.ПередЗаписьюНаСервере(ВариантОбъект);
ВариантОбъект.Записать();
КонецЕсли;
КонецЦикла;
Если Не ПометкаУдаления Тогда
// Зарегистрировать новые
Для Каждого Представление Из ПредопределенныеВарианты Цикл
ВариантОбъект = Справочники.ВариантыОтчетов.СоздатьЭлемент();
ВариантОбъект.Отчет = ТекущийОбъект.Ссылка;
ВариантОбъект.ТипОтчета = Перечисления.ТипыОтчетов.Дополнительный;
ВариантОбъект.КлючВарианта = Представление.Ключ;
ВариантОбъект.Наименование = Представление.Значение;
ВариантОбъект.Пользовательский = Ложь;
ВариантОбъект.ВидимостьПоУмолчанию = Истина;
ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект);
ЛокализацияСервер.ПередЗаписьюНаСервере(ВариантОбъект);
ВариантОбъект.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ВидОбработкиДополнительныйОтчет (БСП)
ИспользуютсяДополнительныеОтчетыИОбработки (БСП)
ЗаблокироватьДополнительныеОтчетыИОбработкиДляОбновления (БСП)