ЗаполнитьПоляДляПоиска (БСП)

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

Заполнить поля для поиска. Вызывается из события ПриЗаписи вариантов.

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

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

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

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

ТипыСопоставляемыхОбщихДанныхПоПолямПоиска (БСП)

ЗаполнитьСписокПрограммДляПоиска (БСП)

ЗаполнитьПараметры (БСП)

Проверка заполненности полей объекта и возврат статуса + незаполненных полей

Вывести все доступные поля СКД

ЗаполнитьСписокВыбораДляРассмотретьПосле (БСП)

ЗаполнитьКонтактыПоПредмету (БСП)

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

ТекстПустогоАдресаВВидеГиперссылки (БСП)

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