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

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

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

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

Для начала разберем природу регламентного задания. В системе 1С:Предприятие 8.3 любое регламентное задание выполняется в специальном фоновом сеансе. Проанализируем ключевые особенности этого процесса:

  1. Отсутствие пользовательского интерфейса: В фоновом сеансе физически не инициализируется ни «Тонкий клиент», ни «Толстый клиент». Следовательно, такие объекты как УправляемаяФорма или методы типа ОткрытьФорму() не могут функционировать.
  2. Изоляция контекста: Сервер ничего не знает о графической оболочке. Даже если мы попытаемся программно получить форму объекта, используя ПолучитьФорму(), мы получим лишь серверную проекцию объекта формы, в которой не будет работать событийный цикл и клиентские процедуры, помеченные директивой &НаКлиенте.
  3. Директивы компиляции: Весь код, написанный внутри процедур с директивой &НаКлиенте, просто не компилируется для серверного контекста. При попытке обращения к ним сервер выдаст ошибку о том, что метод не обнаружен.

Иногда программистов вводит в заблуждение Синтаксис-помощник. В старых релизах платформы (например, 8.3.10) для метода ПолучитьФорму() объекта ВнешняяОбработка ошибочно указывалась доступность «Сервер». В современных версиях эта ошибка исправлена, и доступность ограничена только «Толстым клиентом». Важно понимать: даже если метод формально доступен на сервере, он предназначен для подготовки формы перед передачей на клиент, а не для исполнения клиентского кода на самом сервере.

Решение 1: Перенос логики в серверный модуль (Рефакторинг)

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

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

Пример структуры серверного вызова для внешней обработки:


// В модуле объекта внешней обработки
Процедура ВыполнитьСервернуюЛогику() Экспорт
    // Здесь размещаем переписанный код без клиентских вызовов
    ОбщегоНазначения.СообщитьПользователю("Робот начал работу...");
КонецПроцедуры

Решение 2: Использование «Технического клиента» (Очередь заданий)

Если код внешней обработки невозможно переписать на сервер (например, из-за использования специфических COM-объектов, доступных только на Windows-клиенте, или из-за огромного объема клиентского кода на поддержке), применим схему с агентом-клиентом.

Разберем этот механизм по шагам:

  1. Создание регистра-очереди: Создадим регистр сведений ОчередьЗадач с полями Параметры, Статус (Новое, Выполнено, Ошибка) и Результат.
  2. Регламентное задание: Наше серверное задание вместо выполнения кода просто записывает новую задачу в этот регистр.
  3. Выделенный сеанс: На сервере или отдельном ПК запускаем обычный сеанс 1С под специальным пользователем («Робот»).
  4. Обработчик ожидания: В модуле управляемого приложения этого сеанса подключаем обработчик ожидания:
    
    Процедура ПриНачалеРаботыСистемы()
        ПодключитьОбработчикОжидания("ПроверитьОчередьЗаданий", 60); // проверка раз в минуту
    КонецПроцедуры
    
    Процедура ПроверитьОчередьЗаданий() Экспорт
        // Проверяем регистр ОчередьЗадач. 
        // Если есть записи со статусом "Новое" - запускаем обработку:
        Обработка = ВнешниеОбработки.Создать(ПутьКФайлу);
        Обработка.ВыполнитьКлиентскийМетод();
    КонецПроцедуры
    

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

Решение 3: Запуск через планировщик Windows и параметры командной строки

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

Проанализируем параметры запуска:

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

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Base1C" /N "Robot" /P "Pass" /Execute "C:\Scripts\MyTask.epf"

Важный нюанс: чтобы после выполнения сеанс не оставался висеть в памяти, в конце кода обработки обязательно вызываем ЗавершитьРаботуСистемы(Ложь);. Это позволит автоматизировать процесс от запуска до закрытия приложения.

Решение 4: Система взаимодействия (Collaboration System)

Если в вашей конфигурации настроена Система взаимодействия, мы можем использовать её для мгновенной передачи команды от сервера к клиенту. Это наиболее современный, но требующий активного сеанса пользователя метод.

Рассмотрим алгоритм:

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

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

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших приоритетов:

  1. Если важна стабильность и чистота кода — только полный рефакторинг с переносом логики на сервер (директива &НаСервереБезКонтекста или серверный модуль объекта).
  2. Если код чужой и его много — используйте планировщик Windows с запуском 1С под параметрами. Это «костыльный», но рабочий метод, не требующий вмешательства в логику поставщика.
  3. Для интерактивных систем, где важно выполнение именно в сеансе пользователя — используйте Систему взаимодействия или Очередь задач через регистр.

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

← На главную