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