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