Оглавление
Вступление
Цель анализа
Анализ
Результат
Итоги
Вступление
В типовых конфигурациях можно обнаружить, что значительная часть отчетов не содержат собственных форм, а вместо них указаны общие формы ФормаОтчета, ФормаНастроекОтчета и ФормаВариантаОтчета.
Анализ конфигурации ERP 2.5, на БСП версии 3.1.9 показал, что в ней аж 1063 отчета, у 273 из них формой отчета установлена общая форма ФормаОтчета. У 221 отчета форма не указана вообще. В таких случаях тоже автоматически подставляется Основная форма отчета конфигурации, а в типовых - это ФормаОтчета. Таким образом ее использует почти половина отчетов.
Человеку, впервые увидевшему подключенную общую форму, может показаться, что изменить и настроить там что-то либо невозможно, либо слишком сложно. И уж совсем неочевидным покажется искать информацию на ИТС в разделе Настройка и использование подсистем - ВариантыОтчетов.
Цель анализа
Определить самые частые сценарии программной настройки формы ФормаОтчета. Понять, где размещать код и какой. Пришла задача например создать пользовательский параметр при запуске отчета, быстро посмотреть - как, откорректировать код из примера, готово.
Анализ
В ИТС в описании подсистемы Варианты отчетов мы узнаем, что по задумке разработчиков подсистемы предполагается описать нужные процедуры событий общей формы в модуле объекта отчета. Чтобы подключить нужные события, нужно прописать их в модуле объекта отчета в экспортной процедуре ОпределитьНастройкиФормы. Иногда там указываются и параметры открытия формы. Их список будет приведен ниже в разделе Результат
Также в этой процедуре можно указать параметры открытия формы:
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;
Настройки.ФормироватьСразу = Истина;
КонецПроцедуры
Процедура ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Экспорт
// ...
КонецПроцедуры
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт
// ...
КонецПроцедуры
ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
ПослеЗагрузкиНастроекВКомпоновщик(ДополнительныеПараметры) Экспорт БСП 3.1.6+
//Вместо устаревшего события ПриОпределенииПараметровВыбора. В нем возможно не только уточнять
//параметры выбора (например, список выбора), но и делать это с учетом загруженных фиксированных
//настроек. Кроме того, новое событие вызывается и при неинтерактивном формировании отчета,
//например, при рассылке отчетов.
ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
ПередЗаполнениемПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
//в ИТС написано: устаревшее. Новое: 3.1.6 ПослеЗагрузкиНастроекВКомпоновщик
//но и в ERP на БСП 3.1.9 используется часто
ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт
ПриОпределенииОсновныхПолей(Форма, ОсновныеПоля) Экспорт
ПередФормированиемОтчета(ФормаОтчета, ДополнительныеПараметры) Экспорт
ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
Однако и справка ИТС довольно скупо описывает, для чего могут пригодиться все эти процедуры, поэтому я произвел анализ всех встроенных отчетов из ERP 2.5 с целью понять что к чему. В этом мне значительно помог очень сообразительный ИИ в виде Gemini 1.5 Pro, которому я скормил модуль формы и текст процедур событий из модулей отчетов.
Результат
Сценарии использования отсортированы по убывающей частотности и приведены упрощенные примеры реализации. Цифра перед сценарием означает количество использований в конфигурации.
-
Определение настроек
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
Настройки.ФормироватьСразу = Истина;
КонецПроцедуры
-
Параметры
Формировать отчет сразу при открытии формы
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.ФормироватьСразу = Истина;
КонецПроцедуры
Выводить сумму выделенных ячеек в шапке формы
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.ВыводитьСуммуВыделенныхЯчеек = Ложь;
КонецПроцедуры
Настройки.РазрешеноИзменятьВарианты = Ложь;
Запретить пользователю изменять структуру
Настройки.РазрешеноИзменятьСтруктуру = Ложь;
Настройки.РазрешеноВыбиратьИНастраиватьВариантыБезСохранения = Истина;
Настройки.СкрытьКомандыРассылки = Истина;
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.Печать.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Настройки.Печать.ПолеСверху = 5;
Настройки.Печать.ПолеСлева = 5;
Настройки.Печать.ПолеСнизу = 5;
Настройки.Печать.ПолеСправа = 5;
КонецПроцедуры
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.ПараметрыРасположенияЭлементовУправления = ПараметрыРасположенияЭлементовУправления();
КонецПроцедуры
Функция ОпределитьРасположениеЭлементовУправления()
МассивНастроек = Новый Массив;
НастройкиЭлементаУправления = Новый Структура;
НастройкиЭлементаУправления.Вставить("Поле" , "ДетализироватьПоПериоду");
НастройкиЭлементаУправления.Вставить("РастягиватьПоГоризонтали" , Ложь);
НастройкиЭлементаУправления.Вставить("АвтоМаксимальнаяШирина" , Ложь);
НастройкиЭлементаУправления.Вставить("Ширина" , 12);
МассивНастроек.Добавить(НастройкиЭлементаУправления);
НастройкиЭлементовУправления = Новый Структура();
НастройкиЭлементовУправления.Вставить("ПараметрыДанных", МассивНастроек);
Возврат НастройкиЭлементовУправления;
КонецФункции
Параметры, изменение которых приводит к перезагрузке настроек
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Массив = Новый Массив;
Массив.Добавить(Новый ПараметрКомпоновкиДанных("Организация"));
Настройки.ЗагрузитьНастройкиПриИзмененииПараметров = Массив;
КонецПроцедуры
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.РазрешеноЗагружатьСхему = Истина;
КонецПроцедуры
Только для толстого клиента
Настройки.РазрешеноРедактироватьСхему = Истина;
Настройки.РазрешеноВосстанавливатьСтандартнуюСхему = Истина;
-
События и примеры
Используется крайне редко.
Процедура ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт
ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя());
КонецПроцедуры
Как работает механизм проверки используемых таблиц:
-
Определение используемых таблиц: При формировании отчета 1С определяет список таблиц объектов метаданных, которые используются в отчете. Это может быть сделано с помощью анализа схемы компоновки данных или текста запроса.
-
Проверка на обновление: Для каждой таблицы из списка проверяется, была ли она обновлена в текущем сеансе работы 1С.
-
Сообщение пользователю: Если хотя бы одна из таблиц еще не обновлена, то пользователю выводится сообщение о том, что отчет может содержать некорректные данные.
Обычный вариант
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
Параметры = Форма.Параметры;
Если Параметры.Свойство("ПараметрКоманды")
И Параметры.ОписаниеКоманды.Свойство("ДополнительныеПараметры")
И Параметры.ОписаниеКоманды.ДополнительныеПараметры.ИмяКоманды = "АнализРасхождений" Тогда
МассивСсылок = ПолучитьМассивСсылок();
Форма.ФормаПараметры.Отбор.Вставить("ДокументОснование", МассивСсылок);
КонецЕсли;
КонецПроцедуры
Очистка отбора перед заполнением
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
Параметры = Форма.Параметры;
Если Параметры.Свойство("ПараметрКоманды") И Параметры.ПараметрКоманды.Количество() <> 0 Тогда
Правило = Параметры.ПараметрКоманды[0];
ФормаПараметры = Форма.ФормаПараметры;
ФормаПараметры.Отбор.Очистить();
ФормаПараметры.Отбор.Вставить("Правило", Правило);
КонецЕсли;
КонецПроцедуры
Параметры = Форма.Параметры;
Если Параметры.Свойство("ПараметрКоманды")
И Параметры.Свойство("ОписаниеКоманды")
И Параметры.ОписаниеКоманды.Свойство("ДополнительныеПараметры") Тогда
Форма.ФормаПараметры.КлючНазначенияИспользования = Параметры.ОписаниеКоманды.ДополнительныеПараметры.ИмяКоманды;
Параметры.КлючНазначенияИспользования = Параметры.ОписаниеКоманды.ДополнительныеПараметры.ИмяКоманды;
КонецЕсли;
В зависимости от контекста вызова отчета можно устанавливать разные КлючНазначенияИспользования. Это приведет к автоматической загрузке/сохранению собственного набора пользовательских настроек при закрытии формы для разных команд запуска.
Контексты вызова - открытие из панели отчетов, из списка документа, как расшифровки из другого отчета и т.д.
КлючВарианта = "КарточкаРасчетов"
Форма.Параметры.КлючВарианта = КлючВарианта;
Форма.КлючТекущегоВарианта = КлючВарианта;
В зависимости от установленного КлючВарианта, будет использоваться соответствующий вариант отчета по имени.
Вариант 1. Используется чаще всего. Добавляется команда и кнопка в нестандартные места вроде окна результата или контекстное меню результата.
Команда = Форма.Команды.Добавить("ЗапроситьВыделенныеДанные");
Команда.Действие = "Подключаемый_Команда";
Команда.Заголовок = "Запросить из ЕГАИС";
Кнопка = Форма.Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), Форма.Элементы.ОтчетТабличныйДокументКонтекстноеМеню);
Кнопка.ИмяКоманды = Команда.Имя;
Форма.ПостоянныеКоманды.Добавить(Команда.Имя);
Вариант 2. Рекомендован на ИТС, но имеет ограничения по местам размещения команды
"Главное" - группа с кнопками "Сформировать" и "Формировать сразу".
"Настройки" - группа с кнопками "Настройки", "Изменить вариант отчета" и т.п.
"РаботаСТабличнымДокументом" - группа с кнопками "Найти", "Развернуть все группы" и т.п.
"Интеграция" - группа такими кнопками как "Печать, Сохранить, Отправить" и т.п.
"ПодменюОтправить" - подменю в группе "Интеграция" для отправки по почте.
"Прочее" - группа с кнопками "Изменить форму", "Справка" и т.п.
Команда = Форма.Команды.Добавить("ПрогрессОтложенногоОбновленияЗависимости");
Команда.Действие = "Подключаемый_Команда";
Команда.Заголовок = "Зависимости обработчика";
Команда.Картинка = БиблиотекаКартинок.ЗатенитьФлажки;
ОтчетыСервер.ВывестиКоманду(Форма, Команда, "Настройки");
Описание действия команды указывается
Форма.НастройкиОтчета.РазрешеноВыбиратьВарианты = Ложь;
Параметры = Форма.Параметры;
Если Параметры.Свойство("ПараметрКоманды") Тогда
Форма.ФормаПараметры.Вставить("НастройкаФормированияПроводок", Параметры.ПараметрКоманды);
КонецЕсли;
Параметр, недоступный для пользователя и от которого не зависят другие настройки, лучше задать в ПриКомпоновкеРезультата
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек, "ВидДокумента", ВидДокумента);
// или:
ПараметрВидДокумента = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("ВидДокумента"));
ПараметрВидДокумента.Значение = ВидДокумента;
Также см. статью Процедура ПриКомпоновкеРезультата
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
Параметры = Форма.Параметры;
// Дополнительные команды
НастройкиОтчета = Форма.НастройкиОтчета;
Если Параметры.Свойство("Расшифровка")
И Параметры.Расшифровка <> Неопределено Тогда
// Исправление варианта отчета при расшифровке
Если ЭтоАдресВременногоХранилища(Параметры.Расшифровка.Данные) Тогда
ДанныеРасшифровки = ПолучитьИзВременногоХранилища(Параметры.Расшифровка.Данные);
Если Параметры.Свойство("КлючВарианта") И Параметры.КлючВарианта = Неопределено Тогда
Параметры.КлючВарианта = ДанныеРасшифровки.Настройки.ДополнительныеСвойства.КлючВарианта;
КонецЕсли;
Форма.КлючТекущегоВарианта = ДанныеРасшифровки.Настройки.ДополнительныеСвойства.КлючВарианта;
КонецЕсли;
НастройкиОтчета.ВариантСсылка = ВариантыОтчетов.ВариантОтчета(НастройкиОтчета.ОтчетСсылка, Форма.КлючТекущегоВарианта);
КонецЕсли;
КонецПроцедуры
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
ПараметрВалюта = СхемаКомпоновкиДанных.Параметры.Валюта;
ПараметрВалюта.ВключатьВДоступныеПоля = Ложь;
ПараметрВалюта.ОграничениеИспользования = Истина;
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Форма, СхемаКомпоновкиДанных, "");
КонецПроцедуры
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
НастройкиОтчета = Форма.НастройкиОтчета;
НастройкиОтчета.СхемаМодифицирована = Истина;
Схема = ПолучитьИзВременногоХранилища(НастройкиОтчета.АдресСхемы);
Поле = Схема.НаборыДанных.ПраваПользователей.Поля.Найти("ГруппаДоступа");
Поле.Заголовок = "Профиль пользователя";
Поле.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ПрофилиГруппДоступа");
НастройкиОтчета.АдресСхемы = ПоместитьВоВременноеХранилище(Схема, Форма.УникальныйИдентификатор);
КонецПроцедуры
Тоже используется изменение в схеме компоновки, но другим способом
Процедура ПередЗагрузкойВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт
Отчет = ЭтаФорма.Отчет;
КомпоновщикНастроекФормы = Отчет.КомпоновщикНастроек;
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьЕдиницыИзмеренияДляОтчетов") Тогда
КомпоновкаДанныхСервер.УдалитьПараметрИзПользовательскихНастроекОтчета(КомпоновщикНастроекФормы, "ЕдиницыКоличества");
КонецЕсли;
Если ПолучитьФункциональнуюОпцию("ИспользоватьПартнеровКакКонтрагентов") Тогда
КомпоновкаДанныхСервер.УдалитьЭлементОтбораИзВсехНастроекОтчета(КомпоновщикНастроекФормы, "Контрагент");
КонецЕсли;
НовыеНастройкиКД = КомпоновщикНастроекФормы.Настройки;
КонецПроцедуры
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
Если НовыеНастройкиКД <> Неопределено
И Форма.ФормаПараметры.Отбор.Свойство("ОтчетЕГАИС") И ТипЗнч(Форма.ФормаПараметры.Отбор.ОтчетЕГАИС) = Тип("ДокументСсылка.ОтчетЕГАИС") Тогда
Период = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Форма.ФормаПараметры.Отбор.ОтчетЕГАИС, "Период");
НовыеНастройкиКД.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Новый СтандартныйПериод(НачалоМесяца(Период), КонецМесяца(Период)));
КонецЕсли;
КонецПроцедуры
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
НайденныйПараметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДокументВладелец");
Если НайденныйПараметр = Неопределено Тогда
Возврат;
КонецЕсли;
ДокументВладелец = НайденныйПараметр.Значение;
Если Не ЗначениеЗаполнено(ДокументВладелец) Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Форма.КонтекстВарианта) Тогда
НовыеНастройкиКД.ДополнительныеСвойства.Вставить("ИсходныйДокументВладелец", ДокументВладелец);
КонецЕсли;
УстановитьПараметрыДанных(НовыеНастройкиКД, Новый Структура("ДокументВладелец", ДокументВладелец));
КонецПроцедуры
Процедура ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
Отчет = Форма.Отчет;
КомпоновщикНастроекФормы = Отчет.КомпоновщикНастроек;
НовыеНастройкиКД = КомпоновщикНастроекФормы.Настройки;
КонецПроцедуры
Процедура ПриЗагрузкеВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт
Отчет = ЭтаФорма.Отчет;
Параметры = ЭтаФорма.НастройкиОтчета;
КомпоновщикНастроекФормы = Отчет.КомпоновщикНастроек;
Если Параметры.Свойство("Расшифровка") И Параметры.Расшифровка <> Неопределено
И Параметры.Расшифровка.ПрименяемыеНастройки.ДополнительныеСвойства.Свойство("ФиксированныеНастройки") Тогда
КомпоновщикНастроекФормы.ЗагрузитьНастройки(Параметры.Расшифровка.ПрименяемыеНастройки);
НовыеНастройкиКД = КомпоновщикНастроекФормы.Настройки;
КонецЕсли;
КонецПроцедуры
Процедура ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
Отчет = Форма.Отчет;
КомпоновщикНастроекФормы = Отчет.КомпоновщикНастроек;
УстановитьПериодОтчета(Форма, КомпоновщикНастроекФормы);
НовыеНастройкиКД = КомпоновщикНастроекФормы.Настройки;
КонецПроцедуры
Процедура ПриЗагрузкеВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт
Отчет = ЭтаФорма.Отчет;
КомпоновщикНастроекФормы = Отчет.КомпоновщикНастроек;
НастроитьПараметрыОтборыПоФункциональнымОпциям(КомпоновщикНастроекФормы);
НовыеНастройкиКД = КомпоновщикНастроекФормы.Настройки;
КонецПроцедуры
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
Отчет = Форма.Отчет;
КомпоновщикНастроекФормы = Отчет.КомпоновщикНастроек;
НастроитьПользовательскиеНастройкиПоФункциональнымОпциям(КомпоновщикНастроекФормы);
НовыеПользовательскиеНастройкиКД = КомпоновщикНастроекФормы.ПользовательскиеНастройки;
КонецПроцедуры
Процедура НастроитьПользовательскиеНастройкиПоФункциональнымОпциям(КомпоновщикНастроекФормы)
ИспользоватьУправлениеПроизводством = ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством")
ИЛИ ПолучитьФункциональнуюОпцию("ИспользоватьУправлениеПроизводством2_2");
Если Не ИспользоватьУправлениеПроизводством Тогда
КомпоновкаДанныхСервер.УдалитьВыбранноеПолеИзВсехНастроекОтчета(КомпоновщикНастроекФормы,
"РаспределеноНаПроизводство");
КонецЕсли;
КонецПроцедуры
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
Если Форма.Параметры.Свойство("ПараметрКоманды") Тогда
Период = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Форма.Параметры.ПараметрКоманды, "НачалоПериода, ОкончаниеПериода, Периодичность");
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(
КомпоновщикНастроек,
"Период",
Новый СтандартныйПериод(Период.НачалоПериода, Период.ОкончаниеПериода),
ЗначениеЗаполнено(Период));
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(
КомпоновщикНастроек,
"Периодичность",
Период.Периодичность,
ЗначениеЗаполнено(Период));
НовыеПользовательскиеНастройкиКД = КомпоновщикНастроек.ПолучитьНастройки();
КонецЕсли;
КонецПроцедуры
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт
Если Форма.Параметры.Свойство("ПараметрКоманды") Тогда
КомпоновкаДанныхСервер.УдалитьПараметрИзПользовательскихНастроекОтчета(КомпоновщикНастроек, "ВыводитьЗаказ");
КонецЕсли;
КонецПроцедуры
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
Если Форма.КлючНазначенияИспользования = "ТекущиеДела" Тогда
КомпоновщикНастроекФормы = Форма.Отчет.КомпоновщикНастроек;
Для Каждого Элемент Из КомпоновщикНастроекФормы.ПользовательскиеНастройки.Элементы Цикл
Элемент.Использование = Ложь;
КонецЦикла;
КонецЕсли;
// ...
КонецПроцедуры
2. Изменение отборов и параметров в зависимости от функциональных опций
Процедура ПередЗаполнениемПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
Настройки = КомпоновщикНастроек.Настройки;
ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
ПараметрКД = ОтчетыКлиентСервер.НайтиПараметр(
Настройки,
ПользовательскиеНастройки,
"СтатьиЗатрат");
Если ПараметрКД <> Неопределено И ЗначениеЗаполнено(ПараметрКД.Значение) = Ложь Тогда
ПараметрКД.Значение = ИходныйСписокСтатей();
КонецЕсли;
КонецПроцедуры
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") Тогда
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВидовЦен") Тогда
Возврат;
КонецЕсли;
ПараметрВидЦены = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(
КомпоновщикНастроек.ПользовательскиеНастройки, "ВидЦены");
ВидЦены = ПараметрВидЦены.Значение;
Если Не ЗначениеЗаполнено(ВидЦены) Тогда
ВидЦены = Константы.ВидЦеныПлановойСтоимостиМатериаловРабот.Получить();
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек.ПользовательскиеНастройки, "ВидЦены", ВидЦены);
НовыеПользовательскиеНастройкиКД = КомпоновщикНастроек.ПользовательскиеНастройки;
КонецЕсли;
//ИначеЕсли ТипЗнч(Контекст) = Тип("Структура") Тогда
//ИначеЕсли ТипЗнч(Контекст) = Тип("НастройкиКомпоновкиДанных") Тогда
КонецЕсли;
КонецПроцедуры
Схема заменяется или изменяется программно и производится ее переподключение. Событие ПередЗагрузкойНастроекВКомпоновщик вызывается почти при каждом действии пользователя, поэтому желательно делать проверку через свойство КлючСхемы.
Такой код будет выполнен при открытии отчета и изменении пользователем варианта:
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
Если КлючСхемы <> КлючВарианта Тогда // при первом запуске КлючСхемы = ""
ИнициализироватьОтчет();
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКомпоновкиДанных, КлючСхемы);
КлючСхемы = КлючВарианта;
КонецЕсли;
КонецПроцедуры
Для такого условия даже изменение варианта не приведет к повторному выполнению, схема будет заменена и переподключена всего один раз:
Если КлючСхемы <> "1" Тогда
КлючСхемы = "1";
Схема = ПолучитьОбщийМакет("МояОбщаяСхемаКомпоновки");
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, Схема, КлючСхемы);
КонецЕсли;
При открытии формы КлючСхемы = "". КлючСхемы больше нигде не используется и его изменение ни на что не влияет.
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
ДоговорПоУмолчанию = Константы.ДоговорПоУмолчанию.Получить();
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(НовыеНастройкиКД, "Договор", ДоговорПоУмолчанию);
Для Каждого ЭлементОтбора Из НовыеНастройкиКД.Отбор.Элементы Цикл
ЭлементОтбора.Использование = Ложь;
КонецЦикла;
//Подключать схему не нужно, изменения производились в НовыеНастройкиКД, а не в СхемаКомпоновкиДанных
КонецПроцедуры
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
Если КлючСхемы = КлючВарианта Тогда
Возврат;
КонецЕсли;
КлючСхемы = КлючВарианта;
ЗаголовкиПолей = Новый Структура;
ЗаголовкиПолей.Вставить("Номенклатура", "Товар");
ЗаголовкиПолей.Вставить("Склад", "Склад");
КомпоновкаДанныхСервер.УстановитьЗаголовкиВыбранныхПолей(
НовыеНастройкиКД.Выбор.Элементы,
ЗаголовкиПолей
);
КомпоновкаДанныхСервер.УстановитьЗаголовкиПолейГруппировки(
НовыеНастройкиКД.Структура,
ЗаголовкиПолей
);
КонецПроцедуры
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
Если КлючСхемы <> "1" Тогда
КлючСхемы = "1";
СхемаКД = ПолучитьМакет("МакетПараметров");
Параметр = СхемаКД.Параметры.Найти("ПодробныеСведенияОПравахДоступа");
Параметр.ОграничениеИспользования = Истина;
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКД, КлючСхемы);
КонецЕсли;
КонецПроцедуры
Установка доступных значений параметра
Процедура ПослеЗагрузкиНастроекВКомпоновщик(ДополнительныеПараметры) Экспорт
Настройки = КомпоновщикНастроек.Настройки;
Параметр = Новый ПараметрКомпоновкиДанных("Право");
ДоступныйПараметр = Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(Параметр);
Если ДоступныйПараметр = Неопределено Тогда
Возврат;
КонецЕсли;
ДоступныйПараметр.ДоступныеЗначения = СписокДоступныхЗначений();
КонецПроцедуры
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
Если СвойстваНастройки.ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных.СписокРегистров") Тогда
СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
СвойстваНастройки.ЗначенияДляВыбора = СписокРегистров();
КонецЕсли;
КонецПроцедуры
Процедура ПослеЗаполненияПанелиБыстрыхНастроек(ЭтаФорма, ПараметрыЗаполнения) Экспорт
Параметры = ЭтаФорма.ФормаПараметры;
ЭлементыФормы = ЭтаФорма.Элементы;
Заказ = Неопределено;
Подразделение = Неопределено;
Для Каждого Элемент Из ЭлементыФормы Цикл
Если ТипЗнч(Элемент) <> Тип("ПолеФормы") Тогда
Продолжить;
КонецЕсли;
Если Элемент.Заголовок = "Заказ" Тогда
Заказ = Элемент;
КонецЕсли;
Если Элемент.Заголовок = "Подразделение" Тогда
Подразделение = Элемент;
КонецЕсли;
КонецЦикла;
Если Заказ = Неопределено Или Подразделение = Неопределено Тогда
Возврат;
КонецЕсли;
Колонка2 = Заказ.Родитель.Родитель;
Колонка2.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Строка2_1 = ЭлементыФормы.Добавить("Строка2_1", Тип("ГруппаФормы"), Колонка2);
Строка2_1.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Строка2_1.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
Строка2_1.ГоризонтальноеПоложениеПодчиненных = ГоризонтальноеПоложениеЭлемента.Лево;
ЭлементыФормы.Переместить(Подразделение, Строка2_1);
КонецПроцедуры
Процедура ПослеЗаполненияПанелиБыстрыхНастроек(ЭтаФорма, ПараметрыЗаполнения) Экспорт
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСертификатыНоменклатуры") Тогда
Возврат;
КонецЕсли;
ПользовательскиеПоляКомпоновкиДанных = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки.ПользовательскиеПоля; // ПользовательскиеПоляКомпоновкиДанных
ПолеТипСертификата = ПользовательскиеПоляКомпоновкиДанных.Элементы[0];
ПолеКомпоновкиДанныхТипСертификата = ПолеТипСертификата.Варианты.Элементы[0].Отбор.Элементы[0].ЛевоеЗначение;
ПолеТипСертификата.Варианты.Элементы.Очистить();
МассивТиповСертификатов = Справочники.СертификатыНоменклатуры.СформироватьСписокВыбораТиповСертификатов();
Для Каждого ТипСертификата Из МассивТиповСертификатов Цикл
ВариантКомпановкиДанных = ПолеТипСертификата.Варианты.Элементы.Добавить();
ВариантКомпановкиДанных.Использование = Истина;
ВариантКомпановкиДанных.Значение = ТипСертификата;
ВариантКомпановкиДанных.Представление = ТипСертификата;
ЭлементОтбора = ВариантКомпановкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = ПолеКомпоновкиДанныхТипСертификата;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.ПравоеЗначение = ТипСертификата;
КонецЦикла;
КонецПроцедуры
Процедура ПередФормированиемОтчета(ФормаОтчета, ДополнительныеПараметры) Экспорт
Вариант = КомпоновщикНастроек.Настройки.ДополнительныеСвойства.КлючПредопределенногоВарианта;
Если Вариант <> "ПраваРолей"
И Вариант <> "ПраваРолиНаОбъектыМетаданных" Тогда
Возврат;
КонецЕсли;
Значения = ЗначенияВыбранногоПараметра("НеПредупреждатьОБольшомРазмереОтчета", Истина);
Если ТипЗнч(Значения) = Тип("СписокЗначений")
И Значения[0].Значение = Истина Тогда
Возврат;
КонецЕсли;
Результат = ПраваРолей(Истина, Вариант = "ПраваРолиНаОбъектыМетаданных", Истина);
КоличествоСтрок = Результат.Иерархия.Количество();
КоличествоКолонок = Результат.Роли.Количество();
КоличествоЯчеек = КоличествоСтрок * КоличествоКолонок;
Если КоличествоЯчеек < 1000000 Тогда
Возврат;
КонецЕсли;
ГигабайтДо = Окр(КоличествоЯчеек / 1500000 + КоличествоСтрок / 6000, 1) + 0.4;
ДополнительныеПараметры.ИмяПараметраХраненияОтказаОтПредупреждения =
"НеПредупреждатьОБольшомРазмереОтчета";
ДополнительныеПараметры.ТекстПредупреждения =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При текущих отборах отчет может быть очень большим
|до %1 строк и %2 столбцов (%3 ячеек).
|
|Может долго формироваться.
|Может не хватить памяти (нужно ~ до %4 Гб).
|
|Рекомендуется усилить отборы.';
|en = 'With the current filters, the report might be too large:
|up to %1 rows and %2 columns (%3 cells).
|
|Its generation might take a long time.
|It might require up to %4 GB.
|
|Consider narrowing down the filter.'"),
Формат(КоличествоСтрок, ""),
Формат(КоличествоКолонок, ""),
Формат(КоличествоЯчеек, ""),
Формат(ГигабайтДо, "ЧДЦ=1"));
КонецПроцедуры
Для облегчения когнитивного восприятия, редко используемые события выделены серым цветом
Открытие без автоматического формирования |
С параметром ФормироватьСразу = Истина |
---|---|
|
|
* ПриОпределенииПараметровВыбора - вызывается на каждый параметр и быструю пользовательскую настройку.
На быструю настройку может вызваться дважды, если она в доступных полях выбора элемента структуры - группировки, ведь отбор можно установить как на уровне отчета, так и отдельной группировки.
- ПередФормированиемОтчета
- ПередЗагрузкойНастроекВКомпоновщик
- ПослеЗагрузкиНастроекВКомпоновщик
- ПриОпределенииИспользуемыхТаблиц
- ПриКомпоновкеРезультата //собственное событие модуля отчета
- ПриОпределенииОсновныхПолей
- ПередЗаполнениемПанелиБыстрыхНастроек
- ПослеЗагрузкиНастроекВКомпоновщик
- *ПриОпределенииПараметровВыбора*
- ПослеЗаполненияПанелиБыстрыхНастроек
* ПриОпределенииПараметровВыбора - вызывается на каждый параметр и быструю пользовательскую настройку.
Открытие настроек:
- ПередЗаполнениемПанелиБыстрыхНастроек
- ПередЗагрузкойНастроекВКомпоновщик
- ПослеЗагрузкиНастроекВКомпоновщик
- *ПриОпределенииПараметровВыбора*
- ПослеЗаполненияПанелиБыстрыхНастроек
Закрыть и сформировать:
- ПередФормированиемОтчета
- ПередЗагрузкойНастроекВКомпоновщик
- ПослеЗагрузкиНастроекВКомпоновщик
- ПриОпределенииИспользуемыхТаблиц
- ПриКомпоновкеРезультата
- ПриОпределенииОсновныхПолей
- ПередЗаполнениемПанелиБыстрыхНастроек
- ПослеЗагрузкиНастроекВКомпоновщик
- *ПриОпределенииПараметровВыбора*
- ПослеЗаполненияПанелиБыстрыхНастроек
* ПриОпределенииПараметровВыбора - вызывается на каждый параметр и быструю пользовательскую настройку.
- ПередЗагрузкойВариантаНаСервере
- ПриЗагрузкеВариантаНаСервере
- ПриЗагрузкеПользовательскихНастроекНаСервере
- ПередЗаполнениемПанелиБыстрыхНастроек
- ПередЗагрузкойНастроекВКомпоновщик
- ПослеЗагрузкиНастроекВКомпоновщик
- ПослеЗаполненияПанелиБыстрыхНастроек
Функции общих модулей, используемых в отчетах.
Параметры
380. КомпоновкаДанныхКлиентСервер.ПолучитьПараметр
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек;
ПараметрДата = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "ДатаОтчета");
ПараметрДата.Использование = Истина;
КонецПроцедуры
213. КомпоновкаДанныхКлиентСервер.УстановитьПараметр
КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек;
НедоступенДляПользователя = Истина;
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(
КомпоновщикНастроек,
"ВалютаРеглУчета",
ВалютаРубль,
НедоступенДляПользователя
);
40. КомпоновкаДанныхСервер.УдалитьПараметрИзПользовательскихНастроекОтчета()
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВидовЦен") Тогда
КомпоновкаДанныхСервер.УдалитьПараметрИзПользовательскихНастроекОтчета(КомпоновщикНастроекФормы, "ВидЦены");
КонецЕсли;
4. КомпоновкаДанныхКлиентСервер.ДобавитьПараметрыВПользовательскиеНастройки
Процедура ПередЗагрузкойНастроекВКомпоновщик(Форма, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
КомпоновщикНастроекФормы = Форма.Отчет.КомпоновщикНастроек;
Параметры = Форма.Параметры;
Если Параметры.Свойство("ПользовательскиеПараметры") Тогда
КомпоновкаДанныхКлиентСервер.ДобавитьПараметрыВПользовательскиеНастройки(КомпоновщикНастроекФормы, Параметры.ПользовательскиеПараметры);
НовыеПользовательскиеНастройкиКД = КомпоновщикНастроекФормы.ПользовательскиеНастройки;
КонецЕсли;
КонецПроцедуры
Подключение схемы
91. ОтчетыСервер.ПодключитьСхему()
Процедура ПередЗагрузкойНастроекВКомпоновщик(Форма, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
СхемаИзменена = НастроитьСхемуКомпоновкиДанных();
Если СхемаИзменена Тогда
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Форма, СхемаКомпоновкиДанных, КлючСхемы);
КонецЕсли;
КонецПроцедуры
Отборы
64. КомпоновкаДанныхСервер.УдалитьЭлементОтбораИзВсехНастроекОтчета()
КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек;
Если ПолучитьФункциональнуюОпцию("ИспользоватьПартнеровКакКонтрагентов") Тогда
КомпоновкаДанныхСервер.УдалитьЭлементОтбораИзВсехНастроекОтчета(КомпоновщикНастроек, "Контрагент");
КонецЕсли;
46. ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора
Процедура ПередЗагрузкойНастроекВКомпоновщик(Форма, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
Реквизиты = ПолучитьРеквизитыКонтекстаЗапуска(Форма);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
НовыеНастройкиКД.Отбор,
"Организация",
Реквизиты.Организация,
ВидСравненияКомпоновкиДанных.Равно,,
Истина);
КонецПроцедуры
6. ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора
ОтборыПоПодразделению = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(Настройки.Отбор, "Подразделение");
Для Каждого ЭлементОтбора Из ОтборыПоПодразделению Цикл
Если ЭлементОтбора.Использование Тогда
ПараметрВыводитьПодразделения.Значение = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Заголовки полей
27. КомпоновкаДанныхСервер.УстановитьЗаголовкиВыбранныхПолей()
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
ЗаголовкиПолей = Новый Структура;
ЗаголовкиПолей.Вставить("Номенклатура", "Товар");
КомпоновкаДанныхСервер.УстановитьЗаголовкиВыбранныхПолей(НовыеНастройкиКД.Выбор.Элементы, ЗаголовкиПолей);
КонецПроцедуры
11. КомпоновкаДанныхСервер.УстановитьЗаголовкиПолейГруппировки
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
ЗаголовкиПолей = Новый Структура;
ЗаголовкиПолей.Вставить("Номенклатура", "Товар");
КомпоновкаДанныхСервер.УстановитьЗаголовкиВыбранныхПолей(НовыеНастройкиКД.Выбор.Элементы, ЗаголовкиПолей);
КомпоновкаДанныхСервер.УстановитьЗаголовкиПолейГруппировки(НовыеНастройкиКД.Структура, ЗаголовкиПолей);
КонецПроцедуры
* Общий модуль КомпоновкаДанныхКлиентСервер не входит в БСП, но есть в современных типовых конфигурациях.
В коде типовой конфигурации полно кода, где в цикле делается поиск по настройкам компоновщика, а в нем вложенный цикл поиска пользовательской настройки. Не делайте так, и чаще используйте функции общих модулей для работы с параметрами и отборами.
Итоги
-
Настройка отбора: Большинство модулей устанавливают отборы для отчета, используя Форма.ФормаПараметры.Отбор.
Часто этот отбор определяется по контексту запуска через проверку имени команды. -
Использование ключей вариантов: Часто устанавливается КлючВарианта или КлючНазначенияИспользования. КлючВарианта сообщает СКД вариант отчета, который будет загружен. А КлючНазначенияИспользования влияет на набор автоматически сохраняемых пользовательских настроек (быстрые отборы в шапке, сохраняемые реквизиты формы, настройки Еще-Изменить форму).
-
Обработка расшифровки: При этом могут как изменяться настройки, так и открываться другой отчет.
-
Добавление дополнительных подключаемых команд на форму
-
Запрет пользователю выбирать вариант отчета
-
Изменение настроек в зависимости от функциональных опций
-
Изменение схемы компоновки
Возможна ситуация, что нужно программно изменить запрос схемы типового отчета, добавить новое поле выбора. Если это сделать как это делается в большинстве сценариев в ПередЗагрузкойНастроекВКомпоновщик, то вызываемая раньше ПриЗагрузкеВариантаНаСервере не увидит этого поля, и поле слетит из настроек в пользовательских вариантах, использующих его.
- Часто используется настройка или удаление параметров и отборов по функциональным опциям
- Если изменение настроек велось не в НовыеНастройкиКД, а в Отчет.КомпоновщикНастроек, то в конце присваивают НовыеНастройкиКД = Отчет.КомпоновщикНастроек;
Чаще всего производится обработка расшифровки
Настройка в зависимости от значения полученных пользовательских настроек или удаление каких-то пользовательских настроек по функциональным опциям
Можно использовать дли изменения ПредставлениеПользовательскойНастройки элементов отбора
-
Настройка схемы компоновки данных:
-
Включает в себя установку параметров, отборов, группировок, изменение заголовков, установку доступных
-
значений для элементов выбора и т.д.
- После изменения настроек производится подключение схемы с помощью ОтчетыСервер.ПодключитьСхему()
-
Использование ЗарплатаКадрыОтчеты.ПодключитьСхему:
-
В модулях, связанных с подсистемой "Зарплата и Кадры", используется функция ЗарплатаКадрыОтчеты.ПодключитьСхему, которая заменяет ОтчетыСервер.ПодключитьСхему.
-
-
Использование БухгалтерскиеОтчетыВызовСервера.ПередЗагрузкойНастроекВКомпоновщик:
-
В модулях, связанных с подсистемой "Бухгалтерские отчеты", используется БухгалтерскиеОтчетыВызовСервера.ПередЗагрузкойНастроекВКомпоновщик, которая может также включать в себя подключение схемы.
-
-
Использование КомпоновкаДанныхКлиентСервер.ДобавитьПараметрыВПользовательскиеНастройки:
-
В некоторых случаях модули добавляют параметры в пользовательские настройки с помощью функции КомпоновкаДанныхКлиентСервер.ДобавитьПараметрыВПользовательскиеНастройки.
-
В этих случаях подключение схемы компоновки данных может быть не требуется, так как изменения в пользовательских настройках не влияют на базовую схему отчета.
-
-
Настройки меняются через НовыеНастройкиКД или НовыеПользовательскиеНастройкиКД:
Данные настройки являются входными параметрами данного события, как правило там меняются заголовки полей, параметры выбора или устанавливаются списки доступных значений.
Почти не используется, но скорее всего это связано с тем, что это относительно новое событие в БСП, а большое количество кода написанное для устаревшего события ПриОпределенииПараметровВыбора разработчики переносить не стали.
Позволяет настроить список выбора значений параметра или отбора.
Вызывается в цикле для каждого параметра, элемента отбора. Если они присутствуют и в группировках структуры, то вызываются дважды, ведь на уровне группировки значение отбора может отличаться.
Используется для изменения внешнего вида элементов панели быстрых настроек. Например в других событиях были добавлены быстрые пользовательские отборы и панель быстрых настроек стала выглядеть не очень. Перемещение элементов, изменение заголовков, перегруппировка.
Используется для определения таблиц - объектов метаданных, которые нужно проверять, были ли обновлены в текущем сеансе. Если не были - выводится сообщение пользователю, что отчет может содержать некорректные данные.
Позволяет задать список часто используемых полей, которые будут выводиться в подменю для команд контекстного меню "Вставить поле слева", "Вставить группировку ниже" и т.п.
Не используется ни разу.
Можно отказаться от вывода отчета, если получился слишком большим и предложить пользователю настроить отборы
Пусть вас не смущает большое количество событий - в большинстве отчетов используется одно-два события |
Бонус
Шаблон модуля объекта отчета со всеми событиями и описаниями процедур. Удалить ненужные проще, чем искать и добавлять.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОбработчикиСобытий
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Настройки общей формы отчета подсистемы "Варианты отчетов".
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// КлючВарианта - Строка - Имя предопределенного варианта отчета или уникальный идентификатор пользовательского.
// Настройки - См. ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
Настройки.События.ПослеЗагрузкиНастроекВКомпоновщик = Истина;
Настройки.События.ПередЗагрузкойВариантаНаСервере = Истина;
Настройки.События.ПриЗагрузкеВариантаНаСервере = Истина;
Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;
Настройки.События.ПередЗаполнениемПанелиБыстрыхНастроек = Истина;
Настройки.События.ПослеЗаполненияПанелиБыстрыхНастроек = Истина;
Настройки.События.ПриОпределенииПараметровВыбора = Истина;
Настройки.События.ПриОпределенииИспользуемыхТаблиц = Истина;
Настройки.События.ПриОпределенииОсновныхПолей = Истина;
Настройки.События.ПередФормированиемОтчета = Истина;
КонецПроцедуры
// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// Отказ - Булево - Признак отказа от создания формы.
// См. описание одноименного параметра "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике.
// СтандартнаяОбработка - Булево - Признак выполнения стандартной (системной) обработки события.
// См. описание одноименного параметра "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике.
//
// См. также:
// Процедура для вывода добавленных команд в форму: ОтчетыСервер.ВывестиКоманду().
// Глобальный обработчик этого события: ОтчетыПереопределяемый.ПриСозданииНаСервере().
//
// Пример добавления команды:
// Команда = Форма.Команды.Добавить("<ИмяКоманды>");
// Команда.Действие = "Подключаемый_Команда";
// Команда.Заголовок = НСтр("ru = '<Представление команды...>'");
// ОтчетыСервер.ВывестиКоманду(Форма, Команда, "<ВидГруппы>");
// Обработчик команды пишется в процедуре ОтчетыКлиентПереопределяемый.ОбработчикКоманды.
//
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
КонецПроцедуры
// Вызывается в форме отчета перед выводом настройки.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// СвойстваНастройки - Структура - Описание настройки отчета, которая будет выведена в форме отчета:
// * ОписаниеТипов - ОписаниеТипов -
// Тип настройки.
// * ЗначенияДляВыбора - СписокЗначений -
// Объекты, которые будут предложены пользователю в списке выбора.
// Дополняет список объектов, уже выбранных пользователем ранее.
// * ЗапросЗначенийВыбора - Запрос -
// Возвращает объекты, которыми необходимо дополнить ЗначенияДляВыбора.
// Первой колонкой (с 0м индексом) должен выбираться объект,
// который следует добавить в ЗначенияДляВыбора.Значение.
// Для отключения автозаполнения
// в свойство ЗапросЗначенийВыбора.Текст следует записать пустую строку.
// * ОграничиватьВыборУказаннымиЗначениями - Булево -
// Когда Истина, то выбор пользователя будет ограничен значениями,
// указанными в ЗначенияДляВыбора (его конечным состоянием).
//
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
КонецПроцедуры
// Вызывается перед загрузкой новых настроек.
//
// Используется для изменения схемы компоновки.
// Например, если схема отчета зависит от ключа варианта или параметров отчета.
// Чтобы изменения схемы вступили в силу следует вызывать метод ОтчетыСервер.ПодключитьСхему().
// В ДополнительныеСвойства параметра НовыеНастройкиКД и свойство Настройки компоновщика настроек
// объекта включены свойства КлючВарианта, КлючПредопределенногоВарианта, КонтекстВарианта
// и ФормаПараметрыОтбор.
//
// Параметры:
// Контекст - Произвольный -
// Параметры контекста, в котором используется отчет.
// Используется для передачи в параметрах метода ОтчетыСервер.ПодключитьСхему().
// КлючСхемы - Строка -
// Идентификатор текущей схемы компоновщика настроек.
// По умолчанию не заполнен (это означает что компоновщик инициализирован на основании основной схемы).
// Используется для оптимизации, чтобы переинициализировать компоновщик как можно реже.
// Может не использоваться если переинициализация выполняется безусловно.
// КлючВарианта - Строка, Неопределено -
// Имя предопределенного или уникальный идентификатор пользовательского варианта отчета.
// Неопределено когда вызов для варианта расшифровки или без контекста.
// НовыеНастройкиКД - НастройкиКомпоновкиДанных, Неопределено -
// Настройки варианта отчета, которые будут загружены в компоновщик настроек после его инициализации.
// Неопределено когда настройки варианта не надо загружать (уже загружены ранее).
// НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных, Неопределено -
// Пользовательские настройки, которые будут загружены в компоновщик настроек после его инициализации.
// Неопределено когда пользовательские настройки не надо загружать (уже загружены ранее).
//
// Примеры:
// 1. Компоновщик отчета инициализируется на основании схемы из общих макетов:
// Если КлючСхемы <> "1" Тогда
// КлючСхемы = "1";
// СхемаКД = ПолучитьОбщийМакет("МояОбщаяСхемаКомпоновки");
// ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКД, КлючСхемы);
// КонецЕсли;
//
// 2. Схема зависит от значения параметра, выведенного в пользовательские настройки отчета:
// Если ТипЗнч(НовыеПользовательскиеНастройкиКД) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
// ПолноеИмяОбъектаМетаданных = "";
// Для Каждого ЭлементКД Из НовыеПользовательскиеНастройкиКД.Элементы Цикл
// Если ТипЗнч(ЭлементКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
// ИмяПараметра = Строка(ЭлементКД.Параметр);
// Если ИмяПараметра = "ОбъектМетаданных" Тогда
// ПолноеИмяОбъектаМетаданных = ЭлементКД.Значение;
// КонецЕсли;
// КонецЕсли;
// КонецЦикла;
// Если КлючСхемы <> ПолноеИмяОбъектаМетаданных Тогда
// КлючСхемы = ПолноеИмяОбъектаМетаданных;
// СхемаКД = Новый СхемаКомпоновкиДанных;
// // Наполнение схемы...
// ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКД, КлючСхемы);
// КонецЕсли;
// КонецЕсли;
//
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
КонецПроцедуры
// Параметры:
// ДополнительныеПараметры - Структура
//
Процедура ПослеЗагрузкиНастроекВКомпоновщик(ДополнительныеПараметры) Экспорт
КонецПроцедуры
// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек.
//
// См. также:
// "Расширение управляемой формы для отчета.ПриЗагрузкеВариантаНаСервере" в синтакс-помощнике.
//
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
КонецПроцедуры
// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек.
//
// См. синтакс - помощник "Расширение управляемой формы для отчета.ПриЗагрузкеВариантаНаСервере" в синтакс - помощнике.
//
Процедура ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
КонецПроцедуры
// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных -
// Пользовательские настройки для загрузки в компоновщик настроек.
//
// См. также:
// "Расширение управляемой формы для отчета.ПриЗагрузкеПользовательскихНастроекНаСервере"
// в синтакс-помощнике.
//
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
КонецПроцедуры
// Вызывается до перезаполнения панели настроек формы отчета.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// ПараметрыЗаполнения - Структура - Параметры, которые будут загружены в отчет:
// * ОтчетОбъектИлиПолноеИмя - ОтчетОбъект - отчет.
//
Процедура ПередЗаполнениемПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
КонецПроцедуры
// Вызывается в одноименном обработчике формы отчета после выполнения кода формы.
//
// Подробнее в ОтчетыПереопределяемый.ПослеЗаполненияПанелиБыстрыхНастроек
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения -
// ПараметрыЗаполнения - Структура -
Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
КонецПроцедуры
// Вызывается в форме отчета перед выводом настройки.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма отчета.
// СвойстваНастройки - Структура - Описание настройки отчета, которая будет выведена в форме отчета:
// * ОписаниеТипов - ОписаниеТипов -
// Тип настройки.
// * ЗначенияДляВыбора - СписокЗначений -
// Объекты, которые будут предложены пользователю в списке выбора.
// Дополняет список объектов, уже выбранных пользователем ранее.
// * ЗапросЗначенийВыбора - Запрос -
// Возвращает объекты, которыми необходимо дополнить ЗначенияДляВыбора.
// Первой колонкой (с 0м индексом) должен выбираться объект,
// который следует добавить в ЗначенияДляВыбора.Значение.
// Для отключения автозаполнения
// в свойство ЗапросЗначенийВыбора.Текст следует записать пустую строку.
// * ОграничиватьВыборУказаннымиЗначениями - Булево -
// Когда Истина, то выбор пользователя будет ограничен значениями,
// указанными в ЗначенияДляВыбора (его конечным состоянием).
//
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки)
КонецПроцедуры
// Параметры:
// КлючВарианта - Строка
// - Неопределено
// ИспользуемыеТаблицы - Массив из Строка
//
Процедура ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт
КонецПроцедуры
// Позволяет задать список часто используемых полей, которые будут выводиться в подменю для команд контекстного меню
// "Вставить поле слева", "Вставить группировку ниже" и т.п.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма отчета.
// ОсновныеПоля - Массив из Строка - имена часто используемых полей отчета.
//
Процедура ПриОпределенииОсновныхПолей(Форма, ОсновныеПоля) Экспорт
КонецПроцедуры
// Параметры:
// ФормаОтчета - ФормаКлиентскогоПриложения
// ДополнительныеПараметры - Структура:
// * ТекстПредупреждения - Строка
// * ИмяПараметраХраненияОтказаОтПредупреждения - Строка
//
Процедура ПередФормированиемОтчета(ФормаОтчета, ДополнительныеПараметры) Экспорт
КонецПроцедуры
#КонецОбласти
#КонецЕсли
Заметки:
В публикациях на Инфостарте встречаются рекомендации скопировать общую форму ФормаОтчета в свой отчет и производить изменения. Это может оказаться быстрым вариантом, но не правильным.
ПриКомпоновкеРезультата
В отчетах также очень часто используется событие ПриКомпоновкеРезультата. Оно не является специфическим для общей формы отчета и поэтому статистический анализ не проводился. Хорошая статья на эту тему Процедура ПриКомпоновкеРезультата
При анализе использовались:
- Конфигурация ERP 2.5 на БСП 3.1.9
- Visual Studio Code для быстрого поиска по выгруженной конфигурации
- Искусственный интеллект в виде Google Gemini 1.5 Pro
- Notepad++ и регулярные выражения