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

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

При разработке расширений функционала в современных конфигурациях 1С (таких как УТ 11, ЗУП 3.1, ERP 2) программисты часто сталкиваются с необходимостью автоматизировать запуск внешних обработок по расписанию. Однако стандартная попытка просто добавить обработку в список дополнительных отчетов и назначить ей расписание часто оборачивается ошибкой: «Не применимо для команд с вариантом запуска "Открытие формы"». Рассмотрим подробнее, почему это происходит и как правильно спроектировать внешнюю обработку для работы в фоновом режиме. Если фоновая задача заключается в регулярной синхронизации баз 1С, вместо написания собственного кода можно настроить автоматический обмен данными по расписанию, функционирующий поверх существующих планов обмена.

Причина возникновения ошибки «Открытие формы»

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

Структура модуля объекта внешней обработки

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


// В модуле объекта внешней обработки

#Область ПрограммныйИнтерфейс

// Процедура-обработчик команд, вызываемая БСП
// Параметры:
//  ИдентификаторКоманды - Строка - Имя команды, определенное в СведенияОВнешнейОбработке
//  ПараметрыВыполненияКоманды - Структура - Контекст выполнения (ссылка на доп. обработку и др.)
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
    
    Если ИдентификаторКоманды = "РегламентныйЗапуск" Тогда
        // Вызываем основную логику обработки
        ВыполнитьОсновнуюЛогику();
    КонецЕсли;
    
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

#КонецОбласти

Регистрация обработки в системе (СведенияОВнешнейОбработке)

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


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидДополнительнойОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Наименование = "Моя регламентная обработка";
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь; // Установите Ложь, если требуется доступ к файлам или интернету
    
    // Добавление команды для регламентного задания
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Запуск обработки по расписанию";
    НоваяКоманда.Идентификатор = "РегламентныйЗапуск"; // Должен совпадать с кодом в ВыполнитьКоманду
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Обратите внимание: использование ТипКомандыВызовСерверногоМетода() является ключевым условием для появления возможности настройки расписания в справочнике «Дополнительные отчеты и обработки». В качестве основы для разработки подойдёт готовый шаблон внешней обработки на базе БСП с фоновым выполнением.

Передача параметров и безопасный режим

Проанализируем ситуацию, когда обработке требуются специфические настройки. В БСП при вызове процедуры ВыполнитьКоманду вторым параметром передается ПараметрыВыполненияКоманды. Это структура, содержащая поле ДополнительнаяОбработкаСсылка. Используя эту ссылку, вы можете прочитать дополнительные параметры, сохраненные пользователем в карточке обработки в базе данных.

Безопасный режим: По умолчанию внешние обработки запускаются в безопасном режиме. Это накладывает ограничения на использование COMОбъект, работу с файловой системой сервера и сетевые запросы. Если ваше регламентное задание должно, например, выгружать данные в каталог на диске C:\ или обращаться к внешнему API, обязательно укажите ПараметрыРегистрации.БезопасныйРежим = Ложь или настройте соответствующие разрешения в профилях безопасности.

Как реализовать уведомление пользователя по расписанию

Часто возникает вопрос (как в сообщении 7 форума): что делать, если регламентное задание должно не просто изменить данные, а открыть форму пользователю (например, напомнить о важных событиях)? Напрямую из регламентного задания сделать это невозможно.

Рассмотрим архитектурное решение этой задачи:

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

Отладка регламентных заданий внешних обработок

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

Программный вызов из других заданий

Если вам требуется запустить внешнюю обработку программно из кода другого серверного модуля, не обязательно сохранять её на диск. В конфигурациях с БСП рекомендуется использовать метод:

ОбъектОбработки = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаОбработку);

После получения объекта вы можете напрямую вызвать его экспортный метод ВыполнитьКоманду. Это гарантирует, что обработка будет загружена корректно с учетом всех прав доступа и настроек безопасного режима. Для такой задачи можно использовать процедуру для программного вызова дополнительной обработки штатными средствами БСП.

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

← На главную