Остановить, придержать, отложить: все способы приостановить процесс в 1С 8.3
Содержание
Поставить паузу в 1С можно четырьмя способами, и выбор зависит от того, что именно нужно остановить. Регламентное задание приостанавливают снятием флажка «Включено» в его карточке. Все задания базы сразу — флажком «Блокировка регламентных заданий включена» в свойствах базы в консоли кластера. Код в отладчике останавливают точкой останова (F9). Длинный цикл, который пользователь запустил сам, прерывают сочетанием Ctrl+Break.
Настоящей кнопки «Пауза», после которой процесс продолжится с того же места, в платформе нет. Есть отключение по расписанию, блокировка, отмена и останов в отладчике. Каждый из них по-разному обходится с данными, и это стоит знать заранее.
Что можно приостановить в 1С и чем это делается
Сначала определите, кто выполняет работу: сервер по расписанию, пользователь в форме или разработчик в Конфигураторе. От этого зависит инструмент.
| Что остановить | Инструмент | Можно продолжить с того же места? |
|---|---|---|
| Одно регламентное задание | Карточка задания, флажок «Включено» | Да, задание просто дождётся следующего запуска |
| Все регламентные задания базы | Консоль кластера или rac, блокировка заданий | Да, после снятия блокировки |
| Уже идущее фоновое задание | Команда отмены в списке фоновых заданий, завершение сеанса | Нет, транзакция откатывается |
| Обработка, запущенная пользователем | Ctrl+Break, кнопка «Отмена» в форме длительной операции | Нет, если обработка не умеет работать порциями |
| Код при отладке | Точка останова, «Остановка по ошибке» | Да, это и есть настоящая пауза |
| Задержка внутри кода | Обработчик ожидания, ожидание фонового задания | Да, по замыслу программиста |
Как приостановить регламентные и фоновые задания
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) список заданий открывается одинаково:
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания
На вкладке регламентных заданий видны все задания базы: обмены, загрузка курсов валют, обновление полнотекстового индекса, удаление помеченных объектов и другие.
Отключить одно задание
- Откройте задание двойным щелчком.
- Снимите флажок «Включено».
- Нажмите «Записать и закрыть».
Расписание при этом сохраняется. Когда флажок вернёте, задание стартует по тому же графику. Если нужно не выключить задание, а сдвинуть, откройте расписание в карточке и поменяйте время или интервал повтора.
💡 Удобный приём: вместо полного отключения тяжёлого задания перенесите его на ночь. Например, обновление полнотекстового индекса каждые 5 минут легко заменить ежедневным запуском в 03:00.
Отменить задание, которое уже выполняется
На соседней вкладке со списком фоновых заданий видны активные процессы со статусом и временем начала. Выделите строку и найдите в командной панели команду отмены.
Что происходит при отмене:
- 🔄 платформа посылает заданию сигнал завершиться;
- ⏪ незавершённая транзакция откатывается целиком;
- 🧾 всё, что было записано в отдельных уже закрытых транзакциях, остаётся в базе.
Последний пункт важен для обменов и загрузок. Если задание пишет данные порциями, после отмены часть документов окажется загружена, а часть нет. Перед повторным запуском проверьте журнал регистрации за этот период.
Отмена срабатывает не мгновенно. Если задание висит на долгом запросе к СУБД или ждёт ответа внешнего сервиса, оно завершится только после возврата управления. В таком случае поможет завершение сеанса в консоли кластера (раздел ниже).
Как прервать обработку данных и массовую операцию
С обработками, которые пользователь запускает сам, история другая. Групповое перепроведение, массовое изменение реквизитов, загрузка из файла, закрытие месяца выполняются либо прямо в сеансе пользователя, либо в фоновом задании с окном ожидания.
Обработка выполняется в фоне с окном ожидания
Современные типовые конфигурации запускают тяжёлые операции как длительные: появляется окно с индикатором и кнопкой отмены. Нажатие отменяет фоновое задание, транзакция текущей порции откатывается.
Обработка выполняется в цикле на клиенте или сервере
Если окна ожидания нет и программа «замерла», нажмите Ctrl+Break. Сработает, только если разработчик поставил в цикл вызов ОбработкаПрерыванияПользователя(). Платформа спросит, прервать ли выполнение. Типовые и большинство внешних обработок этот вызов содержат.
Не сработало — остаётся завершить сеанс. В клиент-серверной базе это делает администратор в консоли кластера. В файловой — закрытие процесса 1cv8c.exe через диспетчер задач.
Снятие процесса в момент записи в файловую базу может повредить файл 1Cv8.1CD. Сначала подождите несколько минут, затем сделайте копию каталога базы и только потом снимайте процесс. После аварийного завершения проверьте базу через «Тестирование и исправление» в Конфигураторе.
Как сделать массовую операцию «с паузами»
Если операцию нужно растянуть, чтобы не мешать пользователям днём:
- Разбейте её по периодам: перепроводите документы по месяцу, а не за год.
- Для каждой порции запускайте обработку отдельно и проверяйте результат.
- Обмены переведите с расписания на ручной запуск в настройках синхронизации (
Администрирование → Синхронизация данных) и запускайте их в окно, когда нагрузка мала.
Такой подход и даёт рабочую «паузу»: остановились на марте, вечером продолжили с апреля.
Точки останова и пауза при отладке
Здесь пауза настоящая: выполнение замирает на строке, можно посмотреть значения переменных и продолжить.
Базовые действия в Конфигураторе
| Действие | Клавиша |
|---|---|
| Запустить отладку | F5 |
| Поставить или снять точку останова | F9 |
| Шаг с заходом в процедуру | F11 |
| Шаг без захода в процедуру | F10 |
| Продолжить до следующей точки | F5 |
| Вычислить выражение | Shift+F9 |
Точку можно поставить и двойным щелчком по полю слева от строки модуля. Красный кружок означает, что точка активна.
Приёмы, которые экономят время
- 🎯 Точка останова с условием. Нужна, когда цикл проходит 10 000 строк, а ошибка на одной. В свойствах точки задайте условие, например
Номенклатура.Код = "00-00001234". Отладчик остановится только на ней. - 🛑 Остановка по ошибке. В меню «Отладка» включите остановку по ошибке. Отладчик встанет ровно на строке, где возникло исключение, даже внутри
Попытка … Исключение. - ⏸️ Прервать выполнение. Если код ушёл в долгий цикл без точек, в меню «Отладка» есть команда прерывания. Отладчик остановится на текущей строке.
Отладка регламентных и фоновых заданий
Фоновые задания выполняются на сервере, и обычный запуск отладки их не ловит. Нужно:
- Включить отладку
на сервере. Для HTTP-отладки (платформа 8.3.7 и новее) в Конфигураторе в параметрах выбирается отладка по протоколу HTTP, а служба агента сервера запускается с ключом
-debug. - В Конфигураторе открыть подключение к предметам отладки и включить автоматическое подключение фоновых заданий.
- Поставить точку останова в модуле задания и дождаться его запуска или запустить вручную из списка регламентных заданий.
Ключ -debug в службе агента и остановка кода на точке влияют на всех, кто работает с этой базой на сервере. Отлаживайте задания на копии базы, а не в рабочей.
Остановка процессов через консоль кластера и rac
Для клиент-серверной базы консоль администрирования серверов 1С даёт два рычага.
Блокировка регламентных заданий базы
- Откройте консоль, разверните кластер и раздел информационных баз.
- Откройте свойства нужной базы.
- Установите флажок «Блокировка регламентных заданий включена».
- Нажмите «ОК».
Сервер перестаёт запускать новые задания этой базы. Уже идущие доработают до конца. В этом же окне есть блокировка начала сеансов с текстом сообщения, временем начала и окончания и кодом разрешения. Её включают на время обновления.
Тот же флажок ставится из командной строки утилитой rac. Работает она через службу ras, которую нужно запустить заранее:
rem список кластеров и баз
rac cluster list
rac infobase summary list --cluster=<uuid кластера>
rem запретить регламентные задания базы
rac infobase update --cluster=<uuid кластера> --infobase=<uuid базы> ^
--infobase-user=Администратор --infobase-pwd=*** --scheduled-jobs-deny=on
Чтобы снять запрет, выполните ту же команду со значением off. Если параметры вашей версии rac отличаются, проверьте их через rac help infobase.
💡 Команду удобно поставить в bat-файл перед ночным обновлением и вторую, со значением off, после него. Так задания не будут конфликтовать с обновлением конфигурации.
Завершение сеанса фонового задания
Фоновые задания видны в списке сеансов базы как отдельные сеансы с приложением «Фоновое задание». Выделите сеанс и удалите его, сеанс завершится, транзакция откатится.
Из командной строки: rac session list --cluster=<uuid> --infobase=<uuid> показывает сеансы, rac session terminate --cluster=<uuid> --session=<uuid> завершает выбранный.
Завершать сеансы и тем более перезапускать рабочие процессы днём нельзя без предупреждения: оборвутся несохранённые документы пользователей. Перезапуск рабочего процесса или службы агента завершает все сеансы на нём, поэтому его делают только вне рабочих часов.
Файловая и клиент-серверная база: что меняется
Механика паузы сильно зависит от варианта работы.
| Вопрос | Файловая база | Клиент-серверная база |
|---|---|---|
| Кто выполняет регламентные задания | Сеанс клиента, открытый пользователем | Рабочие процессы сервера, независимо от пользователей |
| Когда задания идут | Только пока открыт хотя бы один подходящий сеанс | Круглосуточно по расписанию |
| Как запретить все задания | Параметр запуска /AllowExecuteScheduledJobs -Off | Блокировка в свойствах базы или rac |
| Как остановить зависший процесс | Закрыть процесс клиента | Завершить сеанс в консоли кластера |
Особенности файлового варианта
В файловой базе задания выполняет один из клиентских сеансов. Если пользователь закрыл 1С, обмен по расписанию тоже «встал на паузу» сам собой. Это частая причина вопроса «почему обмен не прошёл ночью».
Чтобы конкретный сеанс не брал задания на себя, добавьте в строку запуска ярлыка:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Base\Buh" /AllowExecuteScheduledJobs -Off
Обратная задача: выделить один компьютер под задания. Тогда на нём запускают сеанс с параметром /AllowExecuteScheduledJobs -Force и не закрывают его, а у остальных отключают выполнение.
Как сделать паузу в коде 1С
Оператора «подождать N секунд» во встроенном языке нет. Решение зависит от того, где выполняется код.
На клиенте: обработчик ожидания
Правильный способ — не блокировать интерфейс, а отложить вызов процедуры:
&НаКлиенте
Процедура ЗапуститьПроверку(Команда)
// вызвать ПроверитьСтатус через 5 секунд, однократно
ПодключитьОбработчикОжидания("ПроверитьСтатус", 5, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСтатус()
Сообщить("Прошло 5 секунд, проверяем статус");
КонецПроцедуры
Третий параметр Истина означает однократный вызов. Без него процедура будет вызываться каждые 5 секунд, пока не выполните ОтключитьОбработчикОжидания("ПроверитьСтатус"). Процедура-обработчик должна быть в модуле формы или в клиентском общем модуле без параметров.
На сервере в фоновом задании: ожидание с таймаутом
Начиная с платформы 8.3.13 у объекта фонового задания есть метод ОжидатьЗавершенияВыполнения(Таймаут). Известный приём: фоновое задание ждёт завершения самого себя, и вызов возвращается по таймауту. Сервер при этом не загружается.
Процедура Пауза(Секунд) Экспорт
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
ФоновоеЗадание = ТекущийСеанс.ПолучитьФоновоеЗадание();
Если ФоновоеЗадание <> Неопределено Тогда
Попытка
ФоновоеЗадание.ОжидатьЗавершенияВыполнения(Секунд);
Исключение
// таймаут истёк, это и есть пауза
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Работает только внутри фонового или регламентного задания: в обычном серверном вызове из формы ПолучитьФоновоеЗадание() вернёт Неопределено, и паузы не будет.
Чего делать не надо
- 🔥 Пустой цикл с проверкой
ТекущаяУниверсальнаяДатаВМиллисекундах(). Он ждёт, но грузит ядро процессора на 100% всё время ожидания. - ⛔ Пауза в серверном вызове из формы. Пользователь видит зависшее окно, а при долгом ожидании клиент может разорвать соединение.
- 🔒 Пауза внутри транзакции. Пока код ждёт, установленные блокировки держатся, и другие пользователи получают ошибки конфликта блокировок.
Задержку между повторами внешнего запроса (например, к API маркетплейса) делайте в фоновом задании, вне транзакции и с ограничением числа попыток.