Разработка и Конфигурация · 12 мин
Как сделать паузу в 1С 8: способы задержки выполнения кода
Разбираем, как сделать паузу в 1С 8: запрос с задержкой, обработчики ожидания, WScript.Sleep, фоновые задания. Примеры кода, ограничения и типичные ошибки.
Во встроенном языке 1С:Предприятие 8 нет штатной функции паузы вроде Sleep() или Delay() — это осознанное решение платформы. Любая «заморозка» кода блокирует сеанс пользователя, а в клиент-серверном режиме может удерживать соединение с СУБД и мешать работе других пользователей. Поэтому задача «сделать паузу» решается обходными приёмами, и выбор приёма зависит от того, где выполняется код: на клиенте, на сервере, в фоновом задании или в регламентной операции.
Чаще всего пауза нужна в четырёх ситуациях: при обмене с внешними системами, когда оборудование или API не успевает отвечать; при повторных попытках выполнить операцию после ошибки; при ожидании завершения фонового процесса; при тестировании и отладке. Для каждого сценария есть свой корректный инструмент, и универсального «правильного» способа не существует.
Ниже разобраны рабочие варианты: от простого запроса с задержкой до асинхронных механизмов платформы. Для каждого указаны ограничения, риски и признаки того, что решение применено правильно.
Почему в 1С нет функции Sleep и что это меняет
Платформа 1С:Предприятие 8 изначально проектировалась для многопользовательской работы. Если бы разработчик мог в любой момент «усыпить» поток, один сеанс мог бы надолго удерживать транзакции, блокировки в базе данных и соединения с сервером 1С. В файловом режиме это привело бы к зависанию интерфейса пользователя, в клиент-серверном — к деградации работы всей информационной базы.
Поэтому вместо прямой паузы платформа предлагает событийную модель: код не ждёт, а сообщает системе «вызови меня через N секунд» и освобождает поток. Это принципиально другой подход, и переносить привычки из других языков (например, Sleep из VBA или time.sleep из Python) в 1С напрямую нельзя.
Пауза на клиенте через обработчики ожидания
Единственный «родной» способ организовать задержку в клиентском коде — обработчики ожидания. Они доступны в толстом и тонком клиенте, работают и в управляемых, и в обычных формах. Минимальный интервал — 0,1 секунды, на практике для повторяющихся вызовов разумно использовать значения от 1 секунды.
Типовой пример: нужно подождать 5 секунд и затем выполнить действие. Вместо «засыпания» подключается однократный обработчик:
// Запускаем отложенное действие
ПодключитьОбработчикОжидания("ВыполнитьПослеПаузы", 5, Истина);
// Процедура, которая будет вызвана через 5 секунд
&НаКлиенте
Процедура ВыполнитьПослеПаузы()
// Здесь код, который должен выполниться после паузы
ПоказатьОповещениеПользователя("Пауза завершена");
КонецПроцедуры
Третий параметр (Истина) означает однократный вызов: обработчик отключится автоматически после срабатывания. Если его не указать, процедура будет вызываться циклически, и её нужно отключать вручную через ОтключитьОбработчикОжидания, иначе она продолжит выполняться до закрытия формы или приложения.
- 1Создайте клиентскую процедуру с кодом, который должен выполниться после паузы
- 2Вызовите ПодключитьОбработчикОжидания с именем процедуры, интервалом в секундах и признаком однократности
- 3Убедитесь, что процедура доступна из контекста вызова (экспортная в модуле формы или общего клиентского модуля)
- 4Проверьте, что при повторном запуске старый обработчик отключён, чтобы не плодить вызовы
Пауза на сервере через запрос с задержкой
На сервере обработчики ожидания недоступны, и самый распространённый приём — выполнить запрос, который заведомо тратит время. Классический вариант использует соединение таблиц без условий, чтобы СУБД выполнила тяжёлую операцию:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| КурсыВалют.Период
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют,
| РегистрСведений.КурсыВалют КАК КурсыВалют2,
| РегистрСведений.КурсыВалют КАК КурсыВалют3";
Запрос.Выполнить();
Декартово произведение трёх копий большой таблицы заставляет сервер СУБД работать заметное время. Проблема очевидна: длительность паузы непредсказуема и зависит от объёма данных и мощности сервера. На маленькой базе запрос выполнится мгновенно, на большой — может «повиснуть» на минуты и создать нагрузку.
Более контролируемый вариант — цикл с проверкой текущего времени:
ВремяОкончания = ТекущаяДата() + 5; // пауза 5 секунд
Пока ТекущаяДата() < ВремяОкончания Цикл
// холостой цикл
КонецЦикла;
Такой цикл даёт точную длительность, но полностью загружает одно ядро процессора рабочего процесса сервера 1С. Допустим он только для коротких пауз (единицы секунд) в редко вызываемом коде — например, при повторной попытке подключения к оборудованию.
Пауза через WScript.Shell и внешние средства
Если код выполняется на компьютере с Windows (толстый клиент или сервер под Windows), можно задействовать объект Windows Script Host, у которого есть настоящий метод Sleep:
Shell = Новый COMОбъект("WScript.Shell");
Shell.Run("powershell -command ""Start-Sleep -Seconds 5""", 0, Истина);
Альтернатива без PowerShell — команда ping с заданным числом отправок, вызванная с ожиданием завершения. Оба способа являются внешними по отношению к платформе, поэтому требуют прав на запуск приложений и не работают на Linux-сервере без корректировки. В веб-клиенте и в безопасном режиме они недоступны вовсе.
Также существуют внешние компоненты, реализующие Sleep, но их подключение требует установки на каждое рабочее место или сервер. Такой путь оправдан, только если компонента уже используется в инфраструктуре для других задач.
Фоновые задания и асинхронный подход вместо паузы
Если пауза нужна для ожидания результата длительной операции, правильнее вообще отказаться от ожидания в пользу фоновых заданий. Платформа позволяет запустить выполнение процедуры в отдельном сеансе и затем проверять её состояние с клиента через тот же обработчик ожидания:
// На сервере: запуск фонового задания
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Обмен с внешней системой";
ДлительныеОперации.ВыполнитьВФоне("МойМодуль.ВыполнитьОбмен", ПараметрыПроцедуры, ПараметрыВыполнения);
В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) есть готовый механизм длительных операций: клиент получает оповещение о завершении, и никакие паузы не нужны в принципе. Пользователь продолжает работать, а результат подхватывается автоматически.
Этот подход — единственный корректный вариант, когда ожидание может занять минуты: загрузка больших файлов, обмен с сайтом, длительная обработка данных. Любая «заморозка» на такой срок в интерактивном сеансе воспринимается пользователем как зависание и часто завершается принудительным снятием задачи.
Сравнение способов паузы
Только клиент, не блокирует интерфейс. Подходит для отложенных действий и периодических проверок. Не работает на сервере и в фоновом задании.
Точная длительность, работает везде. Грузит процессор и блокирует сеанс — только для коротких пауз в редком коде.
Прост в реализации, но длительность непредсказуема и зависит от данных. Нагружает СУБД.
Настоящий Sleep, но только Windows, нужны права, не работает в безопасном режиме и веб-клиенте.
Правильная замена паузы для длительных операций. Требует перестройки логики на асинхронную.
Типичные сценарии и выбор решения
Повторная попытка после ошибки
При обмене с веб-сервисом или оборудованием типовая схема — несколько попыток с паузой между ними. На клиенте реализуйте это через обработчик ожидания со счётчиком попыток в реквизите формы. На сервере в фоновом задании допустим короткий холостой цикл на 1–3 секунды между вызовами.
Ожидание готовности файла или ответа оборудования
Не делайте фиксированную паузу «с запасом» — проверяйте условие в цикле с ограничением по времени: например, каждые 2 секунды проверять существование файла, но не дольше 60 секунд суммарно. Это и быстрее, и надёжнее, чем ждать «на глаз».
Пауза при тестировании и отладке
Для отладки проще всего поставить точку останова вместо программной паузы. Если нужно растянуть выполнение по времени (например, проверить поведение при тайм-ауте), используйте холостой цикл на тестовой базе — на рабочей базе такой код оставлять нельзя.
Как выбрать действие
Проверка результата и типичные ошибки
После внедрения паузы проверьте три вещи: интерфейс пользователя остаётся отзывчивым (если использовался обработчик ожидания), длительность задержки соответствует ожиданиям на реальной базе, а не только на тестовой, и при повторных вызовах не накапливаются «висящие» обработчики или фоновые задания.
Самые частые ошибки: использование неэкспортной процедуры в ПодключитьОбработчикОжидания (платформа не найдёт метод и выдаст ошибку), забытие отключить периодический обработчик при закрытии формы, пауза внутри транзакции записи документа и перенос кода с холостым циклом из разработки в продуктив.
Как проверить результат
Форма реагирует на действия во время ожидания
Форма не отвечает, курсор 'ожидание' дольше запланированного
Фактическая задержка близка к заданной на рабочей базе
На рабочей базе пауза сильно отличается от тестовой
Каждый запуск работает одинаково, обработчики не множатся
После нескольких запусков действие срабатывает несколько раз
В консоли кластера нет долгих вызовов и роста CPU от сеанса
Рабочий процесс занят холостым циклом, растёт время отклика базы
Частые вопросы о паузах в 1С 8
Есть ли в 1С 8 встроенная функция Sleep?
Нет, во встроенном языке платформы такой функции не существует ни в одной версии 8.x. Все способы паузы — обходные приёмы: обработчики ожидания на клиенте, циклы с проверкой времени, тяжёлые запросы или внешние средства операционной системы.
Работают ли обработчики ожидания на сервере или в фоновом задании?
Нет. ПодключитьОбработчикОжидания доступен только в клиентском контексте (тонкий и толстый клиент). В серверном коде и фоновых заданиях используйте короткий цикл с проверкой времени или перестройте логику так, чтобы ожидание вообще не требовалось.
Как сделать паузу меньше секунды?
Обработчик ожидания поддерживает интервал от 0,1 секунды — этого достаточно для большинства клиентских задач. На сервере субсекундные паузы практически недостижимы штатными средствами, так как ТекущаяДата возвращает время с точностью до секунды; для таких задач применяют внешние компоненты.
Почему пауза через цикл «подвешивает» программу?
Холостой цикл занимает поток выполнения полностью: в клиенте это блокирует обработку событий интерфейса, на сервере — занимает рабочий процесс. Платформа не прерывает выполнение кода до его завершения, поэтому длительные циклы воспринимаются как зависание.
Как правильно ждать завершения длительной операции?
Запустите операцию как фоновое задание (в типовых конфигурациях — через подсистему длительных операций БСП), а на клиенте подключите обработчик ожидания, который периодически проверяет статус задания. После завершения получите результат и отключите обработчик.
Можно ли делать паузу внутри транзакции?
Нет, это одна из самых опасных практик. Пока транзакция открыта, удерживаются блокировки данных, и пауза многократно увеличивает риск взаимоблокировок и тайм-аутов у других пользователей. Ожидание нужно выносить за пределы транзакции.
Что важно запомнить
Штатной функции паузы в 1С 8 нет. На клиенте используйте обработчики ожидания, на сервере — короткие циклы с проверкой времени, для длительных операций — фоновые задания вместо ожидания. Никогда не делайте паузу внутри транзакции и не оставляйте холостые циклы в рабочей базе.