При сопровождении типовых решений часто возникает задача выполнить определенный алгоритм в момент старта программы. При этом критически важно сохранить конфигурацию на полной поддержке поставщика для беспрепятственного автоматического обновления. Разберем, возможно ли использовать для этой цели стандартный объект метаданных Подписка на событие и какие существуют альтернативные способы выполнения кода при запуске.
Выясним причину платформенного ограничения. Объект конфигурации Подписка на событие в платформе 1С:Предприятие предназначен исключительно для обработки событий серверных прикладных объектов данных (таких как справочники, документы, регистры, планы видов характеристик, наборы записей) и их менеджеров.
События ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы относятся к жизненному циклу клиентского приложения. Они вызываются в контексте модуля управляемого (или обычного) приложения. Платформа принципиально не предоставляет функционал создания подписок на события модулей приложений и экранных форм. Поэтому создать подписку на запуск системы штатными средствами дерева метаданных невозможно.
Однако существуют корректные архитектурные способы решить эту задачу без снятия основной конфигурации с поддержки. Рассмотрим их подробно.
Проанализируем наиболее современный и универсальный способ — использование механизма расширений конфигурации. Он позволяет вклиниться в запуск программы и полностью оставить основную конфигурацию нетронутой.
Разберем по шагам, как настроить перехват:
&Перед, &После или &Вместо).Посмотрим на пример реализации с аннотацией &Перед:
&Перед("ПередНачаломРаботыСистемы")
Процедура Расш1_ПередНачаломРаботыСистемы(Отказ)
// Собственный алгоритм проверки условий запуска
Если НеобходимаБлокировкаЗапуска() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Если мы выбираем директиву &Вместо, то для сохранения штатной логики инициализации типовой конфигурации обязателен вызов метода ПродолжитьВызов(). Посмотрим на этот сценарий:
&Вместо("ПередНачаломРаботыСистемы")
Процедура Расш1_Вместо_ПередНачаломРаботыСистемы(Отказ)
// Код, выполняемый до типовых механизмов запуска
// Обязательный вызов исходного обработчика конфигурации
ПродолжитьВызов(Отказ);
Если Отказ Тогда
Возврат;
КонецЕсли;
// Код, выполняемый после успешной базовой проверки
КонецПроцедуры
Важное ограничение: обратим внимание на свойство расширения Безопасный режим. Если расширение подключено в безопасном режиме, накладываются системные ограничения на вызов внешних компонент, работу с файловой системой и внешними ресурсами. Если ваш код выполняет такие операции, флаг безопасного режима в свойствах расширения необходимо отключить.
В конфигурациях, созданных на базе Библиотеки стандартных подсистем (БСП), значительная часть логики старта вынесена из модуля управляемого приложения в специализированные подсистемы. В таких решениях часто предпочтительнее расширять не модуль приложения целиком, а клиентские переопределяемые модули.
Разберем этот вариант:
СтандартныеПодсистемыКлиентПереопределяемый.ПередНачаломРаботыСистемы или ПередНачаломРаботыСистемыБСП.Посмотрим на пример внедрения кода:
&После("ПередНачаломРаботыСистемы")
Процедура Расш1_ПередНачаломРаботыСистемы(Отказ)
// Пользовательская логика проверки готовности рабочего места
КонецПроцедуры
Такой подход обеспечивает дополнительную изоляцию доработок и исключает конфликты при обновлении корневых свойств конфигурации поставщика.
Проанализируем технические ограничения самого обработчика ПередНачаломРаботыСистемы(<Отказ>), описанные в синтакс-помощнике:
Событие возникает на клиенте до создания и открытия основного окна программы. В процедуре действуют жесткие правила:
Отказ присвоить значение Истина, сеанс пользователя мгновенно завершится без открытия программы.&НаСервере из этой процедуры замораживают инициализацию сеанса до завершения обработки запроса. Длительные расчеты здесь недопустимы. Любое необработанное исключение приведет к аварийному завершению работы 1С.Если для работы вашего алгоритма требуется вывод диалогов, интерактивное взаимодействие с пользователем или открытие формы, необходимо переносить выполнение в обработчик ПриНачалеРаботыСистемы, когда главное окно уже инициализировано.
В сценариях регламентной обработки, интеграции или служебных задач запуск кода можно реализовать вообще без изменения структуры конфигурации и без расширений.
Рассмотрим альтернативные варианты командной строки:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Base" /Execute "D:\Scripts\StartTask.epf"
ПриОткрытии может отработать требуемый код с последующим закрытием программы командой ЗавершитьРаботуСистемы().1cestart.exe ENTERPRISE /F "D:\Base" /C "AutoImport"
ПараметрЗапуска, что позволяет гибко управлять ветвлением стартовой логики.