В процессе разработки на платформе 1С:Предприятие программисты регулярно сталкиваются с ситуацией, когда в клиентском коде (например, в процедуре ПриОткрытии) отладчик успешно останавливает выполнение программы, а на сервере (в обработчике ПриСозданииНаСервере или общих серверных модулях) точка останова игнорируется. Разберем по шагам, почему это происходит и как устранить данную проблему.
Проанализируем базовый механизм работы среды исполнения 1С. Отладчик платформы может прерывать выполнение только на тех строках, которые компилируются в исполняемые инструкции виртуальной машины. Если установить точку останова на декларативную или служебную инструкцию, платформа просто не передаст управление в Конфигуратор.
Именно с этой ситуацией столкнулся автор вопроса: точка была установлена на директиве объявления переменной:
Перем ОграниченияСписокСчетов;
Если ЗначениеЗаполнено(Параметры.ОтборПоПараметруБланка) Тогда
// Исполняемый код
КонецЕсли;
Строка Перем ОграниченияСписокСчетов; сообщает компилятору о наличии локальной переменной, но сама по себе не выполняет никаких действий в рантайме. Как только точка останова была перенесена на следующую исполняемую строку с условием Если, отладчик сразу сработал штатно.
Выясним, какие еще строки кода являются неисполняемыми и игнорируются средой отладки:
Перем.#Область, #КонецОбласти, #Если, #Иначе, #КонецЕсли.Процедура и Функция.КонецПроцедуры и КонецФункции.Всегда проверяем: чтобы точка останова гарантированно сработала, размещаем ее на первой значащей исполняемой инструкции тела процедуры или функции.
Рассмотрим следующую распространенную ситуацию в клиент-серверном варианте работы. По умолчанию служба Агент сервера 1С:Предприятия запускается в рабочем режиме, при котором модуль отладки на стороне сервера отключен для снижения накладных расходов на производительность. При этом на клиенте отладка продолжает работать.
Чтобы включить отладку на сервере, выполним следующие действия:
regedit.1C:Enterprise 8.3 Server Agent (путь зависит от версии платформы и разрядности службы).ImagePath находим строку запуска службы и добавляем ключ -debug.Если сервер работает под управлением Linux, флаг -debug необходимо прописать в конфигурационном файле запуска демона (например, в параметре SRV1CV8_DEBUG=1 в файле настроек службы).
Даже если служба сервера запущена с ключом -debug, отладчик в Конфигураторе должен знать, какие именно типы сеансов требуется перехватывать. Если серверный сеанс не подключен, остановка не произойдет.
Разберем, как проверить и скорректировать параметры подключения отладки в среде разработки:
Проанализируем техническую проблему, возникающую при применении «демонического» (динамического) обновления базы данных. При обновлении конфигурации базы данных без отключения пользователей рабочий процесс rphost может продолжать выполнять старую версию скомпилированного байт-кода, закэшированную в памяти.
В результате номера и смещения строк в запущенном сеансе расходятся с текстом модуля, открытым в Конфигураторе. Точка останова физически не может совпасть с выполняемой строкой.
Для решения проблемы очищаем локальный кэш конфигурации разработчика и перезапускаем рабочий процесс rphost либо полностью службу сервера 1С.
В зависимости от используемого протокола (TCP или HTTP) отладчик и кластер серверов обмениваются данными по выделенным портам. Если на рабочем компьютере разработчика включен брандмауэр, входящие сетевые пакеты от серверного процесса rphost могут блокироваться. В этом случае сеанс на сервере замирает или игнорирует точку останова, так как не получает ответа от среды разработки.
При использовании современной отладки по протоколу HTTP проверяем доступность сервера отладки (Debug Broker) и сетевых портов между рабочим местом программиста и сервером приложений 1С.
Если быстро восстановить работу отладчика не удается, а поведение серверной процедуры необходимо исследовать немедленно, рассмотрим альтернативные приемы диагностики:
ЗаписьЖурналаРегистрации, фиксируя передаваемые параметры формы и внутренние структуры данных.ВызватьИсключение "Контрольная точка";. Это приведет к остановке программы и покажет стек вызовов и контекст исполнения в сообщении об ошибке.