При организации автоматического обмена данными или выполнении ночных регламентных процедур часто возникает необходимость корректно завершить работу клиента 1С после выполнения задачи. Однако на практике разработчики сталкиваются с ситуацией, когда сеанс зависает, процесс остаётся в памяти или открытые модальные окна блокируют стандартное закрытие программы. Проанализируем основные способы автоматического завершения работы 1С и разберёмся, как обойти возникающие трудности.
Рассмотрим стандартный алгоритм завершения работы через обработку. Для этого подключается регулярный обработчик ожидания, который уменьшает счётчик времени и вызывает команду закрытия программы.
Важно обратить внимание на разницу между двумя функциями платформы:
Посмотрим на пример реализации таймера обратного отсчёта в форме обработки:
Перем Тайм;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ПодключитьОбработчикОжидания("Таймер", 1);
КонецПроцедуры
Процедура Таймер()
Тайм = Тайм - 1;
Если Тайм <= 0 Тогда
// Используем метод, который игнорирует открытые модальные окна
ПрекратитьРаботуСистемы();
КонецЕсли;
ЭлементыФормы.Надпись1.Заголовок = "1С будет закрыта через: " + Строка(Тайм) + " секунд";
КонецПроцедуры
Процедура ОсновныеДействияФормыОтменитьЗакрытие(Кнопка)
ОтключитьОбработчикОжидания("Таймер");
ЭлементыФормы.Надпись1.Заголовок = "";
КонецПроцедуры
Тайм = 18000; // Время ожидания в секундах
Часто обработку запускают из командной строки с помощью файла пакета (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С выполнил обмен, но не закрылся и висит в списке процессов, выясним возможные причины:
ПодключитьОбработчикОжидания) могут не отрабатывать. Настройте задачу так, чтобы она запускалась только под вошедшим пользователем (интерактивно)./DisableStartupMessages и /DisableStartupDialogs./RunModeOrdinaryApplication или /RunModeManagedApplication) соответствует типу приложения и самой формы обработки.Если сеанс зависает на глухо из-за сбоя драйвера или внешних компонент, можно воспользоваться вызовом утилиты ОС taskkill прямо из кода 1С с использованием COM-объекта WScript.Shell.
Разберём пример кода для экстренного закрытия процесса:
Процедура ЗавершитьПроцессПринудительно()
WshShell = Новый COMОбъект("WScript.Shell");
// Завершаем все процессы 1cv8.exe принудительно
WshShell.Run("taskkill /f /IM 1cv8.exe", 0, Истина);
КонецПроцедуры
Важно: Этот метод следует использовать с осторожностью, так как принудительное завершение процесса 1cv8.exe может привести к некэшированным данным или незавершенным транзакциям в файловых базах данных.
В клиент-серверном варианте после завершения работы графического клиента сеанс может некоторое время отображаться в консоли кластера как «спящий». Это штатное поведение платформы.
Чтобы сервер 1С сам своевременно удалял такие сеансы, настройте свойства информационной базы в Консоли администрирования кластера серверов:
После истечения указанного времени сервер 1С автоматически очистит неактивные сеансы из списка пользователей.