При работе с файловыми базами данных 1С программисты часто сталкиваются с архитектурным ограничением: регламентные задания выполняются в фоновом режиме (в отдельном процессе или контексте сеанса, выделенного под планировщик), и они не имеют прямого доступа к интерфейсу пользователя или клиентскому контексту других сеансов. Рассмотрим ситуацию, когда нам необходимо из регламентного задания инициировать какие-либо действия на стороне клиента, например, корректно завершить работу всех пользователей для проведения индексации или обновления конфигурации через пакетный запуск.
В этой статье мы разберем основные методики реализации такого взаимодействия, проанализируем стандартные механизмы и рассмотрим альтернативные способы, включая использование внешних инструментов.
Самый надежный и распространенный способ взаимодействия между «серверной» частью (регламентным заданием) и клиентским приложением — это механизм опроса. Поскольку регламентное задание не может «достучаться» до клиента напрямую, клиент должен сам периодически проверять, нет ли для него команд от системы.
Разберем реализацию этого метода по шагам:
ПриНачалеРаботыСистемы) мы подключаем обработчик ожидания.Рассмотрим пример кода для модуля управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
// Подключаем проверку команд от регламентного задания каждые 60 секунд
ПодключитьОбработчикОжидания("ПроверитьКомандуНаЗавершениеРаботы", 60);
КонецПроцедуры
Процедура ПроверитьКомандуНаЗавершениеРаботы() Экспорт
// Проверяем значение в регистре или константе
Если НужнаПерезагрузкаИлиЗакрытие() Тогда
// Выполняем действия, например, закрываем программу
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация разработана на базе БСП, то изобретать велосипед не нужно. Проанализируем возможности подсистемы «Завершение работы пользователей». В типовых решениях реализован мощный механизм блокировки соединений.
Когда регламентное задание устанавливает блокировку сеансов через программный интерфейс БСП, происходит следующее:
1. В каталоге базы данных создается файл блокировки 1Cv8.cdn.
2. Клиентские приложения 1С, работающие с этой базой, автоматически отслеживают появление этого файла на уровне платформы.
3. Система выводит пользователю предупреждение и через заданное время принудительно завершает работу сеанса.
Этот способ является наиболее «чистым», так как он учитывает открытые формы, несохраненные данные и позволяет администратору гибко управлять процессом выдворения пользователей перед регламентными операциями.
В файловом варианте базы данных регламентное задание и клиентские сессии работают в рамках одной файловой системы. Проанализируем ситуацию: постоянное обращение к базе данных из ОбработчикОжидания может создавать лишнюю нагрузку на таблицы, особенно если пользователей много. В этом случае эффективнее использовать обычный текстовый файл на диске.
Преимущества данного метода:
Файл.Существует() работает молниеносно.УдалитьФайлы() после завершения своей работы.Зачастую задача ставится так: закрыть 1С и запустить Конфигуратор для обновления или тестирования. Важно понимать, что регламентное задание само по себе не может закрыть сеанс, в котором оно запущено, и тут же открыть Конфигуратор, так как оно «умрет» вместе с родительским сеансом.
Для решения этой задачи проанализируем схему «цепочки»:
.bat или .cmd файл.DESIGNER /UpdateCfg).ЗапуститьПриложение().ЗавершитьРаботуСистемы().Пример содержания bat-файла для пакетного обновления:
timeout /t 30 /nobreak
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "D:\Bases\MyBase" /N "Admin" /P "Pass" /UpdateDBCfg /Out "D:\log.txt"
Выясним, как проверить, корректно ли отработало регламентное задание, если оно выполняется в другом потоке. Платформа 1С предоставляет объект ФоновоеЗадание, у которого есть свойство Состояние.
Рассмотрим код для мониторинга:
Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("ИмяМетода", "МойМодуль.МояПроцедура"));
Для Каждого Задание Из Задания Цикл
Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Сообщить("Задание успешно выполнено в: " + Задание.Конец);
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноСОшибкой Тогда
Сообщить("Ошибка выполнения: " + Задание.ИнформацияОбОшибке.Описание);
КонецЕсли;
КонецЦикла;
Это позволяет клиентскому приложению «понимать», когда фоновая операция завершена, и можно приступать к следующему этапу автоматизации.
Важный нюанс: В файловой базе данных вы не можете программно «отключить» другой активный сеанс так, как это делается на сервере 1С:Предприятия (через консоль кластера). В файловом режиме каждый сеанс — это отдельный процесс 1cv8.exe. Поэтому единственный гуманный способ завершения — это добровольный выход приложения по команде из обработчика ожидания или жесткое «убийство» процесса через операционную систему (например, через команду taskkill), что крайне не рекомендуется, так как может привести к повреждению индексов базы данных.
Для гарантированного и безопасного выполнения обслуживания базы в ночное время мы рекомендуем использовать комбинацию Метода 1 (флаг в базе) и Метода 4 (внешний скрипт для запуска конфигуратора). Это обеспечит чистое завершение всех пользовательских сессий и корректный старт административных процедур.