При разработке и автоматизации бизнес-процессов в 1С программисты часто сталкиваются с необходимостью запускать уже готовые внешние обработки по расписанию. Однако возникает серьезная архитектурная преграда: регламентные задания исполняются исключительно на сервере (в фоновом сеансе), в то время как логика многих обработок, особенно исторических или полученных от вендоров, завязана на клиентский контекст (формы, диалоги, работа с файлами на диске пользователя). Рассмотрим, почему стандартный вызов не срабатывает и какими способами можно решить эту задачу.
Для начала разберем природу регламентного задания. В системе 1С:Предприятие 8.3 любое регламентное задание выполняется в специальном фоновом сеансе. Проанализируем ключевые особенности этого процесса:
УправляемаяФорма или методы типа ОткрытьФорму() не могут функционировать.ПолучитьФорму(), мы получим лишь серверную проекцию объекта формы, в которой не будет работать событийный цикл и клиентские процедуры, помеченные директивой &НаКлиенте.&НаКлиенте, просто не компилируется для серверного контекста. При попытке обращения к ним сервер выдаст ошибку о том, что метод не обнаружен.Иногда программистов вводит в заблуждение Синтаксис-помощник. В старых релизах платформы (например, 8.3.10) для метода ПолучитьФорму() объекта ВнешняяОбработка ошибочно указывалась доступность «Сервер». В современных версиях эта ошибка исправлена, и доступность ограничена только «Толстым клиентом». Важно понимать: даже если метод формально доступен на сервере, он предназначен для подготовки формы перед передачей на клиент, а не для исполнения клиентского кода на самом сервере.
Это самый правильный и надежный путь с точки зрения архитектуры 1С. Если нам нужно, чтобы код работал в регламентном задании, мы должны избавить его от привязки к клиенту. Рассмотрим, как это сделать:
Выделим всю бизнес-логику из клиентских процедур в экспортные серверные процедуры объекта обработки или в отдельный общий модуль. Если в коде встречаются методы взаимодействия с пользователем, заменим их:
Предупреждение() или Сообщить() используем запись в Журнал регистрации через ЗаписьЖурналаРегистрации().Пример структуры серверного вызова для внешней обработки:
// В модуле объекта внешней обработки
Процедура ВыполнитьСервернуюЛогику() Экспорт
// Здесь размещаем переписанный код без клиентских вызовов
ОбщегоНазначения.СообщитьПользователю("Робот начал работу...");
КонецПроцедуры
Если код внешней обработки невозможно переписать на сервер (например, из-за использования специфических COM-объектов, доступных только на Windows-клиенте, или из-за огромного объема клиентского кода на поддержке), применим схему с агентом-клиентом.
Разберем этот механизм по шагам:
ОчередьЗадач с полями Параметры, Статус (Новое, Выполнено, Ошибка) и Результат.
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьОчередьЗаданий", 60); // проверка раз в минуту
КонецПроцедуры
Процедура ПроверитьОчередьЗаданий() Экспорт
// Проверяем регистр ОчередьЗадач.
// Если есть записи со статусом "Новое" - запускаем обработку:
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу);
Обработка.ВыполнитьКлиентскийМетод();
КонецПроцедуры
Таким образом, код будет выполняться на клиенте, но инициироваться сервером через «прослойку» в базе данных.
Этот способ позволяет полностью обойти механизм регламентных заданий 1С, если они не справляются с задачей. Мы можем настроить запуск клиента 1С через штатный планировщик задач операционной системы.
Проанализируем параметры запуска:
/Execute <ПутьКФайлу> для автоматического открытия внешней обработки при старте./C <СтрокаПараметров> для передачи команд внутрь обработки.ПриОткрытии (или ПриСозданииНаСервере для управляемых форм с последующим переходом на клиент) прописываем логику, которая считывает параметры и запускает выполнение.Пример командной строки для планировщика:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Base1C" /N "Robot" /P "Pass" /Execute "C:\Scripts\MyTask.epf"
Важный нюанс: чтобы после выполнения сеанс не оставался висеть в памяти, в конце кода обработки обязательно вызываем ЗавершитьРаботуСистемы(Ложь);. Это позволит автоматизировать процесс от запуска до закрытия приложения.
Если в вашей конфигурации настроена Система взаимодействия, мы можем использовать её для мгновенной передачи команды от сервера к клиенту. Это наиболее современный, но требующий активного сеанса пользователя метод.
Рассмотрим алгоритм:
ПриПолученииСообщения.Этот метод хорош тем, что он работает практически мгновенно и не требует постоянного опроса базы данных (как в случае с очередью заданий), однако он также требует наличия хотя бы одного активного клиентского сеанса, готового исполнить код.
Подведем итоги нашего анализа. Выбор метода зависит от ваших приоритетов:
&НаСервереБезКонтекста или серверный модуль объекта).Помните, что попытки «обмануть» сервер и заставить его думать, что он клиент (через ПолучитьФорму), в 99% случаев приведут к ошибкам времени выполнения или непредсказуемому поведению системы. Архитектура 1С четко разделяет эти контексты для обеспечения высокой производительности и масштабируемости серверной части.