Есть отчет на СКД, формирующийся на основе среза периодического регистра сведений.
Форма не задана, используется "Основная форма отчета" из св-в конфигурации, в качестве которой задана Общая Форма ФормаОтчета из БСП 3.1.7 .
Необходимо (желательно, через расширение) добавить возможность формировать отчет по движениям конкретного документа (т.е. доп. параметр "Документ").
Проблема: если задан документ, некоторые другие настройки теряют смысл -- их нужно брать из документа.
Т.е. желательно соотв. поля засеривать, а их значения устанавливать в значения полей выбранного документа; либо вообще скрывать.
Не нахожу в документации, можно ли это как-то сделать. Обычно такое делается через обработчики событий полей в модуле формы (а для консолидации логики создается процедура ОбновитьВидимостьДоступность, которую вызывают все обработчики полей, а также ПриОткрытии).
Здесь модуля формы вообще нет, поля настроек, насколько вижу, создаются динамически. Непонятно, как и на каком этапе привязать к полю обработчик и как обращаться к динамически созданным полям, откуда брать их имена.
Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?
Кроме них, также есть:
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетОбъект.<ИмяОтчета>->События):
* ОбработкаПроверкиЗаполнения
* ПриКомпоновкеРезультата
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетМенеджер.<ИмяОтчета>->События):
* ОбработкаПолученияФормы
Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".
Поиск по коду (ниже -- ОбщийМодуль.ВариантыОтчетов.ИспользуемыеТаблицыОтчета) показывает, что поля событий, для которых есть обработчики, нужно установить в "Истина", а обработчики поместить в модуль объекта:
Если Результат.НастройкиФормы.События.ПриОпределенииИспользуемыхТаблиц Тогда
ОтчетОбъект.ПриОпределенииИспользуемыхТаблиц(Результат.КлючВарианта, ИспользуемыеТаблицы);
КонецЕсли;
Сам код, который отредактирует структуру "Настройки", нужно поместить в "<модуль объекта отчета>.ОпределитьНастройкиФормы" (ниже -- ОбщийМодуль.ВариантыОтчетов.НастройкиОтчета):
Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
<...>
Попытка
ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета);
Исключение
<...>
КонецПопытки;
<...>
Возврат НастройкиОтчета;
КонецФункции
Здесь модуля формы вообще нет, поля настроек, насколько вижу, создаются динамически. Непонятно, как и на каком этапе привязать к полю обработчик и как обращаться к динамически созданным полям, откуда брать их имена.
Не понятно что имеется ввиду в этой цитате.
Форма отчета по умолчанию задана в конфе, для типовых это всегда общая форма ФормаОтчета, в ней все это есть.
+ В самом отчете есть разные события, типо ПриОткрытии, но только их можно переопределить через модуль отчета, в них есть ФОРМА отчета, куда вы можете накидать свой код и без расширения изменить форму. Поиграйтесь с отладкой и увидите.
Например можно как то так сделать - При создании на сервере (разумеется в расширение после) проверить на имя отчета и установить действие нужно вам, а далее в действие прописать код. Мне казалось что в отчете точно есть описываемая вами универсальная процедура. Попробуйте изменить реквизит и через отладка замер включить, кажется там была "универсальная" процедура которая вызывается при изменении, но это не точно
Здесь модуля формы вообще нет, поля настроек, насколько вижу, создаются динамически. Непонятно, как и на каком этапе привязать к полю обработчик и как обращаться к динамически созданным полям, откуда брать их имена.
Не понятно что имеется ввиду в этой цитате.
В самом отчете форма не задана -- соответственно, модуля формы в нем также нет.
Да, у общей формы модуль есть. Но не могу же я пихать в общую форму для всех отчетов код для каждого конкретного! Любой код для конкретного отчета обязан находиться внутри поддерева конфигурации этого отчета и нигде больше -- иначе не будет никакой модульности, и я быстро зароюсь в собственных багах! Единственное исключение -- модули с именами "переопределяемый" -- и то со строжайшими ограничениями: разрешается исключительно добавить вызов шаблонного коллбэка из своего модуля, выполняющего строго определенную функцию.
Насколько вижу -- предполагается добавлять в модули объекта и менеджера (единственные модули кода, которые есть в отчете без своей формы) -- функции с "волшебными" именами, которые логика ФормаОтчета и другой код БСП поищет и вызовет в определенные моменты.
Непонятно, как собрать полный список этих "волшебных" имен и документацию по ним.
Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?
Кроме них, также есть:
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетОбъект.<ИмяОтчета>->События):
* ОбработкаПроверкиЗаполнения
* ПриКомпоновкеРезультата
* (в синтакс-помощнике "Прикладные объекты->Отчеты->ОтчетМенеджер.<ИмяОтчета>->События):
* ОбработкаПолученияФормы
Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".
Поиск по коду (ниже -- ОбщийМодуль.ВариантыОтчетов.ИспользуемыеТаблицыОтчета) показывает, что поля событий, для которых есть обработчики, нужно установить в "Истина", а обработчики поместить в модуль объекта:
Если Результат.НастройкиФормы.События.ПриОпределенииИспользуемыхТаблиц Тогда
ОтчетОбъект.ПриОпределенииИспользуемыхТаблиц(Результат.КлючВарианта, ИспользуемыеТаблицы);
КонецЕсли;
Сам код, который отредактирует структуру "Настройки", нужно поместить в "<модуль объекта отчета>.ОпределитьНастройкиФормы" (ниже -- ОбщийМодуль.ВариантыОтчетов.НастройкиОтчета):
Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
<...>
Попытка
ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета);
Исключение
<...>
КонецПопытки;
<...>
Возврат НастройкиОтчета;
КонецФункции
Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?
Именно так
Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".
А вы комментарий развернули? там все написано и про ОпределитьНастройкиФормы тоже сказано, там как раз есть пример же и описание, что, как и когда вызывается. Данная информация должна быть на ИТС кстати, в разделе БСП. Еще можно демо БСП качнуть. Там точно в доп отчетах был отчет с примерами. Только вот конкретно вашего (с доступностью реквизитов) не было.
там все написано и про ОпределитьНастройкиФормы тоже сказано, там как раз есть пример же и описание, что, как и когда вызывается.
Развернул. Ничего такого нет (БСП 3.1.7.382). "ОпределитьНастройкиФормы" упоминается 1 раз, вскользь, в описании параметра "ЗагрузитьНастройкиПриИзмененииПараметров" (см. ниже), информация совершенно не соответствует тому, что мы выяснили выше. Из описания также совершенно не понятно, куда что из этого вставлять и какой код из примера обязателен, а какой приведен для примера.