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

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

В процессе разработки конфигураций и внешних обработок разработчики часто сталкиваются с ситуацией, когда сеанс остановлен на точке останова, параметры запроса или переменные проверены, но выполнять дальнейший код категорически нельзя. Типичный пример — процедура отправки файлов на рабочий FTP-сервер, отправка сообщений по электронной почте клиентам или проведение реальных документов. Если разработчик параллельно открыл в том же сеансе консоль запросов и написал сложный алгоритм, стандартное завершение сеанса приведет к потере несохраненных данных.

Разберем особенности работы отладчика платформы 1С, выясним, почему стандартные команды конфигуратора могут нанести вред, и подробно рассмотрим практические способы безопасного прерывания алгоритма «на лету» без закрытия рабочего окна программы.

Особенности платформы и опасности штатных команд

Проанализируем сначала типовые команды платформы «1С:Предприятие 8» и поймем, почему они не подходят для решения данной задачи:

  1. Команда «Отладка — Завершить» (Shift+F5): полностью закрывает процесс клиентского приложения. Вместе с сеансом закроются все открытые окна, формы и консоли запросов. Если вы не сохранили запрос во внешний файл, он будет безвозвратно утерян.
  2. Команда «Отладка — Подключение — Отключить»: крайне опасное действие в подобных ситуациях. Отключение отладчика от сеанса не останавливает выполнение программы, а лишь отпускает поток исполнения. Процедура мгновенно продолжит работу на полной скорости, и нежелательная отправка файлов или запись данных произойдет в автоматическом режиме.
  3. Отсутствие команды перемещения указателя: в среде разработки 1С нет возможности перетащить указатель текущей строки исполнения на команду КонецПроцедуры или принудительно выйти из текущего контекста штатной кнопкой.

Способ 1. Искусственная провокация ошибки через вычисление выражений

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

Разберем по шагам, как это сделать:

  1. Находясь на точке останова в конфигураторе, откроем окно вычисления выражений с помощью комбинации клавиш Shift+F9 или перейдем на панель «Локальные переменные».
  2. Найдем переменную, которая задействована в последующих строках алгоритма. Это может быть объект соединения, путь к каталогу, массив файлов или имя сервера. Например, переменная FTPСоединение, Сервер или СписокФайлов.
  3. Принудительно изменим значение этой переменной на некорректное. В окне вычисления выражения введем присвоение заведомо ошибочного значения, например: FTPСоединение = Неопределено или для строковой переменной адреса: ИмяСервера = ""
  4. Нажмем клавишу F5 для продолжения выполнения.
  5. Как только управление перейдет к следующей строке вызова метода (например, FTPСоединение.Записать(...)), платформа столкнется с попыткой обращения к методу неинициализированного объекта и выбросит исключение времени выполнения.
  6. Стек выполнения немедленно свернется, на экран выведется системная ошибка, а клиентский сеанс «1С:Предприятия» продолжит работать. Окно консоли запросов останется открытым, и несохраненные данные не пропадут.

Способ 2. Управление выполнением через флаги в коде и отладчике

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


ВыполнятьВыгрузку = Истина;

// Точка останова
Если ВыполнятьВыгрузку Тогда
    FTPСоединение = Новый FTPСоединение(АдресСервера, Порт, Логин, Пароль);
    FTPСоединение.Записать(ПутьКФайлу, КаталогНаFTP);
КонецЕсли;

Рассмотрим, как управлять данным кодом в отладчике:

  1. Устанавливаем точку останова на строке проверки условия.
  2. При остановке нажимаем Shift+F9 и вычисляем выражение: ВыполнятьВыгрузку = Ложь
  3. Нажимаем клавишу продолжения отладки F5. Платформа пропускает блок отправки данных и штатно завершает работу процедуры без вызова сетевых методов.

Способ 3. Прерывание цикла с помощью ОбработкаПрерыванияПользователя

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

Посмотрим на пример правильного оформления цикла обработки данных:


Для Каждого Файл Из МассивФайлов Цикл
    ОбработкаПрерыванияПользователя();
    
    // Алгоритм передачи файла
    FTPСоединение.Записать(Файл.ПолноеИмя, Файл.Имя);
КонецЦикла;

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

Способ 4. Прерывание текущего вызова в консоли кластера серверов

Если отлаживаемый код выполняется на стороне сервера (в модуле с директивой &НаСервере или общем серверном модуле) в клиент-серверной информационной базе, существует административный способ остановки серверного потока.

Разберем действия системного администратора или разработчика по шагам:

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

Важно: не следует выбирать пункт «Удалить сеанс», иначе сеанс будет закрыт целиком. Команда «Прервать текущий вызов» завершает только текущее активное серверное обращение. Клиентская часть получит ошибку вызова сервера, обработка прервется, а само клиентское приложение и открытые формы останутся активными.

Способ 5. Блокировка сетевого подключения

В экстренной ситуации, когда точка останова находится непосредственно перед методом Новый FTPСоединение(...) или отправкой HTTP-запроса, а переменные изменить невозможно, можно заблокировать сетевое соединение на уровне операционной системы.

  1. Перед нажатием клавиши F5 временно отключаем сетевой адаптер или сетевой кабель.
  2. Продолжаем выполнение кода клавишей F5.
  3. Платформа не сможет связаться с сервером по таймауту или отсутствию маршрута и завершит процедуру стандартным исключением, сохранив окно сеанса.

Рекомендации по организации рабочего процесса

Для предотвращения подобных ситуаций в будущем проанализируем основные правила безопасной разработки:

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