Как выполнить регламентное задание на клиентской машине в 1С:Предприятии?

Программист 1С v8.3 (Обычные формы)
← К списку

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

Почему регламентные задания обычно выполняются на сервере?

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

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

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

Решение 1: Использование метода ПодключитьОбработчикОжидания()

Это один из наиболее распространенных и "родных" для 1С способов выполнения кода на клиенте с заданной периодичностью. Рассмотрим его подробнее.

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

Доступность: Этот механизм доступен во всех основных типах клиентов: в тонком, веб- и толстом клиенте.

Параметры метода: Метод принимает три основных параметра:

  1. Имя процедуры: Строковое имя процедуры или функции, которую необходимо вызывать.
  2. Интервал в секундах: Число, определяющее, через какой интервал времени (в секундах) будет вызываться обработчик.
  3. Флаг однократного выполнения: Булево значение. Если Истина, обработчик будет вызван только один раз. Если Ложь, обработчик будет вызываться повторно через заданный интервал, пока не будет отключен или пока не закроется форма, к которой он привязан.

Особенности:

Пример использования:

Допустим, нам нужно проверять что-то каждые 10 секунд. Мы можем разместить следующий код в модуле формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем обработчик ожидания при открытии формы
    // "МояПроцедураПроверки" будет вызываться каждые 10 секунд
    ПодключитьОбработчикОжидания("МояПроцедураПроверки", 10, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
    // Отключаем обработчик ожидания при закрытии формы
    ОтключитьОбработчикОжидания("МояПроцедураПроверки");
КонецПроцедуры

&НаКлиенте
Процедура МояПроцедураПроверки()
    // Здесь размещаем код, который должен выполняться на клиенте периодически
    Сообщить("Выполняется клиентская проверка в " + ТекущаяДата());
    // Например, можно проверить наличие нового файла в локальной папке
    // Или отправить данные на сервер, если они изменились
КонецПроцедуры

Решение 2: Использование Планировщика Windows

Если нам нужна независимость от открытых окон 1С и более мощное системное управление, мы можем использовать Планировщик задач Windows (Windows Task Scheduler). Этот подход позволяет запускать 1С:Предприятие с определенными параметрами по расписанию.

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

Применение: Этот метод часто используется для:

Пример командной строки для запуска 1С:

Мы можем создать внешнюю обработку с именем, например, "МояКлиентскаяЗадача.epf", которая содержит код для выполнения. Затем Планировщик Windows будет запускать 1С с параметрами, указывающими на эту обработку.


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE 
/F "C:\MyBases\MyMainBase" 
/N "ПользовательАвтозапуска" 
/P "ПарольПользователя" 
/Execute "C:\MyProcessings\МояКлиентскаяЗадача.epf" 
/C "ЗапускИзПланировщика"

В этой команде:

Особенности: При запуске 1С через Планировщик Windows может потребоваться настройка, чтобы приложение запускалось не в фоновом режиме без отображения интерфейса, если требуется взаимодействие с пользовательским интерфейсом или подхват настроек формы. Также необходимо убедиться, что у пользователя, под которым запускается задача в Планировщике, есть необходимые права на запуск 1С и доступ к файлам.

Разделение кода на клиенте и сервере: Директивы компиляции

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

В 1С 8.2 и выше для управляемого приложения появилась возможность явно указывать, где будет выполняться код — на клиенте или на сервере, с помощью директив компиляции.

Пример использования #Если Клиент Тогда:


// Этот код будет скомпилирован и доступен только на клиенте
#Если Клиент Тогда 
    Процедура МояКлиентскаяПроцедура()
        Сообщить("Этот код выполняется на клиенте!");
        // Здесь можно использовать ПодключитьОбработчикОжидания()
        // Или работать с локальными файлами
    КонецПроцедура;
#КонецЕсли

// Этот код будет скомпилирован и доступен на сервере
#Если Сервер Тогда
    Процедура МояСервернаяПроцедура()
        // Работа с базой данных, выполнение сложных расчетов
    КонецПроцедура;
#КонецЕсли

// Этот код будет скомпилирован и доступен как на клиенте, так и на сервере
// Но его выполнение будет зависеть от контекста вызова
Процедура ОбщаяПроцедура()
    // ...
КонецПроцедура;

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

Оптимизация: Мы рекомендуем минимизировать объем кода, выполняемого непосредственно на клиенте, особенно сложные алгоритмы. Клиентский компьютер обычно менее производителен, а веб-клиент может работать медленнее.

Дополнительные нюансы

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

← К списку