В практике разработчика 1С часто возникает ситуация, когда необходимо автоматизировать процесс, жестко завязанный на клиентскую логику. Это может быть работа с формами, вызов интерактивных процедур типовых конфигураций (например, в ЗУП 3.1) или использование методов, которые доступны только в контексте тонкого или толстого клиента. Стандартный механизм РегламентныеЗадания здесь не поможет, так как он исполняется на сервере в контексте процесса rphost, где нет графической оболочки и возможности инициализировать формы. Разберем подробно, как решить эту задачу, используя альтернативные подходы.
Прежде всего, проанализируем архитектурную ситуацию. Регламентное задание — это фоновое задание, которое запускается планировщиком 1С непосредственно на сервере. В этом контексте полностью отсутствуют такие понятия, как ЭтаФорма, ОткрытьФорму() или клиентские модули. Если ваша обработка использует логику, встроенную в события элементов формы (например, ПриИзменении), или вызывает процедуры, объявленные с директивой &НаКлиенте, серверный процесс просто не сможет их скомпилировать и выполнить.
Это самый популярный и надежный способ имитировать регламентное задание для клиентского кода. Суть метода заключается в создании сценария запуска 1С в режиме предприятия с параметрами, которые заставят программу выполнить нужное действие и закрыться. Рассмотрим основные ключи запуска, которые нам понадобятся:
Разберем пример реализации через параметр /C. Это более гибкий метод, если нужно запустить встроенную в конфигурацию обработку. В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы пропишем следующий код:
Процедура ПриНачалеРаботыСистемы()
ПараметрыЗапускаСтрока = ПараметрыЗапуска;
Если Найти(ПараметрыЗапускаСтрока, "ЗапуститьФормированиеДокументов") > 0 Тогда
Обработка = Обработки.МояАвтоматическаяОбработка.Создать();
Обработка.ВыполнитьДействиеНаКлиенте();
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
В планировщике задач Windows создается задача, где в качестве исполняемого файла указывается путь к 1cv8c.exe, а в аргументах прописывается строка соединения с базой и ключ /C ЗапуститьФормированиеДокументов.
Если по каким-то причинам доступ к планировщику ОС ограничен, можно организовать «клиентский сервер» внутри самой 1С. Для этого выделяется отдельная учетная запись и компьютер (или виртуальная машина), на котором сеанс 1С открыт постоянно.
Проанализируем шаги для реализации этого метода:
ПодключитьОбработчикОжидания().Пример кода в форме:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Проверка каждые 10 минут (600 секунд)
ПодключитьОбработчикОжидания("ПроверитьЗадачиПоРасписанию", 600);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьЗадачиПоРасписанию()
Если НужноВыполнитьЗапуск() Тогда
// Вызов основной логики создания документов
ОбработкаОбъект = СоздатьОбработку();
ОбработкаОбъект.ИнициализироватьПроцесс();
КонецЕсли;
КонецПроцедуры
Важный момент: данный метод требует наличия свободной клиентской лицензии, так как сеанс должен быть активен постоянно.
Часто программисты считают, что им необходим клиентский запуск, потому что они используют процедуры типа РассчитатьЗарплату() или ЗаполнитьСотрудников(), которые вызываются из форм. Однако в типовых конфигурациях, таких как ЗУП 3.1, разработчики фирмы «1С» следуют принципам разделения интерфейса и логики.
Посмотрим на ситуацию глубже: большинство действий, которые инициируются кнопками на форме, дублируются в программном интерфейсе серверных модулей. Вместо создания формы документа программно, попробуйте найти экспортные процедуры в:
ЗаполнениеДокументов, РасчетЗарплатыРасширенный).Если удастся перенести логику заполнения на сервер, вы сможете использовать стандартные РегламентныеЗадания, что является более правильным («по феншую») с точки зрения архитектуры системы.
При реализации «слепого» автоматического запуска клиентского кода крайне важно обеспечить отказоустойчивость, иначе сеанс может зависнуть на неопределенное время. Рассмотрим основные правила:
Попытка ... Исключение. Ошибки обязательно должны записываться в Журнал регистрации, чтобы вы могли понять, почему задание не отработало.ЗавершитьРаботуСистемы(Ложь).Предупреждение(), Вопрос() или других модальных диалогов. В автоматическом режиме нажать на кнопку будет некому, и процесс «повиснет» навсегда.Выясним причину, по которой автоматизация через планировщик Windows может не сработать: это интерактивные проверки безопасности в некоторых версиях платформы. Для их обхода при запуске извне рекомендуется использовать параметр /UC <КодРазрешения>, если база заблокирована, или убедиться, что в настройках пользователя отключена проверка подтверждения при завершении работы.
Подводя итог, можно сказать, что хотя прямого понятия «клиентское регламентное задание» в 1С не существует, связка планировщика ОС и ключей запуска 1С позволяет эффективно решать задачи автоматизации клиентской логики с минимальными затратами на переписывание кода.