Как программно определить, что код 1С выполняется под отладчиком?

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

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

Метод 1: Анализ параметра запуска с помощью БСП

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


Функция РежимОтладки() Экспорт
    ПараметрЗапускаПриложения = СтандартныеПодсистемыСервер.ПараметрыКлиентаНаСервере(Ложь).Получить("ПараметрЗапуска");
    Возврат СтрНайти(ПараметрЗапускаПриложения, "РежимОтладки") > 0;
КонецФункции

Как видно из кода, эта функция не проверяет, подключен ли отладчик в данный момент. Она лишь анализирует, был ли клиент запущен с параметром /РежимОтладки. Этот параметр обычно используется разработчиками для прикладной логики. Например, если он установлен, то длительные операции (как формирование отчетов), которые в обычном режиме выполняются в фоновом задании, будут выполняться в том же сеансе (синхронно). Это сильно упрощает пошаговую отладку.

Вывод: Этот метод подходит, если вам нужно изменить поведение кода для упрощения его отладки, но он не поможет определить, что кто-то прямо сейчас проходит по вашему коду с помощью F10/F11.

Метод 2: Замер времени выполнения

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

Рассмотрим простой пример:

  1. Замеряем текущее время с высокой точностью.
  2. Выполняем небольшой, но не мгновенный блок кода (например, цикл на несколько тысяч итераций).
  3. Снова замеряем время и вычисляем разницу.
  4. Если прошедшее время превышает некий порог (например, полсекунды), с высокой вероятностью код выполняется под пошаговой отладкой.

Пример кода:


&НаКлиенте
Процедура ПроверитьОтладкуПоВремени()

    НачалоПроверки = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    // Небольшой "бесполезный" цикл
    Для сч = 1 По 50000 Цикл
        // какая-то быстрая операция
        а = Sin(сч);
    КонецЦикла;
    
    КонецПроверки = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    Длительность = КонецПроверки - НачалоПроверки;
    
    // Порог в 500 миллисекунд. В обычном режиме цикл выполнится гораздо быстрее.
    Если Длительность > 500 Тогда
        Сообщить("Похоже, мы под отладчиком!");
    Иначе
        Сообщить("Работа в обычном режиме.");
    КонецЕсли;

КонецПроцедуры

Плюсы: Простота реализации.

Минусы: Ненадежность. Метод сработает только если отладчик "завис" именно на этом участке кода. Если точка останова стоит в другом месте, проверка ничего не покажет. Также метод может дать ложное срабатывание на очень медленных компьютерах или при высокой загрузке системы.

Метод 3: Продвинутые и низкоуровневые способы

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

Использование внешних компонент (ВК)

Это самый надежный способ. Можно разработать внешнюю компоненту (например, на C++ или C#), которая будет использовать функции операционной системы для проверки наличия отладчика. Например, в Windows API для этого есть функция IsDebuggerPresent(). Вызов такой функции из 1С через ВК даст однозначный ответ, подключен ли к процессу 1С системный отладчик.

Проверка серверного флага -debug

Для выполнения отладки на сервере 1С служба агента сервера должна быть запущена с ключом -debug. Проверить его наличие программно из кода 1С практически невозможно стандартными средствами. Однако администратор может проверить это через параметры запуска службы ragent.exe в диспетчере задач (Windows) или через командную строку (Linux). Разработчик же может косвенно это понять, попытавшись установить точку останова в серверном модуле: если она сработала — отладка на сервере разрешена.

Недокументированные возможности

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

В заключение, не существует единой встроенной функции 1С, которая бы на 100% точно отвечала на вопрос "подключен ли отладчик?". Выбор метода зависит от вашей конечной цели: для адаптации логики подойдет анализ параметров запуска, а для серьезной защиты от анализа придется прибегать к внешним компонентам.

← На главную