Как получить событие запуска внешней обработки и реализовать универсальный контроль?

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

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

Метод 1: Использование расширений для перехвата процедур БСП

Наиболее корректным и современным способом решения задачи в конфигурациях на базе Библиотеки стандартных подсистем (БСП) является использование механизма расширений. Проанализируем архитектуру БСП: запуск практически всех дополнительных обработок проходит через общие модули клиентской или серверной части.

Рассмотрим подробнее процесс перехвата в модуле ДополнительныеОтчетыИОбработкиКлиент. Нам необходимо найти процедуру, отвечающую за выполнение команды. Чаще всего это процедура ВыполнитьКоманду. Мы можем использовать аннотацию &Перед, чтобы внедрить свою проверку до начала основного кода БСП.

Пример реализации в расширении:


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

Метод 2: Программная установка условий использования в БСП

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

Проанализируем работу модуля менеджера справочника ДополнительныеОтчетыИОбработки. Там существуют процедуры, определяющие состав видимых команд. Мы можем создать расширение и перехватить процедуру ПриОпределенииКомандПодключенныхКОбъекту. Это позволит добавить логику, которая будет анализировать контекст (например, текущего пользователя) и программно устанавливать видимость или доступность команды.

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

Метод 3: Глобальный перехват создания объектов через менеджер

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

Начиная с последних версий платформы 8.3, расширения позволяют перехватывать системные методы. Разберем пример перехвата создания объекта:


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

Метод 4: Ограничение через профили безопасности (уровень кластера)

Если задача стоит максимально радикально — полностью запретить или жестко контролировать запуск любого внешнего кода (включая интерактивное открытие через «Файл — Открыть»), следует использовать профили безопасности. Этот механизм работает на уровне кластера серверов 1С и позволяет:

  1. Запретить запуск любых внешних отчетов и обработок для конкретной информационной базы.
  2. Настроить список «разрешенных» обработок по их хэш-суммам.
  3. Ограничить доступ внешнего кода к файловой системе, интернет-ресурсам и COM-объектам.

Этот метод не требует написания кода, но требует административной настройки сервера. Он является самым надежным с точки зрения информационной безопасности.

Метод 5: Использование событий формы (для платформы 8.3.15+)

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

Алгоритм действий следующий:

  1. Создаем расширение.
  2. Добавляем в него общую форму или используем механизм перехвата событий форм.
  3. В обработчике анализируем свойство формы ЭтотОбъект или ИмяФормы.
  4. Если имя формы начинается с «ВнешняяОбработка.», выполняем проверку условий.

Рекомендации по выбору решения

Проанализируем, какой метод выбрать в зависимости от ситуации:

Важное примечание: при реализации любых блокировок всегда оставляйте возможность запуска для пользователей с полными правами или ролью «Администратор», чтобы не заблокировать себе возможность отладки и обслуживания системы.

← На главную