К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как поставить паузу в 1С: рабочие способы и ограничения

Как поставить паузу в 1С: способы задержки выполнения кода, ожидание в обработчиках ожидания, паузы в фоновых заданиях и типичные ошибки разработчиков.

Пауза в 1С — это намеренная задержка выполнения кода: программа «засыпает» на заданное время, а затем продолжает работу. Такая задача возникает при ожидании ответа внешнего сервиса, при обходе ограничений API по частоте запросов, при ожидании завершения фонового задания или при последовательной отправке большого количества сообщений, чтобы не перегружать систему.

Главная сложность в том, что во встроенном языке 1С нет прямой команды вроде Sleep() из других языков. Платформа сознательно не даёт простого способа «заморозить» клиентский сеанс, потому что это блокирует интерфейс пользователя и ухудшает работу всей системы. Поэтому паузу реализуют обходными путями — и у каждого способа есть свои условия применения и ограничения.

Выбор подхода зависит от контекста: где выполняется код (клиент или сервер), нужно ли блокировать интерфейс, насколько точной должна быть задержка и какая у вас версия платформы и режим совместимости. Ниже разобраны основные варианты — от штатных механизмов до циклов ожидания и внешних средств.

Почему в 1С нет простой команды паузы

Архитектура 1С построена так, что клиентский сеанс не должен простаивать в ожидании. Если код «зависает» на минуту, пользователь видит неотвечающее окно, а сервер удерживает сеанс и лицензию. В файловом варианте блокируется и работа других пользователей с базой. Именно поэтому разработчики платформы не включили аналог Sleep() в стандартный язык.

Вместо блокирующей задержки платформа предлагает событийную модель: вы запускаете действие, откладываете проверку результата на заданный интервал и продолжаете работу. Это требует перестроить логику — вместо «подожди 10 секунд и проверь» пишется «через 10 секунд вызови проверку».

Пауза на клиенте через обработчик ожидания

Штатный способ отложенного выполнения в управляемых формах — метод ПодключитьОбработчикОжидания(). Он принимает имя процедуры формы, интервал в секундах и признак однократного вызова. Пока таймер не сработал, пользователь свободно работает с формой.

// Запускаем однократную паузу 5 секунд

ПодключитьОбработчикОжидания("ПродолжитьВыполнение", 5, Истина);

&НаКлиенте

Процедура ПродолжитьВыполнение()

// Код, который выполнится через 5 секунд

ПроверитьГотовностьДокумента();

КонецПроцедуры

Если третий параметр опустить или указать Ложь, процедура будет вызываться циклически с заданным интервалом — это удобно для периодической проверки статуса фонового задания. Когда проверка больше не нужна, таймер обязательно отключают методом ОтключитьОбработчикОжидания() с тем же именем процедуры.

Порядок действий для обработчика ожидания
  1. 1
    Создайте в модуле формы клиентскую процедуру, которая выполнится после паузы
  2. 2
    Вызовите ПодключитьОбработчикОжидания(ИмяПроцедуры, Интервал, Истина)
  3. 3
    Убедитесь, что процедура объявлена с директивой &НаКлиенте и без параметров
  4. 4
    Для циклических проверок добавьте ОтключитьОбработчикОжидания при получении результата
  5. 5
    Протестируйте: форма должна оставаться доступной во время паузы

Ограничения обработчика ожидания

Минимальный интервал зависит от версии платформы и обычно составляет около секунды или более — миллисекундную точность получить нельзя. Процедура должна находиться в модуле формы и быть клиентской: вызвать таким способом серверную процедуру напрямую не получится, только через клиентскую обёртку. Также таймер привязан к форме: при её закрытии ожидание прекращается.

Пауза на сервере и в фоновых заданиях

В серверном коде обработчик ожидания недоступен — там нет формы и таймера. Если задержка действительно нужна (например, между запросами к внешнему API с лимитом на частоту), применяют цикл ожидания с проверкой текущего времени:

// Пауза 5 секунд на сервере

НачалоОжидания = ТекущаяДатаСеанса();

Пока ТекущаяДатаСеанса() - НачалоОжидания < 5 Цикл

// Пустой цикл ожидания

КонецЦикла;

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

Альтернатива: ожидание через внешний HTTP-запрос

Распространённый приём — выполнить HTTP-запрос с установленным таймаутом к заведомо медленному или недоступному адресу. Пока соединение ждёт ответа, поток сервера фактически простаивает без нагрузки на процессор. Способ выглядит как обходной, но он мягче для сервера, чем пустой цикл. Учтите, что он создаёт сетевую активность и зависит от сетевых настроек, поэтому в регламентированных средах его могут заблокировать политики безопасности.

Пауза в длительных операциях через БСП

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

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

Сравнение способов паузы

Обработчик ожидания

Штатный способ для клиента. Не блокирует интерфейс, но работает только в формах и с точностью около секунды.

Цикл с проверкой времени

Универсален для сервера и фоновых заданий, но нагружает процессор и недопустим в пользовательском сеансе.

HTTP-запрос с таймаутом

Серверная пауза без нагрузки на процессор, но зависит от сети и может блокироваться политиками безопасности.

Длительные операции БСП

Правильная архитектура для долгих задач в конфигурациях на БСП; требует перестройки логики на фоновое выполнение.

Пауза в тонком клиенте и внешние средства

В старых решениях встречается пауза через COM-объект WScript.Shell или через компоненты, вызывающие системный Sleep. Такие приёмы работают только на Windows-клиенте, требуют прав на создание внешних объектов и блокируют клиентский поток целиком. В веб-клиенте и на Linux они недоступны в принципе.

Использовать внешние средства стоит только как временную меру в локальных обработках, где нет других пользователей. Для прикладных решений, которые будут работать у разных клиентов и в разных средах, такой код — источник ошибок и жалоб на зависания.

Типичные ошибки
01
Пустой цикл ожидания в пользовательском сеансе — интерфейс зависает, сеанс может быть разорван по таймауту
02
Использование ТекущаяДата() вместо ТекущаяДатаСеанса() на сервере — в некоторых режимах метод возвращает дату клиента и пауза считается неверно
03
Забытый ОтключитьОбработчикОжидания — процедура продолжает вызываться и дублирует операции
04
Пауза вместо ожидания события: вместо проверки готовности данных по таймеру надёжнее подписаться на фактическое завершение операции
05
Ожидание точности в миллисекундах — платформа такой точности не гарантирует ни в одном из способов

Как проверить, что пауза работает правильно

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

Контрольные точки

Как проверить результат

Длительность паузы
Норма

Фактическая задержка близка к заданной (плюс-минус секунда)

Тревожный признак

Пауза значительно длиннее или короче заданной

Отзывчивость формы
Норма

Во время паузы форма отвечает на клики и ввод

Тревожный признак

Окно не отвечает, курсор в режиме ожидания

Нагрузка на сервер
Норма

Загрузка процессора во время паузы минимальна

Тревожный признак

Рабочий процесс загружен на 100% одним ядром

Повторные вызовы
Норма

Процедура ожидания срабатывает ровно столько раз, сколько нужно

Тревожный признак

Процедура вызывается после получения результата или дублируется

Частые вопросы о паузах в 1С

Можно ли сделать паузу меньше одной секунды?

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

Как поставить паузу в обычном приложении (обычные формы)?

В обычных формах также доступен ПодключитьОбработчикОжидания() с аналогичным синтаксисом. Блокирующие циклы технически работают, но замораживают клиентское приложение целиком, поэтому применять их стоит только в серверных процедурах.

Как дождаться завершения фонового задания без паузы?

Правильный способ — не ждать, а проверять: сохраните уникальный идентификатор задания, подключите обработчик ожидания на клиенте и периодически вызывайте серверную функцию, которая по идентификатору находит задание через ФоновыеЗадания.НайтиПоУникальномуИдентификатору() и проверяет его состояние.

Почему пауза через цикл даёт разную длительность?

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

Есть ли пауза в языке запросов 1С?

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

Безопасно ли использовать паузу в регламентных заданиях?

Да, это самое подходящее место: пользовательского сеанса нет, интерфейс не страдает. Ограничьте общую длительность пауз, чтобы задание не выходило за отведённое окно выполнения и не пересекалось со следующим запуском по расписанию.

Итог

Что важно запомнить

Прямой команды паузы в 1С нет. На клиенте используйте обработчик ожидания, на сервере и в фоновых заданиях — цикл с проверкой времени или HTTP-ожидание. Никогда не блокируйте пользовательский сеанс длительной паузой: для долгих операций применяйте фоновое выполнение с периодической проверкой статуса.