При работе с крупными типовыми решениями, такими как 1С:Комплексная автоматизация 2.4 или 1С:ERP, разработчики часто сталкиваются с ситуацией, когда стандартные методы отладки не дают результата. Вы ставите точку останова в модуле общей команды или формы, нажимаете кнопку в интерфейсе, но программа «пролетает» мимо, не останавливаясь. В этой статье мы подробно разберем, как найти нужный фрагмент кода, почему отладчик может игнорировать ваши действия и как гарантированно изменить логику работы общей команды.
Для начала выясним, где физически располагается код, отвечающий за выполнение команды. В отличие от команд документа или справочника, общие команды вынесены в отдельную ветку метаданных. Проанализируем путь к ним:
Обычно в таких модулях располагается предопределенная процедура ОбработкаКоманды. Рассмотрим типичный пример кода, который встречается в конфигурациях на базе БСП:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// Запуск замера времени для оценки производительности (APDEX)
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина, "ОбщаяФорма.ДокументыПоДоговору");
// Открытие целевой формы с передачей параметров
ОткрытьФорму("ОбщаяФорма.ДокументыПоДоговору",
Новый Структура("Договор", ПараметрКоманды),
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Если вы нашли этот код, но точка останова на строке ОткрытьФорму не срабатывает, переходим к следующему этапу анализа.
Одной из самых частых причин «нерабочих» точек останова является отсутствие связи между предметом отладки (сеансом пользователя) и конфигуратором. Выясним основные причины:
1. Отладка на сервере. Если база работает в клиент-серверном варианте, выполнение кода может переходить с клиента на сервер (например, в процедурах ПриСозданииНаСервере или при вызове серверных функций модуля команды). Если на сервере 1С не включен режим отладки (параметр -debug), то точки останова в серверном коде будут игнорироваться. Рассмотрим необходимость включения отладки на стороне сервера приложений.
2. Протокол отладки. Начиная с версии платформы 8.3.14, 1С поддерживает два протокола: TCP/IP и HTTP. Проанализируем настройки: перейдите в Сервис — Настройки — Отладка. Если выбран протокол HTTP, убедитесь, что адрес отладчика указан верно и порт не блокируется брандмауэром. Часто переключение на старый добрый TCP/IP решает проблему внезапного «исчезновения» точек останова.
3. Список предметов отладки. Иногда автоматическое подключение не срабатывает. Зайдите в меню Отладка — Подключение. Убедитесь, что ваш сеанс (Тип «Тонкий клиент» или «Сеанс сервера») находится в списке подключенных. Если нет — выделите его в списке доступных и нажмите «Подключить».
Если визуальный поиск в конфигураторе не помогает, и вы не уверены, тот ли это модуль, воспользуемся проверенным инструментом — Замером производительности. Это отличный способ увидеть «карту» выполнения кода.
Разберем по шагам, как это сделать:
В открывшемся окне вы увидите список всех процедур и функций, которые были вызваны. Проанализируем колонку «Модуль». Это позволит вам точно определить, какая ОбщаяКоманда или какой ОбщийМодуль сработал в момент нажатия кнопки. Если в списке нет вашей процедуры ОбработкаКоманды, значит, система использует другой механизм (например, подключаемые команды БСП).
В современных системах (КА 2.4, ERP) многие функции выносятся в расширения. Проанализируем ситуацию: если общая команда была заимствована в расширение и там создан метод с аннотацией &Вместо, то код в основной конфигурации выполняться не будет.
Важные моменты при работе с расширениями:
Если вы уверены, что отладка включена, но точка все равно игнорируется, применим метод «Паузы». Рассмотрим этот алгоритм:
Если отладка в принципе доступна для этого сеанса, 1С прервет выполнение на первой же исполняемой строке кода. Это позволит вам по шагам (клавиша F11) проследить весь путь вызова — от ядра системы до модуля вашей команды.
Нельзя забывать и о «демоническом» (динамическом) обновлении. Если вы правили код модуля команды и обновляли конфигурацию базы данных динамически, возможна ситуация, когда сеанс пользователя продолжает исполнять старую версию скомпилированного кода, в которой просто нет вашей точки останова.
Рассмотрим решение: необходимо полностью завершить все сеансы пользователей и выполнить процедуру Обновить конфигурацию базы данных (F7) в монопольном режиме. Также крайне полезно очистить локальный кэш пользователя на рабочем месте, где производится отладка.
В 1С:Комплексная автоматизация 2.4 многие команды не вызываются напрямую. Они регистрируются в специальных модулях и вызываются через посредника — общие модули управления командами. Проанализируем ситуацию: если ваша команда является «подключаемой», то точка входа может находиться в общем модуле УправлениеКомандамиКлиент в процедуре ВыполнитьКоманду.
В этом случае платформа динамически определяет, какой модуль вызвать. Если вы столкнулись с такой архитектурой, ставьте точку останова в указанном общем модуле и отслеживайте значение переменной ИмяКоманды или ОписаниеКоманды. Это поможет вам выйти на истинный исполняемый модуль.
Используя комплексный подход — от настройки параметров сервера до замера производительности — мы всегда сможем найти «потерявшийся» код и успешно внести изменения в работу общих команд системы.