Каждый разработчик 1С рано или поздно сталкивается с аномальным поведением конфигуратора, когда свеженаписанный код успешно выполняется в режиме 1С:Предприятие (например, срабатывает функция Сообщить), но сам отладчик при этом упорно отказывается останавливаться на нужной строке или начинает «ходить» по невидимым, пустым строкам. Особенно часто это явление проявляется при работе с расширениями конфигурации в серверных процедурах управляемых форм.
Выясним причину этой проблемы. При динамическом подключении расширений платформа 1С производит так называемый маппинг (сопоставление строк) исходной формы и модуля расширения. Если во внутренней базе данных или локальном кэше происходит сбой, таблица соответствия строк ломается. Отладчик пытается ориентироваться на старые индексы строк, в то время как виртуальная машина выполняет уже обновленный скомпилированный код. Разберем по шагам проверенные и эффективные методы борьбы с этой аномалией.
Проанализируем архитектурные особенности платформы 1С. Наиболее уязвимым местом для сбоя сопоставления строк являются именно модули управляемых форм в расширениях (при использовании аннотаций &Перед, &После или &Вместо). В то же время, общие модули, добавленные в расширение, компилируются платформой целиком и практически никогда не страдают от рассинхронизации отладчика.
Рассмотрим самый надежный архитектурный обходной путь — вынос всей сложной серверной логики из модуля формы в отдельный общий модуль расширения:
Расш1_РаботаСФормамиСервер. В свойствах модуля обязательно взведем флаги «Сервер» и при необходимости «Вызов сервера».Посмотрим на пример того, как должен выглядеть код в модуле расширения управляемой формы:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Вместо написания кода здесь, передаем управление в общий модуль
Расш1_РаботаСФормамиСервер.ОбработатьПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
А теперь напишем соответствующий метод внутри созданного нами общего модуля расширения Расш1_РаботаСФормамиСервер:
Процедура ОбработатьПриСозданииНаСервере(Форма) Экспорт
// Весь необходимый код пишется здесь
ПеременнаяА = 5;
Сообщить("Новый код успешно выполняется!");
МассивСтрок = Новый Массив;
// Отладчик внутри этой процедуры будет работать безупречно
КонецПроцедуры
Этот простой шаг не только навсегда решит проблему с «невидимым» кодом для отладчика, но и сделает архитектуру вашего расширения более чистой и поддерживаемой.
Если вам нужно срочно отладить процедуру прямо в модуле формы без переписывания архитектуры, можно воспользоваться недокументированным поведением замера производительности, который заставляет платформу принудительно открыть корректную временную копию исполняемого файла модуля.
Выполним следующие шаги:
Обычная очистка кэша базы данных через удаление и добавление базы в стартере 1С часто оказывается неэффективной, поскольку конфигуратор сохраняет кэш компиляции расширений глубоко в системных каталогах. Чтобы заставить платформу принудительно перестроить карту соответствия строк, воспользуемся следующими приемами.
Вариант А. Временная смена аннотации метода.
Если ваша серверная процедура расширения объявлена с аннотацией &После, измените ее временно на аннотацию &Вместо (или наоборот), после чего обновите конфигурацию базы данных клавишей F7. Затем верните исходную аннотацию и снова нажмите F7. Данное действие заставит компилятор платформы полностью пересчитать смещения строк кода.
Вариант Б. Фиктивные изменения в основной конфигурации.
Если основная конфигурация не находится на полной поддержке (разрешено изменение), откройте оригинальный модуль формы, в котором происходит сбой. Добавьте пустую строку или пробел в любом неиспользуемом месте оригинального модуля формы, сохраните изменения и обновите базу (F7). Это действие инвалидирует кэш компиляции всех связанных с этой формой расширений.
Иногда кэш расширений повреждается на уровне таблиц самой конфигурации базы данных (особенно актуально для файловых баз). В таком случае поможет полное пересоздание расширения:
.cfe)..cfe.Проверим настройки безопасности расширения и параметры запуска отладки, которые также могут блокировать корректную работу отладчика 1С на сервере:
/C РежимОтладки. Этот параметр отключает выполнение некоторых фоновых заданий БСП, переводя их исполнение в активный сеанс разработчика, что значительно упрощает отладку серверных модулей.Описанная аномалия со сбивающимся сопоставлением строк в расширениях форм была официально признана разработчиками 1С ошибкой платформы в линейках 8.3.14 и 8.3.15 (в частности, в релизе 8.3.15.1700). Если вы используете эти устаревшие версии платформы, наиболее радикальным и правильным решением будет обновление платформы до актуальных стабильных релизов (например, веток 8.3.21, 8.3.22 и выше), где ошибки сопоставления строк при динамическом обновлении и компиляции модулей расширений были полностью устранены.