К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как отлаживать расширение конфигурации в 1С

Как отлаживать расширение конфигурации в 1С: включение режима отладки, точки останова, подмена процедур, типичные ошибки и проверка результата.

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

Ниже разобран практический порядок работы: как включить отладку, где ставить точки останова в модулях расширения, как отлаживать подменённые процедуры и обработчики, что проверять, когда отладчик «молчит», и какие ограничения существуют у расширений в принципе. Материал ориентирован на конфигуратор и режим предприятия в файловой и клиент-серверной базах.

Подготовка: включение отладки и проверка окружения

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

Далее включите отладку. В конфигураторе откройте «Сервис — Параметры» и на закладке, связанной с отладкой, проверьте разрешённые типы подключения. Для файловой базы обычно достаточно локальной отладки. Для клиент-серверного варианта отладку должен разрешить администратор кластера: в консоли кластера у свойств сервера включается режим отладки, после чего требуется перезапуск службы агента сервера. Без этого серверный код, включая серверные модули расширения, останавливаться не будет.

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

Подключение предмета отладки к сеансу с расширением

Отладчик в конфигураторе работает по принципу «подключения» к запущенным сеансам. Откройте «Отладка — Подключение» и найдите в списке нужный предмет отладки: тонкий клиент, толстый клиент, сервер, фоновое задание или веб-сервис. Отметьте его флажком и подтвердите подключение. Если список пуст, вернитесь к настройкам отладки — предметы не видны, когда отладка запрещена или протоколы не совпадают.

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

Точки останова в модулях расширения

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

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

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

Отладка подменённых процедур и обработчиков событий

Подмена типовых процедур — самый частый сценарий расширений и одновременно источник путаницы при отладке. Когда отладчик останавливается в вашей подменяющей процедуре, обратите внимание на стек вызовов: там видно, из какого типового метода произошёл вызов и какие параметры переданы. Это позволяет проверить, что подмена вообще сработала и контекст соответствует ожиданиям.

Для обработчиков событий форм, заимствованных в расширение, действует то же правило: заимствованная форма — это отдельный объект с собственным модулем. Точки ставятся в модуле формы расширения. Если форма в сеансе открылась типовая, а не расширенная (например, из-за конфликта с другим расширением), ваши точки молчат. Проверить, какая версия открылась, можно по заголовку или через «Отладка — Вычислить выражение», запросив свойства формы.

Контрольные точки

Как проверить, что отлаживается именно расширение

Стек вызовов при остановке
Норма

В стеке виден модуль расширения и вызов из типового метода

Тревожный признак

Стек содержит только типовые модули — подмена не сработала

Список расширений в сеансе
Норма

Расширение активно, без пометок об ошибке применения

Тревожный признак

Расширение отключено или не применено из-за несовместимости

Открытая форма
Норма

Открылась заимствованная форма расширения

Тревожный признак

Открылась типовая форма — конфликт с другим расширением

Отладка в фоновых заданиях и внешних соединениях

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

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

Порядок отладки расширения
  1. 1
    Убедитесь, что расширение активно и применено в сеансе
  2. 2
    Включите отладку в конфигураторе и, при необходимости, на сервере
  3. 3
    Подключите предметы отладки: клиент и сервер (или фоновое задание)
  4. 4
    Поставьте точки останова в модулях расширения с учётом аннотаций &Перед/&После/&Вместо
  5. 5
    Воспроизведите действие в режиме предприятия
  6. 6
    При остановке проверьте стек вызовов и значения параметров
  7. 7
    После исправления перезапустите сеанс и повторите проверку

Типичные проблемы и их решение

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

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

Третья группа — ограничения самих расширений. Не все объекты и механизмы можно изменить расширением, а изменённые в расширении роли и права применяются с особенностями. Если отладка показывает, что код не выполняется из-за прав доступа, проверяйте роли расширения и профили групп доступа, а не только логику кода.

Типичные ошибки
01
Отлаживать без перезапуска сеанса после изменения расширения — сеанс работает со старой версией кода
02
Подключать отладку только к клиенту, когда код выполняется на сервере — серверные точки не срабатывают
03
Ставить точку в обработчике &После, не проверив, что типовой метод завершается без исключения
04
Искать ошибку в своём расширении, когда метод подменён другим расширением с более высоким приоритетом
05
Оставлять в рабочей базе временные циклы ожидания для подключения к фоновым заданиям

Проверка результата после исправления

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

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

Частые вопросы

Почему точка останова в расширении не срабатывает, хотя отладка включена?

Чаще всего сеанс не перезапущен после изменения расширения, не подключён нужный предмет отладки (сервер, фоновое задание) или расширение не применено в сеансе. Реже — метод подменён другим расширением с более высоким приоритетом.

Можно ли отлаживать расширение в веб-клиенте?

Да, веб-клиент появляется в списке предметов отладки как отдельный тип. Подключите его в окне «Отладка — Подключение», но учтите, что браузерный сеанс может иметь ограничения по времени ожидания — при долгой остановке на точке сеанс способен оборваться по таймауту.

Как отладить код, который выполняется в фоновом задании?

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

Видит ли отладчик разницу между &Перед, &После и &Вместо?

Отладчик просто останавливается на вашем коде, когда он реально выполняется. Разницу нужно учитывать самостоятельно: &Вместо полностью замещает типовой метод, &После не выполнится при исключении в типовом коде, &Перед выполняется до него.

Нужно ли снимать расширение с поддержки для отладки?

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

Что делать, если после обновления типовой конфигурации расширение перестало работать?

Проверьте применимость расширения в его свойствах и списке расширений сеанса: изменённые типовые объекты могли стать несовместимыми. Затем пройдите отладчиком все точки подмены — сигнатуры типовых методов могли измениться, и ваши обработчики перестали вызываться.

Итог

Что важно запомнить

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