Как из регламентного задания запустить код на клиенте в файловой базе 1С

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

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

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

Метод 1: Использование обработчика ожидания (Стандартный подход)

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

Разберем реализацию этого метода по шагам:

  1. Создание флага в базе данных: Регламентное задание при необходимости выполнить действие на клиенте записывает значение в определенное место. Это может быть константа, запись в регистре сведений или специальный файл на диске.
  2. Подключение обработчика на клиенте: В модуле управляемого приложения (в процедуре ПриНачалеРаботыСистемы) мы подключаем обработчик ожидания.
  3. Выполнение действия: Клиентская процедура раз в некоторое время (например, раз в минуту) считывает флаг и, если он установлен, выполняет требуемый код.

Рассмотрим пример кода для модуля управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    // Подключаем проверку команд от регламентного задания каждые 60 секунд
    ПодключитьОбработчикОжидания("ПроверитьКомандуНаЗавершениеРаботы", 60);
КонецПроцедуры

Процедура ПроверитьКомандуНаЗавершениеРаботы() Экспорт
    // Проверяем значение в регистре или константе
    Если НужнаПерезагрузкаИлиЗакрытие() Тогда
        // Выполняем действия, например, закрываем программу
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

Метод 2: Механизмы БСП (Библиотека стандартных подсистем)

Если ваша конфигурация разработана на базе БСП, то изобретать велосипед не нужно. Проанализируем возможности подсистемы «Завершение работы пользователей». В типовых решениях реализован мощный механизм блокировки соединений.

Когда регламентное задание устанавливает блокировку сеансов через программный интерфейс БСП, происходит следующее:

1. В каталоге базы данных создается файл блокировки 1Cv8.cdn.

2. Клиентские приложения 1С, работающие с этой базой, автоматически отслеживают появление этого файла на уровне платформы.

3. Система выводит пользователю предупреждение и через заданное время принудительно завершает работу сеанса.

Этот способ является наиболее «чистым», так как он учитывает открытые формы, несохраненные данные и позволяет администратору гибко управлять процессом выдворения пользователей перед регламентными операциями.

Метод 3: Использование внешнего файл-флага

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

Преимущества данного метода:

Метод 4: Пакетный запуск и системный планировщик

Зачастую задача ставится так: закрыть 1С и запустить Конфигуратор для обновления или тестирования. Важно понимать, что регламентное задание само по себе не может закрыть сеанс, в котором оно запущено, и тут же открыть Конфигуратор, так как оно «умрет» вместе с родительским сеансом.

Для решения этой задачи проанализируем схему «цепочки»:

  1. Регламентное задание создает в операционной системе временный .bat или .cmd файл.
  2. В этом файле прописываются команды: подождать 30 секунд (пока 1С закроется) и запустить 1С с параметрами командной строки (например, DESIGNER /UpdateCfg).
  3. Регламентное задание запускает этот бат-файл через ЗапуститьПриложение().
  4. Сразу после этого регламентное задание вызывает ЗавершитьРаботуСистемы().

Пример содержания 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"

Метод 5: Мониторинг состояния через фоновые задания

Выясним, как проверить, корректно ли отработало регламентное задание, если оно выполняется в другом потоке. Платформа 1С предоставляет объект ФоновоеЗадание, у которого есть свойство Состояние.

Рассмотрим код для мониторинга:


Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("ИмяМетода", "МойМодуль.МояПроцедура"));
Для Каждого Задание Из Задания Цикл
    Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
        Сообщить("Задание успешно выполнено в: " + Задание.Конец);
    ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноСОшибкой Тогда
        Сообщить("Ошибка выполнения: " + Задание.ИнформацияОбОшибке.Описание);
    КонецЕсли;
КонецЦикла;

Это позволяет клиентскому приложению «понимать», когда фоновая операция завершена, и можно приступать к следующему этапу автоматизации.

Особенности завершения сеансов в файловом режиме

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

Для гарантированного и безопасного выполнения обслуживания базы в ночное время мы рекомендуем использовать комбинацию Метода 1 (флаг в базе) и Метода 4 (внешний скрипт для запуска конфигуратора). Это обеспечит чистое завершение всех пользовательских сессий и корректный старт административных процедур.

← На главную