Механизм расширений в 1С:Предприятие 8.3 предоставляет мощный инструмент — аннотацию &ИзменениеИКонтроль. Она позволяет точечно изменять участки кода, не заменяя весь метод целиком, что значительно упрощает дальнейшее обновление конфигурации. Однако программисты часто сталкиваются с неприятной ситуацией: код в расширении работает, но отладчик упорно игнорирует точки останова или "выбрасывает" специалиста в модуль основной конфигурации. Рассмотрим подробно, почему это происходит и как настроить корректную отладку.
Прежде всего, выясним причину, связанную с версией программного обеспечения. Аннотация &ИзменениеИКонтроль появилась в платформе 8.3.12, но механизмы её отладки и стабильной работы совершенствовались на протяжении нескольких лет. Как отмечают специалисты, для стабильной работы необходимо соблюдение следующих условий:
При использовании &ИзменениеИКонтроль платформа выполняет посимвольное сравнение текста метода в расширении с текстом в основной конфигурации. Любое малейшее отклонение приводит к тому, что отладчик теряет связь с исходным кодом. Разберем по шагам, на что обратить внимание:
Посимвольное совпадение. Даже лишний пробел в конце строки или различие в символах табуляции могут стать критическими. Рассмотрим ситуацию: вы скопировали код вручную, и вместо знака табуляции (Tab) вставили несколько пробелов. Визуально код идентичен, но для платформы это разные тексты. В результате при попытке отладки конфигуратор открывает "оригинал", так как не может сопоставить измененный блок с расширением.
Символы перевода строки. Разные редакторы или настройки Git могут менять символы CRLF на LF. Если в основной конфигурации используются одни символы, а в расширении другие — отладка работать не будет. Рекомендуется использовать встроенный инструмент "Сравнить и объединить" для копирования текста метода из основной конфигурации в расширение.
Проанализируем пример правильной структуры метода:
&ИзменениеИКонтроль("ИмяПроцедуры")
Процедура ИмяПроцедуры()
// Этот код должен быть идентичен оригиналу до пробела
Запрос = Новый Запрос;
#Вставка
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";
#КонецВставки
Запрос.Выполнить();
КонецПроцедуры
Выясним причину, по которой отладчик "пролетает" мимо нужного участка. Существует техническая особенность: если вы ставите точку останова на строку, которая находится вне инструкций #Вставка или #Удаление, отладчик с высокой вероятностью откроет модуль основной конфигурации. Это происходит потому, что данные строки являются "контрольными" и полностью дублируют оригинал.
Правило: Всегда устанавливайте точку останова строго внутри блока #Вставка. Это принудительно заставляет платформу искать исполняемый код именно в контексте расширения.
Иногда проблема кроется не в коде, а в старых данных, которые хранит сервер. Посмотрим, как это исправить:
snaccfg) или временно удалите расширение из базы и добавьте его заново.Ситуация усложняется, если один и тот же метод заимствован в несколько расширений с аннотацией &ИзменениеИКонтроль. В этом случае приоритет выполнения и отладки зависит от порядка подключения расширений. Если в первом расширении метод заимствован без изменений, а во втором вы добавили код, отладчик может ошибочно пытаться показать код первого расширения. Проверьте список расширений на предмет дублирования заимствованных объектов.
Совет: Если вы перепробовали все методы, но отладка так и не заработала, попробуйте временно изменить аннотацию на &Вместо. Если в этом режиме отладка заработает, значит проблема однозначно заключается в несоблюдении идентичности "контрольного" кода для &ИзменениеИКонтроль.