Как отключить автоматическое формирование отчетов при открытии их формы в 1С:Бухгалтерии предприятия КОРП?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При работе с конфигурацией "Бухгалтерия предприятия КОРП" в 1С:Предприятии 8.3, пользователи часто сталкиваются с ситуацией, когда отчеты, особенно из группы "Задолженность", начинают автоматически формироваться сразу же после открытия их формы. Это приводит к двум основным проблемам: во-первых, пользователям приходится ждать завершения формирования, прежде чем они смогут задать необходимые настройки или отборы, что значительно снижает продуктивность. Во-вторых, возникает излишняя нагрузка на сервер, поскольку отчеты часто формируются дважды: сначала автоматически при открытии, а затем повторно после того, как пользователь применит свои настройки. В этом материале мы подробно рассмотрим различные подходы к решению этой проблемы, проанализируем их плюсы и минусы, и выберем наиболее эффективные.

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

Подход 1: Точечная модификация формы отчета через расширение

Один из наиболее прямых и эффективных способов решения проблемы для конкретных, "тяжелых" отчетов — это модификация их форм с помощью расширения. Этот метод позволяет точечно вмешаться в логику работы каждого отчета, который вызывает проблемы.

Шаг 1: Отключение автоматического формирования в процедуре ПриОткрытии

Мы знаем, что автоматическое формирование часто запускается в процедуре ПриОткрытии формы отчета. Обычно это делается с помощью функции ПодключитьОбработчикОжидания, которая планирует запуск процедуры формирования отчета через небольшой интервал времени. Чтобы отключить это, нам потребуется создать расширение и внести изменения в модуль формы отчета.

  1. Создадим новое расширение или используем существующее.
  2. Добавим в расширение форму того отчета, который мы хотим модифицировать. Для этого в конфигураторе найдем нужный отчет, вызовем контекстное меню на его форме (например, "ФормаОтчета") и выберем "Добавить в расширение".
  3. В модуле формы отчета в расширении найдем процедуру ПриОткрытии.
  4. В этой процедуре нам нужно найти и закомментировать или изменить строку, отвечающую за подключение обработчика ожидания формирования отчета. Типичный код может выглядеть следующим образом:

// Пример оригинального кода в процедуре ПриОткрытии:
// Если Параметры.СформироватьПриОткрытии И Не Параметры.ОткрытКакДополнительныйОтчет Тогда
//     Если Не ЗначениеЗаполнено(ЭтотОбъект.Отчет.РежимРасшифровки) Тогда
//         ПодключитьОбработчикОжидания("Подключаемый_СформироватьПриОткрытии", БухгалтерскиеОтчетыКлиент.ИнтервалЗапускаФормированияОтчетаПриОткрытии, Истина);
//     КонецЕсли;
// КонецЕсли;

// Измененный код в расширении (закомментированная ветка):
// Если Параметры.СформироватьПриОткрытии И Не Параметры.ОткрытКакДополнительныйОтчет Тогда
//     Если Не ЗначениеЗаполнено(ЭтотОбъект.Отчет.РежимРасшифровки) Тогда
//         // ПодключитьОбработчикОжидания("Подключаемый_СформироватьПриОткрытии", БухгалтерскиеОтчетыКлиент.ИнтервалЗапускаФормированияОтчетаПриОткрытии, Истина); // Закомментировали
//     КонецЕсли;
// КонецЕсли;

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

Шаг 2: Отключение анимации формирования отчета

Даже если мы отключили автоматическое формирование, в некоторых отчетах может продолжать отображаться анимация "Формирование отчета...". Это сбивает с толку пользователя и создает впечатление, что отчет все еще формируется. Эту анимацию также можно отключить через расширение.

  1. В том же расширении и той же форме отчета найдите или создайте обработчик события ПриЗагрузкеПользовательскихНастроекНаСервере.
  2. В этом обработчике закомментируйте или удалите строку, которая устанавливает состояние поля табличного документа для отображения анимации. Типичный код:

// Пример оригинального кода в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере:
// ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "ФормированиеОтчета");

// Измененный код в расширении:
// ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "ФормированиеОтчета"); // Закомментировали

Плюсы и минусы подхода

Плюсы:

  1. Высокая точность: Мы контролируем поведение конкретного отчета.
  2. Эффективность: Проблема решается непосредственно там, где она возникает.
  3. Безопасность: Изменения вносятся через расширение, что позволяет сохранить типовую конфигурацию неизменной и легко обновлять ее.

Минусы:

  1. Неуниверсальность: Необходимо выполнять эти действия для каждой формы отчета, где требуется отключить автоформирование. Если отчет использует общую форму БСП, то это может быть проще (см. далее), но если у каждого отчета своя форма, работа становится рутинной.
  2. Трудозатраты: Для большого количества отчетов этот подход может быть трудоемким.

Как мы видим из обсуждения, этот вариант был принят автором для самых "тяжелых" отчетов, что подтверждает его практическую ценность.

Подход 2: Использование параметра "СформироватьПриОткрытии"

Платформа 1С:Предприятие предусматривает стандартный параметр для форм отчетов — СформироватьПриОткрытии. Если передать этот параметр со значением Ложь при открытии формы отчета, автоматическое формирование не должно происходить.

Пример программного открытия формы отчета с этим параметром:


ПараметрыОтчета = Новый Структура();
ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Ложь);

// Если нужно передать дополнительные условия отбора:
// УсловияОтбора = Новый Структура("Товар", Элементы.Список.ТекущаяСтрока);
// ПараметрыОтчета.Вставить("Отбор", УсловияОтбора);

ОткрытьФорму("Отчет.ЦеныТоваров.ФормаОтчета", ПараметрыОтчета);

Основная проблема: как передать параметр для отчетов, открываемых из интерфейса?

Ключевой вопрос, который возник в обсуждении, заключается в том, как передать этот параметр для отчетов, которые открываются не программно из другого модуля или формы, а непосредственно из меню интерфейса пользователя. В этом случае у нас нет прямого контроля над вызовом ОткрытьФорму и, следовательно, над передачей параметров.

Мы проанализировали несколько идей и проверили их на практике:

  1. Поиск точки входа в общих модулях БСП: Была предложена гипотеза о том, что существует общая точка входа, например, в модуле ОбщийМодуль.ВариантыОтчетовКлиент.Процедура ОткрытьФормуОтчета. Однако замеры производительности и трассировка показали, что отчеты группы "Задолженность" и многие другие, имеющие свои формы, не используют этот модуль для непосредственного открытия. Таким образом, эта точка входа не является универсальной.
  2. Модификация общих форм: Предлагалось внести изменения в общие формы, такие как Общие формы/ФормаОтчета, например, в процедуру ПриСозданииНаСервере:

// В Общие формы/ФормаОтчета/ ПриСозданииНаСервере - После
// Параметры.СформироватьПриОткрытии = Ложь;
// Элементы.ФормироватьСразу.Пометка = Ложь;
// НастройкиОтчета.ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек = Ложь;

Этот подход мог бы работать для отчетов, которые действительно используют эту общую форму. Однако, как было отмечено, многие отчеты (включая "Задолженность") имеют свои собственные формы. Если отчет не использует общую форму, изменения в ней не будут иметь никакого эффекта.

  1. Другие общие модули: Рассматривались модули типа БыстрыеНастройкиОтчетовСервер.ПриСозданииНаСервере. Однако, как показали замеры, при открытии проблемных отчетов из интерфейса, код этих модулей также не выполнялся.

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

Подход 3: Попытки общего решения через логику БСП (с ограничениями)

Мы также рассмотрим несколько менее прямых, но потенциально более универсальных подходов, связанных с логикой БСП, которые обсуждались или могли бы быть рассмотрены.

Вариант 1: Использование свойства Отчет.РежимРасшифровки

В некоторых отчетах логика автоматического формирования может быть связана со свойством Отчет.РежимРасшифровки. Было предложено в модуле БухгалтерскиеОтчетыПереопределяемый, в процедуре ПриСозданииНаСервере, установить значение Форма.Отчет.РежимРасшифровки = Истина;.


// В ОМ.БухгалтерскиеОтчетыПереопределяемый, в процедуру ПриСозданииНаСервере
Форма.Отчет.РежимРасшифровки = Истина;

Плюсы: теоретически, если отчет использует эту проверку, он может не запуститься.

Минусы:

  1. Неуниверсальность: Не в каждом отчете есть ветка кода, которая проверяет Отчет.РежимРасшифровки для принятия решения о формировании.
  2. Дополнительные условия: В некоторых отчетах условие может быть более сложным, например: Отчет.РежимРасшифровки И ПравоДоступаКДаннымБухгалтерии. В этом случае просто установка РежимРасшифровки = Истина не гарантирует отключения формирования.
  3. Анимация: Даже если отчет не сформируется, анимация "Формирование отчета" все равно может запускаться, требуя отдельного отключения.

Этот метод не является надежным и универсальным.

Вариант 2: Изменение интервала запуска формирования

Еще один вариант, который был предложен в обсуждении, заключался в изменении возвращаемого значения функции БухгалтерскиеОтчетыКлиент.ИнтервалЗапускаФормированияОтчетаПриОткрытии на очень большое значение. Это фактически отложит формирование отчета на неопределенно долгий срок.

Плюсы: теоретически, это могло бы повлиять на все отчеты, использующие этот интервал.

Минусы:

  1. Неуниверсальность: Этот же параметр используется для определения интервала формирования отчетов при их вызове из форм справочников или других объектов. В таких случаях автоматическое формирование при открытии может быть желательным по логике работы программы. Изменив его глобально, мы рискуем нарушить функционал в тех местах, где автоформирование необходимо.
  2. Косвенность: Это "обходной" путь, который не отменяет запуск самого обработчика ожидания, а лишь делает его выполнение крайне отложенным, что может привести к непредсказуемому поведению.

Этот подход также признан нежелательным из-за его побочных эффектов.

Вариант 3: Пользовательская настройка "Формировать сразу"

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

Данная опция полезна для конечного пользователя, который может настроить поведение конкретного отчета для себя, но не является системным решением для отключения автоформирования для всех пользователей по умолчанию.

Выводы и рекомендации

Проанализировав все предложенные варианты и проверив их на практике, мы можем сделать следующие выводы:

  1. Отсутствует единый универсальный механизм: В конфигурации "Бухгалтерия предприятия КОРП" и БСП нет простого глобального параметра или одной точки входа, которая позволила бы отключить автоматическое формирование для всех отчетов при их открытии из интерфейса, особенно для отчетов, имеющих собственные формы.
  2. Точечная модификация через расширения — наиболее надежный подход: Для критически важных или "тяжелых" отчетов, где автоматическое формирование приводит к значительным задержкам и нагрузке, наиболее эффективным и контролируемым решением является модификация процедур ПриОткрытии и ПриЗагрузкеПользовательскихНастроекНаСервере форм отчетов через расширения. Это позволяет точно отключить запуск формирования и анимации, не затрагивая другие части системы.
  3. Программный параметр СформироватьПриОткрытии: Этот параметр очень полезен, когда мы открываем формы отчетов программно из другого кода. Однако для отчетов, запускаемых из пользовательского интерфейса, требуется найти универсальную точку перехвата вызова формы, чего пока не удалось достичь без изменения типового кода или сложного анализа БСП.
  4. Другие подходы имеют серьезные ограничения: Попытки использования Отчет.РежимРасшифровки, изменение интервала запуска или воздействие на общие формы БСП оказались либо неуниверсальными, либо имели нежелательные побочные эффекты.

В итоге, наиболее прагматичным решением для большинства ситуаций является применение точечных расширений для конкретных, проблемных отчетов. Это обеспечивает баланс между достижением цели и минимальным риском нарушения стандартного функционала системы. Если ваша задача требует полного и универсального решения, то это потребует глубочайшего анализа всей архитектуры БСП и, возможно, вмешательства в типовой код, что не рекомендуется из-за сложностей с обновлениями.

← На главную