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

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

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

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

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

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

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

----

```1c
    Функция НастройкиОтчетаПоУмолчанию() Экспорт
    <...>

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

    Настройки.Вставить("События", События);

    Возврат Настройки;
    КонецФункции
```

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

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

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

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

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

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

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

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

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

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

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

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

----

```1c
    Функция НастройкиОтчетаПоУмолчанию() Экспорт
    <...>

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

    Настройки.Вставить("События", События);

    Возврат Настройки;
    КонецФункции
```

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

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

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

```1c
    Функция НастройкиОтчета(ОтчетСсылка, КлючВарианта, ОтчетОбъект)
    НастройкиОтчета = ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию();
    <...>
    Попытка
    ОтчетОбъект.ОпределитьНастройкиФормы(Неопределено, КлючВарианта, НастройкиОтчета);
    Исключение
    <...>
    КонецПопытки;
    <...>
    Возврат НастройкиОтчета;
    КонецФункции
```
---
Окей. Намекаете, что список событий в этой функции (приведен в коде ниже) -- это полный список имен, которые код БСП ищет в модуле объекта конкретного отчета?
Именно так
Насколько вижу (см.ниже), это все-таки еще не всё, еще есть, по крайней мере, "ОпределитьНастройкиФормы". Похоже, чтобы найти вообще всё, надо искать по общим модулям и формам по строкам "ОтчетОбъект." и "ОтчетМенеджер.".

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

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

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

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