Как правильно настроить запуск обработки через регламентное задание в 1С 8.3?

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

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

Причины ошибок при обращении к формам из регламентного задания

Регламентное задание всегда выполняется на стороне сервера 1С в отдельном фоновом сеансе без участия пользователя. В этом контексте графический интерфейс полностью отсутствует. Попытки вызвать методы ПолучитьФорму(), Открыть() или обратиться к свойствам вроде ЭтаФорма приводят к исключениям и падению задания.

Проанализируем ключевые ограничения серверного контекста:

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

Пошаговый перенос алгоритма в модуль объекта обработки

Для того чтобы логика корректно отрабатывала как интерактивно по кнопке, так и автоматически через регламентное задание, вынесем выполнение в экспортную процедуру модуля объекта обработки. Рассмотрим правильную реализацию.

Шаг 1. Переносим исполняемый код в Модуль объекта обработки:


Процедура ВыгрузитьДанныеПоДате(ДатаВыгрузки = Неопределено) Экспорт
    
    Если ДатаВыгрузки = Неопределено Тогда
        ДатаВыгрузки = ТекущаяДата();
    КонецЕсли;
    
    // Основной алгоритм выборки и выгрузки данных
    Выборка = Справочники.Номенклатура.Выбрать();
    Пока Выборка.Следующий() Цикл
        // Обработка данных
    КонецЦикла;
    
КонецПроцедуры

Шаг 2. Создаем или настраиваем процедуру в Общем модуле, на который ссылается регламентное задание. В свойствах общего модуля обязательно должен быть установлен флаг Сервер:


Процедура ВыполнитьРегламентнуюВыгрузку() Экспорт
    
    // Создаем экземпляр обработки на сервере
    ОбработкаОбъект = Обработки.ВыгрузкаФайла.Создать();
    
    // Вызываем серверный метод объекта
    ОбработкаОбъект.ВыгрузитьДанныеПоДате(ТекущаяДата());
    
КонецПроцедуры

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


&НаСервере
Процедура ВыгрузитьНаСервере()
    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ОбработкаОбъект.ВыгрузитьДанныеПоДате(Объект.ДатаПараметр);
    
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыгрузить(Команда)
    ВыгрузитьНаСервере();
КонецПроцедуры

Альтернативный вариант: логика в модуле менеджера

Если алгоритму не требуется сохранять промежуточное состояние в реквизитах объекта, оптимально разместить экспортную процедуру в Модуле менеджера обработки. Это избавит платформу от необходимости создания экземпляра объекта через метод Создать().

В модуле менеджера обработки объявим процедуру:


Процедура ВыполнитьВыгрузку() Экспорт
    
    // Серверный алгоритм без создания объекта
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка ИЗ Документ.РеализацияТоваровУслуг";
    Результат = Запрос.Выполнить();
    
КонецПроцедуры

Тогда в общем модуле для регламентного задания вызов станет еще компактнее:


Процедура ЗапуститьВыгрузкуПоРасписанию() Экспорт
    Обработки.ВыгрузкаФайла.ВыполнитьВыгрузку();
КонецПроцедуры

Особенности работы с внешними файлами и внешними обработками

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


Процедура ЗапуститьВнешнююОбработку() Экспорт
    
    ПутьКФайлу = "\\server\share\Выгрузка.epf";
    ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
    ВнешняяОбработка.ВыгрузитьДанныеПоДате();
    
КонецПроцедуры

Важно обратить внимание:

  1. Права системной службы: Сервер 1С запускается от имени системного пользователя (например, USR1CV8). У этой учетной записи должен быть прямой доступ к каталогам файловой системы по сетевым путям вида \\server\share\. Локальные пользовательские пути (например, C:\Users\...) серверу недоступны.
  2. Безопасный режим: Второй параметр метода ВнешниеОбработки.Создать(..., Ложь) отключает безопасный режим, позволяя обработке выполнять привилегированные операции и обращаться к внешним ресурсам.
  3. Хранение настроек: Вместо глобальных переменных клиентских модулей используйте ПараметрыСеанса, константы или регистры сведений, которые штатно читаются сервером в любом сеансе.

Диагностика и отладка регламентного задания

Если задание настроено, но выгрузка не происходит, выполним диагностику:

  1. Проверим Журнал регистрации с фильтром по событию «Фоновое задание. Ошибка выполнения». Все неперехваченные серверные ошибки фиксируются там с указанием строки модуля.
  2. Убедимся, что в клиент-серверной базе в консоли администрирования кластера для информационной базы снят флаг «Блокировка регламентных заданий включена».
  3. Для файлового режима работы проверим, запущен ли сеанс 1С:Предприятия, обрабатывающий регламентные процедуры, либо настроен ли запуск через планировщик операционной системы.
← На главную