В процессе разработки конфигураций и внешних обработок разработчики часто сталкиваются с ситуацией, когда сеанс остановлен на точке останова, параметры запроса или переменные проверены, но выполнять дальнейший код категорически нельзя. Типичный пример — процедура отправки файлов на рабочий FTP-сервер, отправка сообщений по электронной почте клиентам или проведение реальных документов. Если разработчик параллельно открыл в том же сеансе консоль запросов и написал сложный алгоритм, стандартное завершение сеанса приведет к потере несохраненных данных.
Разберем особенности работы отладчика платформы 1С, выясним, почему стандартные команды конфигуратора могут нанести вред, и подробно рассмотрим практические способы безопасного прерывания алгоритма «на лету» без закрытия рабочего окна программы.
Проанализируем сначала типовые команды платформы «1С:Предприятие 8» и поймем, почему они не подходят для решения данной задачи:
КонецПроцедуры или принудительно выйти из текущего контекста штатной кнопкой.Рассмотрим самый быстрый и эффективный прием, когда точка останова уже сработала, а в самом коде заранее не было предусмотрено никаких вспомогательных условий. Мы можем спровоцировать контролируемую ошибку исполнения в отлаживаемом коде.
Разберем по шагам, как это сделать:
FTPСоединение, Сервер или СписокФайлов.
FTPСоединение = Неопределено
или для строковой переменной адреса:
ИмяСервера = ""
FTPСоединение.Записать(...)), платформа столкнется с попыткой обращения к методу неинициализированного объекта и выбросит исключение времени выполнения.Если алгоритм интеграции или пакетной обработки пишется с нуля, рекомендуется заранее предусмотреть в нем возможность отмены опасных операций. Посмотрим на пример организации такой логики с помощью булевой переменной:
ВыполнятьВыгрузку = Истина;
// Точка останова
Если ВыполнятьВыгрузку Тогда
FTPСоединение = Новый FTPСоединение(АдресСервера, Порт, Логин, Пароль);
FTPСоединение.Записать(ПутьКФайлу, КаталогНаFTP);
КонецЕсли;
Рассмотрим, как управлять данным кодом в отладчике:
ВыполнятьВыгрузку = Ложь
Если код выполняет длительную выгрузку или расчет в цикле, профессиональным стандартом разработки на платформе 1С является внедрение метода ОбработкаПрерыванияПользователя().
Посмотрим на пример правильного оформления цикла обработки данных:
Для Каждого Файл Из МассивФайлов Цикл
ОбработкаПрерыванияПользователя();
// Алгоритм передачи файла
FTPСоединение.Записать(Файл.ПолноеИмя, Файл.Имя);
КонецЦикла;
Разберем, как это работает на практике. Когда в коде присутствует данный метод, пользователь или разработчик может в любой момент нажать комбинацию клавиш Ctrl+Break (или Ctrl+Pause). Платформа перехватывает сигнал прерывания, мгновенно останавливает выполнение цикла и генерирует исключение, возвращая управление в главное окно программы без ее аварийного закрытия.
Если отлаживаемый код выполняется на стороне сервера (в модуле с директивой &НаСервере или общем серверном модуле) в клиент-серверной информационной базе, существует административный способ остановки серверного потока.
Разберем действия системного администратора или разработчика по шагам:
rac.Важно: не следует выбирать пункт «Удалить сеанс», иначе сеанс будет закрыт целиком. Команда «Прервать текущий вызов» завершает только текущее активное серверное обращение. Клиентская часть получит ошибку вызова сервера, обработка прервется, а само клиентское приложение и открытые формы останутся активными.
В экстренной ситуации, когда точка останова находится непосредственно перед методом Новый FTPСоединение(...) или отправкой HTTP-запроса, а переменные изменить невозможно, можно заблокировать сетевое соединение на уровне операционной системы.
Для предотвращения подобных ситуаций в будущем проанализируем основные правила безопасной разработки: