Можно ли создать подписку на событие ПередНачаломРаботыСистемы и как перехватить запуск 1С?

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

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

Почему нельзя создать подписку на событие ПередНачаломРаботыСистемы

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

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

Однако существуют корректные архитектурные способы решить эту задачу без снятия основной конфигурации с поддержки. Рассмотрим их подробно.

Способ 1. Перехват события с помощью расширения конфигурации

Проанализируем наиболее современный и универсальный способ — использование механизма расширений конфигурации. Он позволяет вклиниться в запуск программы и полностью оставить основную конфигурацию нетронутой.

Разберем по шагам, как настроить перехват:

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

Посмотрим на пример реализации с аннотацией &Перед:


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

Если мы выбираем директиву &Вместо, то для сохранения штатной логики инициализации типовой конфигурации обязателен вызов метода ПродолжитьВызов(). Посмотрим на этот сценарий:


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

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

Способ 2. Использование переопределяемых модулей БСП через расширение

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

Разберем этот вариант:

  1. Заимствуем в расширение общий модуль СтандартныеПодсистемыКлиентПереопределяемый.
  2. Перехватываем с помощью аннотаций процедуру ПередНачаломРаботыСистемы или ПередНачаломРаботыСистемыБСП.

Посмотрим на пример внедрения кода:


&После("ПередНачаломРаботыСистемы")
Процедура Расш1_ПередНачаломРаботыСистемы(Отказ)
    // Пользовательская логика проверки готовности рабочего места
КонецПроцедуры

Такой подход обеспечивает дополнительную изоляцию доработок и исключает конфликты при обновлении корневых свойств конфигурации поставщика.

Особенности контекста события ПередНачаломРаботыСистемы

Проанализируем технические ограничения самого обработчика ПередНачаломРаботыСистемы(<Отказ>), описанные в синтакс-помощнике:

Событие возникает на клиенте до создания и открытия основного окна программы. В процедуре действуют жесткие правила:

  1. Запрет оконных операций: нельзя открывать формы, выводить немодальные и модальные окна, использовать вывод сообщений пользователю или менять состояние панели. Любая попытка обращения к графическому интерфейсу вызовет исключение.
  2. Отказ от запуска: если параметру Отказ присвоить значение Истина, сеанс пользователя мгновенно завершится без открытия программы.
  3. Влияние на скорость старта: вызовы сервера с директивой &НаСервере из этой процедуры замораживают инициализацию сеанса до завершения обработки запроса. Длительные расчеты здесь недопустимы. Любое необработанное исключение приведет к аварийному завершению работы 1С.

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

Способ 3. Пакетный запуск с передачей внешней обработки или параметров

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

Рассмотрим альтернативные варианты командной строки:

  1. Ключ /Execute: запуск платформы с параметром запуска внешней обработки:

    "C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Base" /Execute "D:\Scripts\StartTask.epf"

    При старте автоматически откроется форма внешней обработки, где в процедуре ПриОткрытии может отработать требуемый код с последующим закрытием программы командой ЗавершитьРаботуСистемы().
  2. Параметр /C: передача строкового параметра запуска:

    1cestart.exe ENTERPRISE /F "D:\Base" /C "AutoImport"

    Внутри кода конфигурации или расширения переданная строка считывается через глобальное свойство ПараметрЗапуска, что позволяет гибко управлять ветвлением стартовой логики.
← На главную