Как оперативно закрыть доступ к конкретному отчету в 1С:ERP без выгона пользователей?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

В процессе администрирования крупных корпоративных систем на базе 1С:ERP Управление предприятием часто возникает критическая ситуация: один из отчетов (недавно добавленный или измененный разработчиками) начинает "вешать" всю базу данных. Причиной может быть неоптимальный запрос, некорректно настроенные соединения таблиц, отсутствие индексов или тяжелые запросы в обход RLS (ограничения доступа на уровне записей).

Проблема усугубляется тем, что администратор не может выполнить стандартное динамическое обновление конфигурации («демонское» обновление). В высоконагруженных базах динамическое обновление часто приводит к зависанию пользовательских сеансов, очистке или повреждению локального кэша, а также к потере соединения с СУБД. Выгонять сотни активных пользователей в разгар рабочего дня для монопольного обновления базы — тоже не вариант.

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

---

Почему не сработал признак «Только для автора»?

Разберем типичную ошибку администрирования. При обнаружении зависания базы администраторы часто пытаются ограничить доступ к отчету через пользовательский интерфейс БСП, устанавливая в свойствах варианта отчета признак «Только для автора» или снимая все флаги видимости в разделах командного интерфейса.

Выясним причину, почему это не решает проблему полностью:

  1. Ограничение только видимости, но не прав: Настройки БСП в справочнике ВариантыОтчетов управляют исключительно отображением отчета в стандартных панелях, меню разделов и глобальном поиске. Они не накладывают ограничений на уровне СУБД или ролей платформы 1С.
  2. Прямые навигационные ссылки: Если у пользователей в профилях безопасности (ролях) осталось право на «Просмотр» самого объекта метаданных Отчет.ИмяПроблемногоОтчета, они могут беспрепятственно открыть его форму.
  3. История и Избранное: Пользователи активно используют механизмы платформы «История» и «Избранное». Ссылка в этих панелях ведет напрямую к объекту метаданных (например, e1cib/app/Отчет.ИмяПроблемногоОтчета). При переходе по такой ссылке механизмы проверки видимости БСП просто игнорируются, и открывается стандартная форма отчета.

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

---

Решение 1. Быстрая блокировка отчета с помощью безопасного расширения

Наиболее технологичный и безопасный метод закрыть доступ к отчету «на горячую» — это использование механизма Расширений конфигурации. Платформа 1С:Предприятие 8.3 позволяет подключать и применять расширения в режиме «на лету» (без монопольного захвата базы и без перезапуска пользователей), если расширение не вносит изменений в структуру данных СУБД (не добавляет новые реквизиты, справочники, документы).

Проанализируем пошаговый алгоритм реализации данного решения:

  1. Создадим новое расширение конфигурации в Конфигураторе. В свойствах расширения снимем флаги УправлениеГруппамиДоступа и другие контролирующие параметры, если это необходимо для быстрого применения. Главное — убедиться, что свойство «Активно» установлено в значение Истина.
  2. Добавим в расширение форму проблемного отчета. Если у отчета нет собственной формы и он использует общую форму отчета БСП, то мы можем перехватить событие инициализации. Рассмотрим вариант, когда у отчета есть своя форма.
  3. В модуле формы отчета перехватим событие ПриСозданииНаСервере с помощью аннотации &Перед. Напишем код блокировки:

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

После сохранения расширения оно мгновенно применится для всех новых сеансов, а при попытке открыть отчет из «Избранного» или по прямой ссылке пользователи увидят системное предупреждение, и тяжелый запрос к базе данных даже не начнет выполняться.

---

Решение 2. Точечная очистка «Избранного» у всех пользователей программным путем

Если вы уже заменили встроенный отчет внешним (как описывает автор в сообщении №3), но пользователи продолжают по привычке нажимать на звездочку в панели «Избранное», вызывая старый зависающий объект, необходимо почистить эти ссылки.

Полностью очищать избранное через метод ИсторияРаботыПользователя.ОчиститьВсе() крайне нежелательно — это вызовет волну недовольства со стороны пользователей, потерявших свои рабочие ссылки. Вместо этого выполним точечное удаление только ссылки на битый отчет.

Данные «Избранного» хранятся в системном хранилище настроек платформы. Напишем и запустим внешнюю обработку, которая обойдет настройки всех пользователей системы:


Процедура ТочечноОчиститьИзбранное() Экспорт
    
    // Получаем список всех зарегистрированных пользователей ИБ
    ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
    СтрокаПоиска = "Отчет.ИмяПроблемногоОтчета"; // Имя вашего зависающего отчета в метаданных
    
    Для Каждого ПользовательИБ Из ПользователиИБ Цикл
        ИмяПользователя = ПользовательИБ.Имя;
        
        Попытка
            // Загружаем настройки избранного для текущего пользователя
            Избранное = ХранилищеОбщихНастроек.Загрузить("System/Favorites", "", , ИмяПользователя);
            
            Если Избранное <> Неопределено И Избранное.Количество() > 0 Тогда
                Модифицировано = Ложь;
                
                // Обходим коллекцию с конца, чтобы корректно удалять элементы по индексу
                Для Индекс = -(Избранное.Количество() - 1) По 0 Цикл
                    ТекущийИндекс = -Индекс;
                    ЭлементИзбранного = Избранное[ТекущийИндекс];
                    
                    // Анализируем навигационную ссылку элемента
                    Если Найти(ЭлементИзбранного.НавигационнаяСсылка, СтрокаПоиска) > 0 Тогда
                        Избранное.Удалить(ТекущийИндекс);
                        Модифицировано = Истина;
                    КонецЕсли;
                КонецЦикла;
                
                // Если ссылка найдена и удалена, перезаписываем настройки пользователя
                Если Модифицировано Тогда
                    ХранилищеОбщихНастроек.Сохранить("System/Favorites", "", Избранное, , ИмяПользователя);
                    ЗаписьЖурналаРегистрации("ОптимизацияАдминистрирования.ОчисткаИзбранного",
                        УровеньЖурналаРегистрации.Информация, , ,
                        "Успешно удалена ссылка на проблемный отчет у пользователя: " + ИмяПользователя);
                КонецЕсли;
            КонецЕсли;
            
        Исключение
            // Обрабатываем исключения (например, если у пользователя нет прав или профиль поврежден)
            ЗаписьЖурналаРегистрации("ОптимизацияАдминистрирования.ОшибкаОчисткиИзбранного",
                УровеньЖурналаРегистрации.Предупреждение, , ,
                "Не удалось обработать пользователя " + ИмяПользователя + ". Ошибка: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
    Предупреждение("Точечная очистка Избранного успешно завершена!");
    
КонецПроцедуры

Этот скрипт можно безопасно выполнить из внешней обработки под полными правами прямо во время работы пользователей.

---

Решение 3. Деактивация вариантов отчетов в пользовательском режиме

Поскольку БСП активно работает со справочниками вариантов отчетов, пользователи могли наделать копий вашего отчета под другими именами (о чем упоминается в сообщении №24). Чтобы перекрыть эту лазейку, выполним следующие действия в режиме «1С:Предприятие» под учетной записью администратора:

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

---

Решение 4. Правильная архитектура работы с внешними отчетами

Для предотвращения подобных ситуаций в будущем рекомендуется придерживаться важного правила разработки в системах класса ERP: все новые тяжелые или экспериментальные отчета внедрять исключительно через механизм дополнительных (внешних) отчетов и обработок.

Преимущества такого подхода:

Используя предложенные методики (в первую очередь создание оперативного расширения-блокиратора и точечное вычищение избранного через ХранилищеОбщихНастроек), вы сможете быстро локализовать проблему производительности СУБД, не мешая пользователям выполнять их ежедневные задачи в 1С:ERP.

← На главную