Как автоматически закрывать 1С по расписанию и таймеру

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При организации автоматического обмена данными или выполнении ночных регламентных процедур часто возникает необходимость корректно завершить работу клиента 1С после выполнения задачи. Однако на практике разработчики сталкиваются с ситуацией, когда сеанс зависает, процесс остаётся в памяти или открытые модальные окна блокируют стандартное закрытие программы. Проанализируем основные способы автоматического завершения работы 1С и разберёмся, как обойти возникающие трудности.

Способ 1. Использование обработчика ожидания и метода ПрекратитьРаботуСистемы

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

Важно обратить внимание на разницу между двумя функциями платформы:

  1. ЗавершитьРаботуСистемы() — запрашивает подтверждение закрытия у пользователя и вызываемых модулей. Если в этот момент открыто модальное окно или диалог сохранения данных, сеанс не закроется и останется висеть.
  2. ПрекратитьРаботуСистемы() — жестко прекращает работу текущего сеанса, игнорируя открытые модальные окна и вопросы системы. Это идеальный вариант для фоновых и автозапускаемых обработок.

Посмотрим на пример реализации таймера обратного отсчёта в форме обработки:


Перем Тайм;

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    ПодключитьОбработчикОжидания("Таймер", 1);
КонецПроцедуры

Процедура Таймер()
    Тайм = Тайм - 1;
    Если Тайм <= 0 Тогда
        // Используем метод, который игнорирует открытые модальные окна
        ПрекратитьРаботуСистемы();
    КонецЕсли;
    ЭлементыФормы.Надпись1.Заголовок = "1С будет закрыта через: " + Строка(Тайм) + " секунд";
КонецПроцедуры

Процедура ОсновныеДействияФормыОтменитьЗакрытие(Кнопка)
    ОтключитьОбработчикОжидания("Таймер");
    ЭлементыФормы.Надпись1.Заголовок = "";
КонецПроцедуры

Тайм = 18000; // Время ожидания в секундах

Способ 2. Запуск через BAT-файл и особенности Планировщика заданий

Часто обработку запускают из командной строки с помощью файла пакета (bat) и Планировщика заданий Windows. Разберём пример строки запуска:


@Echo off
chcp 1251 >nul
"C:\Program Files (x86)\1cv8\8.3.9.1818\bin\1cv8.exe" ENTERPRISE /F"D:\Base\БП\" /N"Администратор" /P"0987" /RunModeOrdinaryApplication /Execute"D:\Обмен\Close1c.epf"

Если при таком запуске сеанс 1С выполнил обмен, но не закрылся и висит в списке процессов, выясним возможные причины:

  1. Изоляция нулевой сессии (Session 0 Isolation): Если задача в Планировщике Windows настроена с параметром "Выполнять для всех пользователей" (без привязки к активному интерактивному входу), ОС запускает процесс в фоновом режиме. В этом режиме интерфейс и таймеры формы (ПодключитьОбработчикОжидания) могут не отрабатывать. Настройте задачу так, чтобы она запускалась только под вошедшим пользователем (интерактивно).
  2. Ключи запуска: Для предотвращения появления диалоговых окон платформы при старте используйте ключи /DisableStartupMessages и /DisableStartupDialogs.
  3. Режим запуска: Убедитесь, что параметр режима запуска (/RunModeOrdinaryApplication или /RunModeManagedApplication) соответствует типу приложения и самой формы обработки.

Способ 3. Принудительное завершение процесса через ОС

Если сеанс зависает на глухо из-за сбоя драйвера или внешних компонент, можно воспользоваться вызовом утилиты ОС taskkill прямо из кода 1С с использованием COM-объекта WScript.Shell.

Разберём пример кода для экстренного закрытия процесса:


Процедура ЗавершитьПроцессПринудительно()
    WshShell = Новый COMОбъект("WScript.Shell");
    // Завершаем все процессы 1cv8.exe принудительно
    WshShell.Run("taskkill /f /IM 1cv8.exe", 0, Истина);
КонецПроцедуры

Важно: Этот метод следует использовать с осторожностью, так как принудительное завершение процесса 1cv8.exe может привести к некэшированным данным или незавершенным транзакциям в файловых базах данных.

Способ 4. Настройка параметров кластера серверов 1С

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

Чтобы сервер 1С сам своевременно удалял такие сеансы, настройте свойства информационной базы в Консоли администрирования кластера серверов:

  1. Установите значение параметра "Время уснувшего сеанса" (например, 1200 секунд).
  2. Настройте параметр "Время поиска оставленных сеансов".

После истечения указанного времени сервер 1С автоматически очистит неактивные сеансы из списка пользователей.

← На главную