Как настроить запуск клиентского кода и обработок по расписанию в 1С:Предприятие 8

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

В практике разработчика 1С часто возникает ситуация, когда необходимо автоматизировать процесс, жестко завязанный на клиентскую логику. Это может быть работа с формами, вызов интерактивных процедур типовых конфигураций (например, в ЗУП 3.1) или использование методов, которые доступны только в контексте тонкого или толстого клиента. Стандартный механизм РегламентныеЗадания здесь не поможет, так как он исполняется на сервере в контексте процесса rphost, где нет графической оболочки и возможности инициализировать формы. Разберем подробно, как решить эту задачу, используя альтернативные подходы.

Причина ограничения: почему сервер не видит клиентский код

Прежде всего, проанализируем архитектурную ситуацию. Регламентное задание — это фоновое задание, которое запускается планировщиком 1С непосредственно на сервере. В этом контексте полностью отсутствуют такие понятия, как ЭтаФорма, ОткрытьФорму() или клиентские модули. Если ваша обработка использует логику, встроенную в события элементов формы (например, ПриИзменении), или вызывает процедуры, объявленные с директивой &НаКлиенте, серверный процесс просто не сможет их скомпилировать и выполнить.

Решение №1: Использование планировщика задач Windows и ключей запуска

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

  1. /Execute <ПутьКФайлу> — позволяет запустить внешнюю обработку сразу после старта системы.
  2. /C <СтрокаТекста> — передает произвольную строку в конфигурацию. Ее можно перехватить в модуле управляемого приложения.
  3. /N <Имя> /P <Пароль> — учетные данные для автоматического входа.
  4. /DisableStartupMessages — подавление системных уведомлений, которые могут остановить выполнение кода (например, сообщение об обновлении или «совет дня»).

Разберем пример реализации через параметр /C. Это более гибкий метод, если нужно запустить встроенную в конфигурацию обработку. В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы пропишем следующий код:


Процедура ПриНачалеРаботыСистемы()
    ПараметрыЗапускаСтрока = ПараметрыЗапуска;
    Если Найти(ПараметрыЗапускаСтрока, "ЗапуститьФормированиеДокументов") > 0 Тогда
        Обработка = Обработки.МояАвтоматическаяОбработка.Создать();
        Обработка.ВыполнитьДействиеНаКлиенте();
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

В планировщике задач Windows создается задача, где в качестве исполняемого файла указывается путь к 1cv8c.exe, а в аргументах прописывается строка соединения с базой и ключ /C ЗапуститьФормированиеДокументов.

Решение №2: Использование «Обработчика ожидания» (Метод выделенного терминала)

Если по каким-то причинам доступ к планировщику ОС ограничен, можно организовать «клиентский сервер» внутри самой 1С. Для этого выделяется отдельная учетная запись и компьютер (или виртуальная машина), на котором сеанс 1С открыт постоянно.

Проанализируем шаги для реализации этого метода:

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

Пример кода в форме:


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

&НаКлиенте
Процедура ПроверитьЗадачиПоРасписанию()
    Если НужноВыполнитьЗапуск() Тогда
        // Вызов основной логики создания документов
        ОбработкаОбъект = СоздатьОбработку();
        ОбработкаОбъект.ИнициализироватьПроцесс();
    КонецЕсли;
КонецПроцедуры

Важный момент: данный метод требует наличия свободной клиентской лицензии, так как сеанс должен быть активен постоянно.

Особенности работы в ЗУП 3.1: Перенос логики на сервер

Часто программисты считают, что им необходим клиентский запуск, потому что они используют процедуры типа РассчитатьЗарплату() или ЗаполнитьСотрудников(), которые вызываются из форм. Однако в типовых конфигурациях, таких как ЗУП 3.1, разработчики фирмы «1С» следуют принципам разделения интерфейса и логики.

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

Если удастся перенести логику заполнения на сервер, вы сможете использовать стандартные РегламентныеЗадания, что является более правильным («по феншую») с точки зрения архитектуры системы.

Меры предосторожности и обработка ошибок

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

  1. Обработка исключений: Весь код должен быть обернут в конструкцию Попытка ... Исключение. Ошибки обязательно должны записываться в Журнал регистрации, чтобы вы могли понять, почему задание не отработало.
  2. Завершение работы: В случае фатальной ошибки сеанс должен принудительно закрываться, чтобы не занимать лицензию и не блокировать базу. Используйте ЗавершитьРаботуСистемы(Ложь).
  3. Модальные окна: Убедитесь, что в коде нет вызовов Предупреждение(), Вопрос() или других модальных диалогов. В автоматическом режиме нажать на кнопку будет некому, и процесс «повиснет» навсегда.
  4. Права доступа: Пользователь, под которым запускается планировщик, должен иметь достаточные права на создание и проведение документов, а также на доступ к внешним файлам, если они используются.

Выясним причину, по которой автоматизация через планировщик Windows может не сработать: это интерактивные проверки безопасности в некоторых версиях платформы. Для их обхода при запуске извне рекомендуется использовать параметр /UC <КодРазрешения>, если база заблокирована, или убедиться, что в настройках пользователя отключена проверка подтверждения при завершении работы.

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

← На главную