среда, 3 августа 2022 г.

1С СКД БСП Значение параметра по-умолчанию

 Тривиальная задача - предопределить период для отчета в тех случаях, когда параметр не заполнен пользователем ранее (сохраненные настройки), оказалась не такой простой.

В интернетах есть описание решения задачи через создание своей формы с выводом параметров и их переопределения ПриОткрытии() по нашему условию (я проверял на пустую дату). Это было хорошим и простым на СКД 2.Х версии, а вот на 3.1.7 (обновил самописную конфигурацию) я столкнулся со следующими проблемами

Своя форма отчета = геморрой вселенского масштаба:

ошибка "Значение не является значением объектного типа (ПолноеИмя):
КлючСохраненияПоложенияОкна = ОписаниеНастроекОтчета.ПолноеИмя;

На что ИТС говорит нам следующее:

Внимание! Не поддерживается ситуация, когда отчет подключен только к некоторым из указанных форм. В частности, в случае «Полного» варианта внедрения, если для отчета на СКД определена собственная основная форма, то для него также следует определить собственную форму настроек (либо в свойствах этого отчета указать общую форму ВспомогательнаяФормаНастроекОтчета). Это требование также распространяется на дополнительные и внешние отчеты, использующиеся в конфигурации с «Полным» вариантом внедрения формы отчета. 

Предложенная форма собственно заглушка и ничего более. Внимательно изучив отчеты в своей конфигурации я пришел к выводу, что собственные формы отчетов мне не нужны и можно использовать стандартную форму.

Оффтоп. После обновления версии БСП в своей конфигурации с 2.Х на 3.Х у меня отчеты работали некорректно, оказалось надо было проверить свойства самой конфигурации, где необходимо было указать общую форму отчета (задавал вопрос на Инфостарте)

Вот тут начинается геморрой, а именно, просто так предопределённые варианты отчетов не появятся на форме, этот момент опять же описывается на ИТС почти в самом конце раздела:

Внимание! Для того чтобы изменения в метаданных конфигурации (добавление, изменение отчетов, вариантов отчетов и т. п.) вступили в силу, необходимо обновить данные справочника ВариантыОтчетов. В большинстве случаев он обновляется автоматически при каждом изменении номера версии конфигурации – в процессе обновления или первоначального заполнения информационной базы. При ведении разработки и отладки конфигурации его рекомендуется обновлять вручную, подробнее см. раздел Обновление вспомогательных данных во время разработки.

 Наконец у меня начали отображаться предопределенные варианты отчетов. Дальше другая проблема - не передаются параметры с формы (на стандартную форму отчета они попадают автоматически если настроен быстрый доступ). Тут как бы мой косяк по некоторым причинам:

  1. При создании отчетов в далеком прошлом я не смог вывести предопределенные параметры периода СКД на форму, т.к. они были скрыты, в связи с чем создал новые
  2. Плюс в модуле объекта (отчета) была определена процедура ПриКомпоновкеРезультата(), которая привела к другой ошибке - сброс установленных ранее настроек, пустому отчету и, в некоторых случаях, ошибке "Параметр с указанным именем не найден"
В итоге прояснились некоторые моменты:
  1. В процедуре ПриКомпоновкеРезультата() можно переопределить настройки/параметры ПОСЛЕ нажатия сформировать. Заранее предупреждать о наличии данной процедуры необходимости нет
  2. А в процедуре ПередЗагрузкойВариантаНаСервере() можно предопределить настройки/параметры ДО открытия формы отчета. При этом сохраненные пользователем настройки загрузятся после этой процедуры. Для вызова этой процедуры из глубин нужен определенное заклинание:

В модуле ВариантыОтчетовПереопределяемый установить настройку ОпределитьНастройкиФормы в Истину

 
Процедура НастроитьВариантыОтчетов(Настройки) Экспорт
	НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.БалансИнна);
	НастройкиОтчета.Включен=Истина;
	НастройкиОтчета.ОпределитьНастройкиФормы=Истина;
КонецПроцедуры

В модуле Объекта (отчета) добавить процедуру ОпределитьНастройкиФормы, там подписаться на событие (аналог ПриСозданииНаСервере) и определить саму процедуру, в которой описываем наши хотелки

 
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПередЗагрузкойВариантаНаСервере=Истина;
КонецПроцедуры
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
	ТекПериод=новый СтандартныйПериод;
	ТекПериод.ДатаНачала=НачалоГода(ДобавитьМесяц(ТекущаяДата(),-12));
	ТекПериод.ДатаОкончания=КонецГода(ТекущаяДата());
	НовыеНастройкиКД.ПараметрыДанных.УстановитьЗначениеПараметра("СтандартныйПериод",ТекПериод);
КонецПроцедуры

Стоит обратить внимание на то, что в описании процедуры НастроитьВариантыОтчетов указан шаблон определения процедуры ОпределитьНастройкиФормы, в этом шаблоне не используются инструкции препроцессора, а вот в ИТС использован. В инструкции указан условный блок проверящий толстый ли это клиент или сервер или внешнеесоединение нет, т.о. подписка на событие в примере ИТС не включается на тонком клиенте. 

Также обратил внимание на то, что при удалении настроек отчета из процедуры НастроитьВариантыОтчетов ничего не меняется, подписка на событие остается, ОбновлениеВспомогательныхДанных.epf естественно выполнял.

Добавлено позже:

Хм, очень странно. Устанавливал  "НастройкиОтчета.ОпределитьНастройкиФормы=Ложь;" и обновлял вспомогательные данные, результат нулевой, но при этом новый отчет отказался работать без этих манипуляций

Добавлено еще позже:

Также можно в ПриКомпановкеРезультата проверить параметр и изменить его. Например проверка на пустую дату, если в периоде начало и конец пустаяДата, то результат тоже будет пустой. Поэтому я добавил проверку (да, это можно сделать и в запросе, но мне влом)

 
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Есть параметры НачалоПериода, КонецПериода, СтанадртныйПериод. В самом СКД установлены выражения НачалоПериода=&СтандартныйПериод.ДатаНачала и КонецПериода=&СтандартныйПериод.ДатаОкончания
// измение параметра СтандартныйПериод на данном этапе не обновит параметры НачалоПериода и КонецПериода, поэтому задаем явно
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();	
	СтандартныйПериод  = НастройкиОтчета.ПараметрыДанных.Элементы.Найти("СтандартныйПериод").Значение; 
	Если СтандартныйПериод.ДатаОкончания=Дата('00010101') Тогда	  
		 ПарамКонецПериода = Новый ПараметрКомпоновкиДанных("КонецПериода");
		 КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ПарамКонецПериода, КонецГода(ТекущаяДата()));
	КонецЕсли;
КонецПроцедуры

Комментариев нет:

Отправить комментарий