Каждый разработчик 1С рано или поздно сталкивается с мистическим поведением отладчика при работе с расширениями конфигурации. Вы устанавливаете точку останова на конкретную строку кода в заимствованном общем модуле, запускаете сеанс, но при пошаговом выполнении (клавиши F11/F10) желтая стрелка отладчика начинает скакать по совершенно случайным строкам, комментариям или вообще улетает в пустые области. При этом стандартные действия вроде очистки локального кэша, перезапуска Конфигуратора или даже пересоздания расширения не приносят никакого результата.
В этой статье мы подробно разберем, почему возникает эффект «смещения» строк при отладке в расширениях, проанализируем неочевидные технические причины этого явления и рассмотрим пошаговый алгоритм решения проблемы.
Выясним главные причины десинхронизации отладчика и конфигурации базы данных.
---
Это одна из самых частых и неочевидных причин сбоя работы отладчика. Платформа 1С:Предприятие использует механизм динамической и «ленивой» компиляции модулей. Если в вашем расширении есть несколько модулей (например, заимствованный ОбщийМодуль1 и ваш собственный МодульОбъекта какого-нибудь документа), и в одном из них содержится синтаксическая ошибка, система может частично заблокировать обновление конфигурации отладки.
При применении расширения платформа пытается зарегистрировать все изменения. Если в стороннем модуле расширения нарушена целостность кода (например, забыта скобка, не закрыт оператор Если или удалена переменная), это может не вызывать явных ошибок при запуске в режиме «Предприятие», если этот код не вызывается напрямую в текущем сеансе. Однако внутренний компилятор не сможет корректно перестроить дерево метаданных для отладки. В результате отладчик продолжает использовать старую («кэшированную») карту строк для вашего рабочего модуля, что визуально выражается в перескакивании строк.
Решение: Проведите полную проверку конфигурации расширения на наличие синтаксических ошибок. Для этого перейдите в меню Конфигурация — Синтаксический контроль или выполните проверку возможности применения расширения.
---
Директива &Вместо с методом ИзменениеИКонтроль работает не как обычная замена процедуры, а как динамический «патч». При компиляции система пытается сопоставить текст из основной конфигурации с текстом внутри расширения, ориентируясь на теги:
#Область ПередКодом
// Исходный код основной конфигурации
#КонецОбласти
#Вставка
// Ваш новый код в расширении
#КонецВставки
Если в основной конфигурации в процессе обновления (или даже случайного редактирования) изменилась хотя бы одна пустая строка, добавился или удалился комментарий внутри заимствованного метода, внутренние индексы строк «плывут». Проверка применимости расширения при этом может проходить успешно (так как ключевой код совпадает), но отладчик теряет точные маркеры строк и начинает позиционироваться со смещением на несколько позиций вверх или вниз.
---
Очистка локального кэша на компьютере разработчика (из папок %LocalAppData%\1C) помогает далеко не всегда. В клиент-серверном варианте работы кэш компилированных модулей живет на стороне сервера 1С (в рабочих процессах rphost). При частом динамическом обновлении расширений сервер может продолжать отдавать старую проекцию кода для сеанса отладки.
---
Разберем последовательность действий, которая гарантированно поможет вернуть отладчик в рабочее состояние.
Прежде чем приступать к радикальным мерам, необходимо убедиться, что платформа корректно сопоставляет расширение с основной конфигурацией. Проверим это встроенным инструментом:
Если система выдаст предупреждения или ошибки, связанные со сторонними модулями, их необходимо устранить в первую очередь.
Запустите полную проверку модулей расширения:
Чтобы заставить сервер 1С принудительно пересобрать дерево метаданных и очистить кэш скомпилированных модулей без перезапуска всего сервера, применим следующий технический прием:
rphost). Закройте предприятие.Если визуальный отладчик продолжает вести себя некорректно, а вам критически важно понять, выполняется ли конкретный участок кода и какие значения принимают переменные, можно использовать гарантированный метод «жесткой» остановки через генерацию системного исключения:
Вставьте в исследуемый участок кода следующий фрагмент:
// Временный отладочный код
ИмяПеременнойДляАнализа = "Значение";
ВызватьИсключение "Остановка отладки: " + ИмяПеременнойДляАнализа;
При выполнении этого участка кода система аварийно завершит операцию и выдаст окно с ошибкой. В этот момент в Конфигураторе нажмите кнопку Подробно, а затем Конфигуратор. Платформа откроет стек вызовов и спозиционирует вас ровно на той строке кода в расширении, которая вызвала это исключение, проигнорировав любые ошибки кэширования индексов строк.
---
Заимствование типовых общих модулей в расширения с методом &Вместо — это мощный инструмент, но он несет в себе высокие риски при последующих обновлениях конфигурации. Рассмотрим более надежные подходы, которые рекомендует фирма 1С.
Вместо того чтобы внедряться непосредственно в код проведения документа или записи справочника внутри общего модуля, мы можем создать собственную подписку на событие прямо в расширении. Например, для анализа проведения документа воспользуемся событием ОбработкаПроведения.
Посмотрим на пример создания обработчика в модуле расширения:
Процедура Мой_ОбработкаПроведенияПриЗаписи(Источник, Отказ, РежимПроведения) Экспорт
// Наш кастомный код, который отработает гарантированно
// и не сломается при обновлении типового общего модуля
Если Не Отказ Тогда
// Выполняем логику контроля
КонецЕсли;
КонецПроцедуры
Этот метод полностью изолирован от обновлений поставщика и никогда не вызовет проблем со смещением строк при отладке.
Если вам все же необходимо доработать алгоритм общего модуля, старайтесь выносить всю новую бизнес-логику в **ваш собственный общий модуль**, созданный внутри расширения. В заимствованном модуле оставляйте лишь минимальный вызов вашей процедуры. Это позволит локализовать область потенциальных ошибок компиляции и упростит чтение кода.
Соблюдение этих простых правил разработки и своевременная диагностика синтаксической целостности расширения позволят вам навсегда забыть о проблемах со смещением строк в отладчике 1С.