Отчет на СКД, общая ФормаОтчета БСП: Программное изменение видимости/доступности/значений полей-параметров

1. native-api 19 26.07.23 17:21 Сейчас в теме
Есть отчет на СКД, формирующийся на основе среза периодического регистра сведений.
Форма не задана, используется "Основная форма отчета" из св-в конфигурации, в качестве которой задана Общая Форма ФормаОтчета из БСП 3.1.7 .

Необходимо (желательно, через расширение) добавить возможность формировать отчет по движениям конкретного документа (т.е. доп. параметр "Документ").

Проблема: если задан документ, некоторые другие настройки теряют смысл -- их нужно брать из документа.
Т.е. желательно соотв. поля засеривать, а их значения устанавливать в значения полей выбранного документа; либо вообще скрывать.

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

Самое близкое, что пока что нашел -- это Библиотека стандартных подсистем 3.1.7 > Глава 4. Программный интерфейс > Варианты отчетов > Интерфейс > НастройкиОтчетаПоУмолчанию. Похоже, там описаны "точки входа" в логику формы БСП, куда можно добавлять свой код для конкретного отчета. Но там, похоже, описан не весь интерфейс: скажем, там нет обработчика ПриКомпоновкеРезультата, который используется в текущей реализации.
Найденные решения
5. native-api 19 08.08.23 17:59 Сейчас в теме
(4)
ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию

Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?

Кроме них, также есть:
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетОбъект.<ИмяОтчета>->События):
* ОбработкаПроверкиЗаполнения
* ПриКомпоновкеРезультата
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетМенеджер.<ИмяОтчета>->События):
* ОбработкаПолученияФормы

Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".

----

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

	Настройки.Вставить("События", События);
	
	Возврат Настройки;
КонецФункции
Показать


Поиск по коду (ниже -- ОбщийМодуль.ВариантыОтчетов.ИспользуемыеТаблицыОтчета) показывает, что поля событий, для которых есть обработчики, нужно установить в "Истина", а обработчики поместить в модуль объекта:

		Если Результат.НастройкиФормы.События.ПриОпределенииИспользуемыхТаблиц Тогда
			ОтчетОбъект.ПриОпределенииИспользуемыхТаблиц(Результат.КлючВарианта, ИспользуемыеТаблицы);
		КонецЕсли;


Сам код, который отредактирует структуру "Настройки", нужно поместить в "<модуль объекта отчета>.ОпределитьНастройкиФормы" (ниже -- ОбщийМодуль.ВариантыОтчетов.НастройкиОтчета):

Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
	НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
	<...>
	Попытка
		ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета);
	Исключение
		<...>
	КонецПопытки;
	<...>
	Возврат НастройкиОтчета;
КонецФункции

Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. newlogin1 26.07.23 18:06 Сейчас в теме
Здесь модуля формы вообще нет, поля настроек, насколько вижу, создаются динамически. Непонятно, как и на каком этапе привязать к полю обработчик и как обращаться к динамически созданным полям, откуда брать их имена.

Не понятно что имеется ввиду в этой цитате.

Форма отчета по умолчанию задана в конфе, для типовых это всегда общая форма ФормаОтчета, в ней все это есть.
+ В самом отчете есть разные события, типо ПриОткрытии, но только их можно переопределить через модуль отчета, в них есть ФОРМА отчета, куда вы можете накидать свой код и без расширения изменить форму. Поиграйтесь с отладкой и увидите.
Например можно как то так сделать - При создании на сервере (разумеется в расширение после) проверить на имя отчета и установить действие нужно вам, а далее в действие прописать код. Мне казалось что в отчете точно есть описываемая вами универсальная процедура. Попробуйте изменить реквизит и через отладка замер включить, кажется там была "универсальная" процедура которая вызывается при изменении, но это не точно
3. native-api 19 08.08.23 12:29 Сейчас в теме
(2)
Здесь модуля формы вообще нет, поля настроек, насколько вижу, создаются динамически. Непонятно, как и на каком этапе привязать к полю обработчик и как обращаться к динамически созданным полям, откуда брать их имена.

Не понятно что имеется ввиду в этой цитате.


В самом отчете форма не задана -- соответственно, модуля формы в нем также нет.

Да, у общей формы модуль есть. Но не могу же я пихать в общую форму для всех отчетов код для каждого конкретного! Любой код для конкретного отчета обязан находиться внутри поддерева конфигурации этого отчета и нигде больше -- иначе не будет никакой модульности, и я быстро зароюсь в собственных багах! Единственное исключение -- модули с именами "переопределяемый" -- и то со строжайшими ограничениями: разрешается исключительно добавить вызов шаблонного коллбэка из своего модуля, выполняющего строго определенную функцию.

Насколько вижу -- предполагается добавлять в модули объекта и менеджера (единственные модули кода, которые есть в отчете без своей формы) -- функции с "волшебными" именами, которые логика ФормаОтчета и другой код БСП поищет и вызовет в определенные моменты.

Непонятно, как собрать полный список этих "волшебных" имен и документацию по ним.
4. newlogin1 08.08.23 16:49 Сейчас в теме
(3)А зачем их собирать? ОтчетыКлиентСервер НастройкиОтчетаПоУмолчанию
native-api; +1 Ответить
5. native-api 19 08.08.23 17:59 Сейчас в теме
(4)
ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию

Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?

Кроме них, также есть:
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетОбъект.<ИмяОтчета>->События):
* ОбработкаПроверкиЗаполнения
* ПриКомпоновкеРезультата
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетМенеджер.<ИмяОтчета>->События):
* ОбработкаПолученияФормы

Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".

----

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

	Настройки.Вставить("События", События);
	
	Возврат Настройки;
КонецФункции
Показать


Поиск по коду (ниже -- ОбщийМодуль.ВариантыОтчетов.ИспользуемыеТаблицыОтчета) показывает, что поля событий, для которых есть обработчики, нужно установить в "Истина", а обработчики поместить в модуль объекта:

		Если Результат.НастройкиФормы.События.ПриОпределенииИспользуемыхТаблиц Тогда
			ОтчетОбъект.ПриОпределенииИспользуемыхТаблиц(Результат.КлючВарианта, ИспользуемыеТаблицы);
		КонецЕсли;


Сам код, который отредактирует структуру "Настройки", нужно поместить в "<модуль объекта отчета>.ОпределитьНастройкиФормы" (ниже -- ОбщийМодуль.ВариантыОтчетов.НастройкиОтчета):

Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
	НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
	<...>
	Попытка
		ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета);
	Исключение
		<...>
	КонецПопытки;
	<...>
	Возврат НастройкиОтчета;
КонецФункции

Показать
6. newlogin1 09.08.23 09:49 Сейчас в теме
(5)
Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?

Именно так
Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".

А вы комментарий развернули? там все написано и про ОпределитьНастройкиФормы тоже сказано, там как раз есть пример же и описание, что, как и когда вызывается. Данная информация должна быть на ИТС кстати, в разделе БСП. Еще можно демо БСП качнуть. Там точно в доп отчетах был отчет с примерами. Только вот конкретно вашего (с доступностью реквизитов) не было.
7. native-api 19 09.08.23 10:49 Сейчас в теме
(6)
там все написано и про ОпределитьНастройкиФормы тоже сказано, там как раз есть пример же и описание, что, как и когда вызывается.


Развернул. Ничего такого нет (БСП 3.1.7.382). "ОпределитьНастройкиФормы" упоминается 1 раз, вскользь, в описании параметра "ЗагрузитьНастройкиПриИзмененииПараметров" (см. ниже), информация совершенно не соответствует тому, что мы выяснили выше. Из описания также совершенно не понятно, куда что из этого вставлять и какой код из примера обязателен, а какой приведен для примера.

В ИТС тоже искал, нашел тоже только упоминание вскользь в Библиотека стандартных подсистем 3.1.7 -> Глава 4. Программный интерфейс ->Варианты отчетов ->Интерфейс ->ОписаниеОтчета, и информация тоже совершенно не соответствует тому, что мы выяснили выше.

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот