Во время отладки или повседневной работы в 1С периодически возникает ситуация, когда запущенная обработка или тяжелый отчет начинают выполняться слишком долго. Классический способ остановить выполнение в платформе 1С:Предприятие — нажать комбинацию клавиш Ctrl + Pause/Break. Однако на большинстве современных ноутбуков физическая клавиша Pause/Break попросту отсутствует. Выясним причину этой проблемы, проанализируем нюансы работы платформенных механизмов и рассмотрим все надежные способы решения задачи.
Разберем в первую очередь встроенные возможности вашего устройства. Производители компактных клавиатур не отказываются от скан-кодов Pause и Break полностью, а переносят их в скрытые комбинации с модификатором Fn. Если на клавиатуре нет подписанной кнопки Pause/Break, попробуем следующие системные сочетания:
Если ни одно из аппаратных сочетаний производителя не подошло, рассмотрим программные методы и особенности самого кода 1С.
Проанализируем программную сторону вопроса. Даже если нажать нужные клавиши, платформа 1С не остановит алгоритм произвольно в любой строке. Прерывание работает только тогда, когда разработчик явно предусмотрел такую возможность в теле длительного цикла.
Для перехвата сигнала от клавиатуры используется процедура глобального контекста ОбработкаПрерыванияПользователя(). Вызов этой процедуры проверяет буфер клавиатуры на наличие нажатия Ctrl + Break. Если сигнал был зафиксирован, платформа прерывает выполнение модуля и вызывает системное исключение. Посмотрим на типовой пример реализации внутри цикла:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверяем нажатие комбинации клавиш прерывания
ОбработкаПрерыванияПользователя();
// Длительные действия с объектом
ОбработатьЭлемент(Выборка.Ссылка);
КонецЦикла;
Разберем важные особенности и скрытые ограничения этого метода, о которых важно знать:
ОбработкаПрерыванияПользователя() нельзя оборачивать в блок Попытка ... Исключение с пустым обработчиком. Если ошибка внутри блока подавляется, цикл просто продолжит свое выполнение со следующей итерации.Если аппаратных кнопок нет, а окно 1С уже выполняет клиентский цикл с проверкой прерывания, пошлем сигнал эмуляцией через скрипт Windows Script Host. Создадим текстовый файл с расширением .vbs и следующим содержимым:
Set Shell = WScript.CreateObject("WScript.Shell")
MsgBox "После нажатия ОК активируйте окно 1С в течение 3 секунд"
WScript.Sleep 3000
Shell.SendKeys "^{Break}"
Запустим скрипт двойным кликом, нажмем кнопку в появившемся диалоге, переключимся на окно зависшей обработки и подождем 3 секунды. Скрипт отправит сочетание Ctrl + Break в активное окно приложения.
Если заранее известно, что обработка будет запускаться на устройствах без выделенных клавиш, реализуем альтернативные программные триггеры остановки.
Способ с проверкой контрольного файла: перед запуском алгоритма создаем на локальном диске пустой файл-маркер. В цикле проверяем его физическое наличие. Чтобы прервать алгоритм, достаточно удалить этот файл через Проводник Windows:
ПутьКФайлуФлага = "C:\temp\stop_flag.txt";
ФайлФлага = Новый Файл(ПутьКФайлуФлага);
Пока Выборка.Следующий() Цикл
Если НЕ ФайлФлага.Существует() Тогда
Прервать; // Пользователь удалил файл для экстренной остановки
КонецЕсли;
// Основные действия алгоритма
КонецЦикла;
Если приходится регулярно запускать длительные обработки на ноутбуке, настроим постоянное переназначение редко используемой клавиши (например, Scroll Lock, правый Ctrl или Insert) на скан-код Pause/Break. Сделать это можно через бесплатные утилиты переназначения клавиатуры (такие как PowerToys Keyboard Manager) либо напрямую через системный реестр Windows в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout с помощью параметра Scancode Map.
Проанализируем крайнюю меру — принудительное завершение. Если обработка не содержит точек прерывания, а интерфейс платформы полностью заблокирован, многие пользователи снимают задачу 1Cv8.exe через Диспетчер задач Windows. Поступать так крайне нежелательно, особенно при работе с файловыми базами или во время активных транзакций записи, так как это чревато повреждением таблиц БД и «зависшими» монопольными блокировками.
В клиент-серверном варианте работы корректным решением является открытие Консоли администрирования кластера серверов 1С с правами администратора. Найдем проблемную информационную базу, перейдем в список сеансов и удалим зависший сеанс пользователя. Сервер корректно откатит открытые транзакции СУБД и освободит заблокированные ресурсы.
В современных конфигурациях для платформы 1С правильным стандартом разработки длительных операций является отказ от блокирующих циклов на клиенте. Длительный процесс запускается асинхронно через метод ФоновыеЗадания.Выполнить() на сервере. При этом интерфейс клиента остается полностью отзывчивым, на форму выводится полоса прогресса и кнопка «Отмена», по нажатию на которую вызывается метод Отменить() фонового задания, корректно и без аварийных сбоев останавливающий работу.