Почему отладчик 1С не видит новый код или промахивается мимо строк в расширениях?

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

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

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

Решение 1. Вынос логики в общий модуль расширения

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

Рассмотрим самый надежный архитектурный обходной путь — вынос всей сложной серверной логики из модуля формы в отдельный общий модуль расширения:

  1. Создадим в нашем расширении новый общий модуль. Назовем его, например, Расш1_РаботаСФормамиСервер. В свойствах модуля обязательно взведем флаги «Сервер» и при необходимости «Вызов сервера».
  2. Перенесем всю тяжелую логику из серверной процедуры формы в этот общий модуль, сделав процедуру экспортной.
  3. В обработчике формы расширения оставим исключительно вызов нашей новой процедуры.

Посмотрим на пример того, как должен выглядеть код в модуле расширения управляемой формы:


&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Вместо написания кода здесь, передаем управление в общий модуль
    Расш1_РаботаСФормамиСервер.ОбработатьПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры

А теперь напишем соответствующий метод внутри созданного нами общего модуля расширения Расш1_РаботаСФормамиСервер:


Процедура ОбработатьПриСозданииНаСервере(Форма) Экспорт
    // Весь необходимый код пишется здесь
    ПеременнаяА = 5;
    Сообщить("Новый код успешно выполняется!");
    МассивСтрок = Новый Массив;
    // Отладчик внутри этой процедуры будет работать безупречно
КонецПроцедуры

Этот простой шаг не только навсегда решит проблему с «невидимым» кодом для отладчика, но и сделает архитектуру вашего расширения более чистой и поддерживаемой.

Решение 2. Лайфхак с использованием инструмента «Замер производительности»

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

Выполним следующие шаги:

  1. Запустим сеанс 1С:Предприятия в режиме отладки.
  2. В конфигураторе перейдем в меню Отладка и выберем пункт Замер производительности (активируем его).
  3. В запущенном режиме Предприятия выполним действие, приводящее к вызову проблемной серверной процедуры формы.
  4. Возвращаемся в конфигуратор и отключаем Замер производительности через то же меню или повторным нажатием на иконку.
  5. На экране появится таблица замера. Найдем в ней строчку с нашей проблемной процедурой и дважды кликнем по ней левой кнопкой мыши.
  6. Конфигуратор откроет специальное временное окно с исходным кодом, который физически исполняется в данный момент на сервере. Поставим точку останова (клавиша F9) прямо в этом открывшемся окне.
  7. Повторим действие в режиме Предприятия — отладчик гарантированно остановится на установленной точке и позволит построчно прошагать алгоритм.

Решение 3. Сброс кэша сопоставления строк (Line Mapping)

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

Вариант А. Временная смена аннотации метода.

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

Вариант Б. Фиктивные изменения в основной конфигурации.

Если основная конфигурация не находится на полной поддержке (разрешено изменение), откройте оригинальный модуль формы, в котором происходит сбой. Добавьте пустую строку или пробел в любом неиспользуемом месте оригинального модуля формы, сохраните изменения и обновите базу (F7). Это действие инвалидирует кэш компиляции всех связанных с этой формой расширений.

Решение 4. Полное пересоздание расширения в базе данных

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

  1. Откроем список расширений через меню Конфигурация -> Расширения конфигурации.
  2. Выделим проблемное расширение и в меню Действия выберем пункт Сохранить расширение в файл... (сохраняем файл с расширением .cfe).
  3. Удалим расширение из списка в конфигураторе.
  4. Выполним обновление конфигурации базы данных (нажатием клавиши F7 или через меню).
  5. Добавим новое пустое расширение в список, задав ему то же имя.
  6. Выберем для нового расширения пункт Загрузить конфигурацию из файла... и укажем сохраненный ранее файл .cfe.
  7. Снова обновим базу данных клавишей F7. Данная процедура полностью пересоздаст внутренние таблицы СУБД для этого расширения.

Решение 5. Свойства расширения и параметры запуска

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

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

Решение 6. Обновление платформы 1С:Предприятие

Описанная аномалия со сбивающимся сопоставлением строк в расширениях форм была официально признана разработчиками 1С ошибкой платформы в линейках 8.3.14 и 8.3.15 (в частности, в релизе 8.3.15.1700). Если вы используете эти устаревшие версии платформы, наиболее радикальным и правильным решением будет обновление платформы до актуальных стабильных релизов (например, веток 8.3.21, 8.3.22 и выше), где ошибки сопоставления строк при динамическом обновлении и компиляции модулей расширений были полностью устранены.

← На главную