Почему отладчик 1С не попадает в форму документа в расширении и как это исправить?

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

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

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

Часть 1. Разбор практической ситуации: забытая привязка события

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    
КонецПроцедуры

Аналогичный код в форме списка работал безупречно, и отладчик без проблем останавливался на точках останова. Но в форме документа точка останова оставалась «пустой» (неактивной), и код как будто не выполнялся. При этом принудительный вызов серверного метода через событие изменения реквизита отрабатывал корректно:


&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере()
    а = 1 / 0; // Искусственная ошибка для проверки вызова
КонецПроцедуры

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
    ОрганизацияПриИзмененииНаСервере();
КонецПроцедуры

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

Решение оказалось предельно простым: в свойствах формы документа (в палитре свойств на вкладке «События») в строке события ПриСозданииНаСервере не была выбрана сама процедура-обработчик. Код физически присутствовал в текстовом модуле формы, но платформа 1С не знала, что его нужно запускать при инициализации формы, так как связь между событием интерфейса и процедурой модуля отсутствовала.

В отличие от старой платформы 1С:Предприятие 7.7, где связь процедур и элементов управления часто определялась чисто по имени, в 1С:Предприятии 8 для явного вызова обработчика события его необходимо жестко связать через палитру свойств. Чтобы избежать подобных проблем при разработке форм «с нуля» или при заимствовании, всегда проверяйте свойства формы:

  1. Откройте форму документа в редакторе расширения.
  2. В правом нижнем углу найдите палитру свойств (если она закрыта, нажмите Alt + Enter).
  3. Перейдите к разделу «События» (иконка с лупой или молнией).
  4. Найдите событие ПриСозданииНаСервере и убедитесь, что в поле выбора указано имя вашей процедуры. Если поле пустое — выберите процедуру из выпадающего списка.

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

Часть 2. Системные причины сбоев отладки расширений и способы их устранения

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

1. Асинхронные вызовы и фоновые задания (БСП)

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

Как исправить:

Настройте автоматическое подключение отладчика к фоновым заданиям. Для этого в конфигураторе перейдите в меню Отладка — Подключение.... В открывшемся окне нажмите кнопку Автоматическое подключение и установите флажок напротив пункта Фоновые задания. После этого отладчик будет автоматически перехватывать все фоновые процессы, запущенные из вашего сеанса.

2. Использование параметра запуска /C РежимОтладки

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

Как исправить:

Для принудительного отключения фоновой оптимизации БСП запустите клиентский сеанс с параметром /C РежимОтладки. В конфигураторе это можно сделать, перейдя в меню Сервис — Параметры, на вкладку Запуск 1С:Предприятия — Основные. В поле Параметры запуска введите:

/C РежимОтладки

Этот параметр заставит БСП выполнять длительные операции синхронно, в основном потоке, что позволит без проблем останавливаться на любых точках останова.

3. Проблемы с кэшем конфигурации и «динамическим обновлением»

Платформа 1С:Предприятие (особенно релизы линеек 8.3.15 – 8.3.20) имеет известную проблему: при динамическом обновлении конфигурации базы данных (клавиша F7 при запущенных пользователях) кэш метаданных расширений может обновиться некорректно. В результате отладчик обращается к старым индексам строк кода, из-за чего точки останова визуально смещаются или вовсе перестают работать.

Как исправить:

4. Ошибки в аннотациях при заимствовании методов

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

Проанализируем пример. Если оригинальный метод в основной конфигурации имеет три параметра:


Процедура РассчитатьСумму(ДокументСсылка, ТабличнаяЧасть, Отказ)
    // Оригинальный код
КонецПроцедуры

А в расширении вы написали процедуру с аннотацией &Вместо, но забыли указать один из параметров или ошиблись в их порядке:


&Вместо("РассчитатьСумму")
Процедура Расш1_РассчитатьСумму(ДокументСсылка, ТабличнаяЧасть)
    // Код расширения
КонецПроцедуры

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

Как исправить:

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

5. Безопасный режим расширения

При подключении расширения в рабочую базу через справочник «Управление расширениями» (в режиме Предприятия) платформа по умолчанию устанавливает для него два важных флага:

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

Как исправить:

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

6. Метод «реанимации» отладчика через замер производительности

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

Как исправить:

  1. Запустите сеанс отладки.
  2. В конфигураторе перейдите в меню Отладка — Замер производительности (включите его).
  3. В режиме Предприятия выполните действие, которое должно вызвать ваш код в расширении.
  4. Вернитесь в конфигуратор и выключите Замер производительности.

После построения таблицы замера производительности платформа принудительно перестраивает внутреннюю карту вызовов и индексов модулей. В 90% случаев после этой простой процедуры отладчик «просыпается» и начинает исправно ловить точки останова в коде расширения.

← На главную