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