ПриЗаписиДополнительногоОтчета (БСП)

Автор: 1С
ОбщийМодуль.ВариантыОтчетов
БСП

При записи дополнительного отчета. Обновляет варианты дополнительного отчета при его записи.

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

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

Рекомендации

Похожие публикации

ПередОбновлениемЗадания (БСП)

ПриПодключенииОтчета (БСП)

ВидОбработкиДополнительныйОтчет (БСП)

ИспользуютсяДополнительныеОтчетыИОбработки (БСП)

ЗаблокироватьДополнительныеОтчетыИОбработкиДляОбновления (БСП)

ЗапроситьОбновлениеДополнительныхОтчетовИОбработок (БСП)

ОткрытьВариантДополнительногоОтчета (БСП)

TurboConf - расширение Конфигуратора 1С