В процессе разработки конфигураций на платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда код внутри обработчика ПриНачалеРаботыСистемы (модуль управляемого приложения или модуль обычного приложения) ведет себя неожиданно: точка останова срабатывает только на строке КонецПроцедуры, а строки внутри метода полностью игнорируются, либо отладчик вовсе не останавливает выполнение программы. Разберем по шагам ключевые причины такого поведения и способы их устранения.
Проанализируем самую простую, но наиболее часто ускользающую от внимания причину: наличие оператора Возврат в начале или середине процедуры. Если перед целевым кодом расположено условие или безусловный оператор прерывания подпрограммы, управление сразу переходит к завершению метода.
Посмотрим на типичный фрагмент кода:
Процедура ПриНачалеРаботыСистемы()
// Временная заглушка или неверное логическое условие
Если НекотороеУсловие() Тогда
Возврат;
КонецЕсли;
// Целевой код, который кажется разработчику «неработающим»
ИнициализироватьПараметрыИнтерфейса();
КонецПроцедуры
В такой ситуации точка останова на строке с вызовом ИнициализироватьПараметрыИнтерфейса() никогда не сработает, в то время как отладчик может остановиться на строке КонецПроцедуры при возврате управления. Внимательно проверим весь путь выполнения алгоритма до исследуемой строки.
Модуль приложения может содержать инструкции препроцессора, отсекающие выполнение блоков кода в зависимости от контекста сборки. Если код находится внутри блока, не предназначенного для текущего клиента, компилятор платформы полностью исключает эти строки из результирующего байт-кода.
Разберем пример:
Процедура ПриНачалеРаботыСистемы()
#Если Сервер Тогда
// Данный блок никогда не выполнится на клиенте
ВыполнитьСерверныеДействия();
#КонецЕсли
#Если ВебКлиент Тогда
// Сработает только при запуске через браузер
НастроитьВебИнтерфейс();
#КонецЕсли
КонецПроцедуры
Если мы запускаем тонкий клиент под Windows, блок #Если ВебКлиент Тогда будет проигнорирован. Убедимся, что для исполняемого кода установлены корректные инструкции препроцессора, соответствующие текущему типу клиентского приложения.
Если в базе данных используются расширения, стандартный обработчик ПриНачалеРаботыСистемы может быть переопределен. Рассмотрим ситуацию, когда метод модифицирован с помощью аннотации &Вместо:
&Вместо("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
// Если разработчик расширения забыл вызвать ПродолжитьВызов(),
// оригинальный код из основной конфигурации никогда не запустится
// ПродолжитьВызов();
КонецПроцедуры
В этом случае управление перехватывается расширением, а тело оригинальной процедуры платформой полностью игнорируется. Проверим состав подключенных расширений и наличие аннотаций &Вместо для обработчиков старта системы.
Событию ПриНачалеРаботыСистемы строго предшествует процедура ПередНачаломРаботыСистемы. Проанализируем ее логику:
Отказ присвоено значение Истина, сеанс завершается до вызова последующих событий.ЗавершитьРаботуСистемы(), управление до ПриНачалеРаботыСистемы также не дойдет.Установим точку останова в самом начале процедуры ПередНачаломРаботыСистемы и пошагово пройдем выполнение, чтобы убедиться в отсутствии аварийного выхода.
Выясним технические причины, связанные непосредственно с механизмами платформы и подключением отладчика:
F5 клиентское приложение может пройти первые строки быстрее, чем служба отладки успеет зарегистрировать точку останова. Чтобы избежать этой проблемы, перейдем в меню конфигуратора Отладка — Подключение — Настройка автоматического подключения и включим автоматическое подключение для клиентских приложений.ПриНачалеРаботыСистемы срабатывает исключительно при интерактивном клиентском входе. Оно не выполняется при вызовах через V83.COMConnector, регламентных и фоновых заданиях, а также при обращениях к Web- и HTTP-сервисам.ПодключитьОбработчикОжидания(), он выполнится только после возврата управления в главный цикл интерфейса, то есть строго после завершения ПриНачалеРаботыСистемы.