При работе с конфигурацией "Бухгалтерия предприятия КОРП" в 1С:Предприятии 8.3, пользователи часто сталкиваются с ситуацией, когда отчеты, особенно из группы "Задолженность", начинают автоматически формироваться сразу же после открытия их формы. Это приводит к двум основным проблемам: во-первых, пользователям приходится ждать завершения формирования, прежде чем они смогут задать необходимые настройки или отборы, что значительно снижает продуктивность. Во-вторых, возникает излишняя нагрузка на сервер, поскольку отчеты часто формируются дважды: сначала автоматически при открытии, а затем повторно после того, как пользователь применит свои настройки. В этом материале мы подробно рассмотрим различные подходы к решению этой проблемы, проанализируем их плюсы и минусы, и выберем наиболее эффективные.
Начнем с анализа сути проблемы. Почему отчеты формируются автоматически? Чаще всего эта логика заложена непосредственно в модуле формы отчета, например, в процедуре ПриОткрытии, или запускается с помощью обработчиков ожидания. Задача состоит в том, чтобы перехватить или отменить этот автоматический запуск. Однако основная сложность заключается в отсутствии единого, универсального механизма в Библиотеке стандартных подсистем (БСП) или конфигурации "Бухгалтерия предприятия КОРП", который бы позволял глобально отключить это поведение для всех отчетов сразу, особенно для тех, которые имеют собственные, отличные от стандартной БСП, формы.
Один из наиболее прямых и эффективных способов решения проблемы для конкретных, "тяжелых" отчетов — это модификация их форм с помощью расширения. Этот метод позволяет точечно вмешаться в логику работы каждого отчета, который вызывает проблемы.
Мы знаем, что автоматическое формирование часто запускается в процедуре ПриОткрытии формы отчета. Обычно это делается с помощью функции ПодключитьОбработчикОжидания, которая планирует запуск процедуры формирования отчета через небольшой интервал времени. Чтобы отключить это, нам потребуется создать расширение и внести изменения в модуль формы отчета.
ПриОткрытии.
// Пример оригинального кода в процедуре ПриОткрытии:
// Если Параметры.СформироватьПриОткрытии И Не Параметры.ОткрытКакДополнительныйОтчет Тогда
// Если Не ЗначениеЗаполнено(ЭтотОбъект.Отчет.РежимРасшифровки) Тогда
// ПодключитьОбработчикОжидания("Подключаемый_СформироватьПриОткрытии", БухгалтерскиеОтчетыКлиент.ИнтервалЗапускаФормированияОтчетаПриОткрытии, Истина);
// КонецЕсли;
// КонецЕсли;
// Измененный код в расширении (закомментированная ветка):
// Если Параметры.СформироватьПриОткрытии И Не Параметры.ОткрытКакДополнительныйОтчет Тогда
// Если Не ЗначениеЗаполнено(ЭтотОбъект.Отчет.РежимРасшифровки) Тогда
// // ПодключитьОбработчикОжидания("Подключаемый_СформироватьПриОткрытии", БухгалтерскиеОтчетыКлиент.ИнтервалЗапускаФормированияОтчетаПриОткрытии, Истина); // Закомментировали
// КонецЕсли;
// КонецЕсли;
Обратите внимание, что конкретный код может немного отличаться в разных отчетах, но принцип остается тем же: мы ищем вызов ПодключитьОбработчикОжидания, который инициирует формирование отчета при открытии, и отключаем его.
Даже если мы отключили автоматическое формирование, в некоторых отчетах может продолжать отображаться анимация "Формирование отчета...". Это сбивает с толку пользователя и создает впечатление, что отчет все еще формируется. Эту анимацию также можно отключить через расширение.
ПриЗагрузкеПользовательскихНастроекНаСервере.
// Пример оригинального кода в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере:
// ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "ФормированиеОтчета");
// Измененный код в расширении:
// ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "ФормированиеОтчета"); // Закомментировали
Плюсы:
Минусы:
Как мы видим из обсуждения, этот вариант был принят автором для самых "тяжелых" отчетов, что подтверждает его практическую ценность.
Платформа 1С:Предприятие предусматривает стандартный параметр для форм отчетов — СформироватьПриОткрытии. Если передать этот параметр со значением Ложь при открытии формы отчета, автоматическое формирование не должно происходить.
Пример программного открытия формы отчета с этим параметром:
ПараметрыОтчета = Новый Структура();
ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Ложь);
// Если нужно передать дополнительные условия отбора:
// УсловияОтбора = Новый Структура("Товар", Элементы.Список.ТекущаяСтрока);
// ПараметрыОтчета.Вставить("Отбор", УсловияОтбора);
ОткрытьФорму("Отчет.ЦеныТоваров.ФормаОтчета", ПараметрыОтчета);
Ключевой вопрос, который возник в обсуждении, заключается в том, как передать этот параметр для отчетов, которые открываются не программно из другого модуля или формы, а непосредственно из меню интерфейса пользователя. В этом случае у нас нет прямого контроля над вызовом ОткрытьФорму и, следовательно, над передачей параметров.
Мы проанализировали несколько идей и проверили их на практике:
ОбщийМодуль.ВариантыОтчетовКлиент.Процедура ОткрытьФормуОтчета. Однако замеры производительности и трассировка показали, что отчеты группы "Задолженность" и многие другие, имеющие свои формы, не используют этот модуль для непосредственного открытия. Таким образом, эта точка входа не является универсальной.Общие формы/ФормаОтчета, например, в процедуру ПриСозданииНаСервере:
// В Общие формы/ФормаОтчета/ ПриСозданииНаСервере - После
// Параметры.СформироватьПриОткрытии = Ложь;
// Элементы.ФормироватьСразу.Пометка = Ложь;
// НастройкиОтчета.ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек = Ложь;
Этот подход мог бы работать для отчетов, которые действительно используют эту общую форму. Однако, как было отмечено, многие отчеты (включая "Задолженность") имеют свои собственные формы. Если отчет не использует общую форму, изменения в ней не будут иметь никакого эффекта.
БыстрыеНастройкиОтчетовСервер.ПриСозданииНаСервере. Однако, как показали замеры, при открытии проблемных отчетов из интерфейса, код этих модулей также не выполнялся.Таким образом, хотя параметр СформироватьПриОткрытии является мощным инструментом, его применение для отчетов, открываемых из интерфейса, затруднено из-за отсутствия универсальной точки перехвата вызова формы.
Мы также рассмотрим несколько менее прямых, но потенциально более универсальных подходов, связанных с логикой БСП, которые обсуждались или могли бы быть рассмотрены.
В некоторых отчетах логика автоматического формирования может быть связана со свойством Отчет.РежимРасшифровки. Было предложено в модуле БухгалтерскиеОтчетыПереопределяемый, в процедуре ПриСозданииНаСервере, установить значение Форма.Отчет.РежимРасшифровки = Истина;.
// В ОМ.БухгалтерскиеОтчетыПереопределяемый, в процедуру ПриСозданииНаСервере
Форма.Отчет.РежимРасшифровки = Истина;
Плюсы: теоретически, если отчет использует эту проверку, он может не запуститься.
Минусы:
Отчет.РежимРасшифровки для принятия решения о формировании.Отчет.РежимРасшифровки И ПравоДоступаКДаннымБухгалтерии. В этом случае просто установка РежимРасшифровки = Истина не гарантирует отключения формирования.Этот метод не является надежным и универсальным.
Еще один вариант, который был предложен в обсуждении, заключался в изменении возвращаемого значения функции БухгалтерскиеОтчетыКлиент.ИнтервалЗапускаФормированияОтчетаПриОткрытии на очень большое значение. Это фактически отложит формирование отчета на неопределенно долгий срок.
Плюсы: теоретически, это могло бы повлиять на все отчеты, использующие этот интервал.
Минусы:
Этот подход также признан нежелательным из-за его побочных эффектов.
В стандартных формах отчетов БСП (для отчетов, которые их используют) существует пользовательская настройка "Формировать сразу". Она находится в меню "Еще" (или "Настройки") формы отчета. Если снять этот флажок, отчет не будет формироваться автоматически. Однако это является ручным действием пользователя и не может быть применено программно или глобально для всех отчетов.
Данная опция полезна для конечного пользователя, который может настроить поведение конкретного отчета для себя, но не является системным решением для отключения автоформирования для всех пользователей по умолчанию.
Проанализировав все предложенные варианты и проверив их на практике, мы можем сделать следующие выводы:
ПриОткрытии и ПриЗагрузкеПользовательскихНастроекНаСервере форм отчетов через расширения. Это позволяет точно отключить запуск формирования и анимации, не затрагивая другие части системы.СформироватьПриОткрытии: Этот параметр очень полезен, когда мы открываем формы отчетов программно из другого кода. Однако для отчетов, запускаемых из пользовательского интерфейса, требуется найти универсальную точку перехвата вызова формы, чего пока не удалось достичь без изменения типового кода или сложного анализа БСП.Отчет.РежимРасшифровки, изменение интервала запуска или воздействие на общие формы БСП оказались либо неуниверсальными, либо имели нежелательные побочные эффекты.В итоге, наиболее прагматичным решением для большинства ситуаций является применение точечных расширений для конкретных, проблемных отчетов. Это обеспечивает баланс между достижением цели и минимальным риском нарушения стандартного функционала системы. Если ваша задача требует полного и универсального решения, то это потребует глубочайшего анализа всей архитектуры БСП и, возможно, вмешательства в типовой код, что не рекомендуется из-за сложностей с обновлениями.