Заполнить поля для поиска. Вызывается из события ПриЗаписи вариантов.
// Вызывается из события ПриЗаписи вариантов.
// Возвращаемое значение:
// Булево - Истина, если поля для поиска заполнены и требуется записать ВариантОбъект.
//
Функция ЗаполнитьПоляДляПоиска(ВариантОбъект, СведенияОбОтчете = Неопределено) Экспорт
ПоляДляПоиска = ПоляДляПоиска(ВариантОбъект);
ПроверятьХеш = СведенияОбОтчете = Неопределено Или Не СведенияОбОтчете.ИндексироватьСхему;
Если ПроверятьХеш Тогда
// Проверка, заполнены ли поля для поиска ранее.
ЗаполнитьПоля = Лев(ПоляДляПоиска.НаименованияПолей, 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ТипыСопоставляемыхОбщихДанныхПоПолямПоиска (БСП)
ЗаполнитьСписокПрограммДляПоиска (БСП)
Проверка заполненности полей объекта и возврат статуса + незаполненных полей
Вывести все доступные поля СКД
ЗаполнитьСписокВыбораДляРассмотретьПосле (БСП)
ЗаполнитьКонтактыПоПредмету (БСП)