Почему регламентное задание игнорирует реквизиты обработки при запуске?

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

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

Рассмотрим подробнее суть проблемы. Многие из нас привыкли работать с обработками, создавая для них формы, на которых расположены различные реквизиты. Эти реквизиты могут хранить параметры, настройки или промежуточные данные, необходимые для работы обработки. При интерактивном запуске обработки через форму, все реквизиты доступны и корректно используются. Однако, когда мы пытаемся запустить ту же обработку через регламентное задание, оказывается, что эти реквизиты "игнорируются", и обработка ведет себя не так, как ожидалось.

Выясним причину этого явления. Ключевая разница заключается в среде выполнения. Когда вы запускаете обработку из формы, вы работаете в пользовательском режиме, и все данные формы, включая реквизиты, доступны. Форма является частью клиентского приложения. Регламентное же задание выполняется на сервере (или в фоновом режиме на клиенте, если это файловая база без выделенного сервера). На сервере форм нет вообще. Соответственно, все, что связано с формой – ее реквизиты, табличные части, элементы управления – просто недоступно. Регламентное задание работает только с модулем объекта обработки.

Как метко подметили на форуме: "А при чем здесь форма и регламент? Когда обработка не запущена, где реквизиты хранятся? Вот оттуда и тащите сохраненное значение при запуске из регламента." И действительно, данные в реквизитах формы обработки не хранятся в информационной базе. Они существуют только пока открыта форма. Отсюда и возникает необходимость в альтернативных способах хранения данных, которые будут доступны регламентному заданию.

Решение 1: Передача параметров через регламентное задание

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

  1. При создании нового регламентного задания или редактировании существующего, вы можете указать параметры, которые будут переданы в его метод.
  2. В конфигураторе, в модуле объекта вашей обработки, создайте экспортную процедуру или функцию, которая будет вызываться регламентным заданием. Эта процедура должна принимать необходимые параметры.

Посмотрим на пример:


// В модуле объекта обработки
Процедура ВыполнитьЗаданиеПоРасписанию(Параметр1, Параметр2) Экспорт
    // Здесь используем Параметр1 и Параметр2
    Сообщить("Задание выполнено с параметрами: " + Параметр1 + ", " + Параметр2);
    // ... ваш код обработки
КонецПроцедуры

При настройке регламентного задания вы сможете указать значения для Параметр1 и Параметр2. Этот подход хорош для фиксированных или редко изменяемых настроек.

Решение 2: Хранение данных в регистрах сведений

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

  1. Создайте новый независимый регистр сведений в вашей конфигурации. Назовите его, например, "НастройкиОбработки" или "ПараметрыРегламентныхЗаданий".
  2. Определите необходимые измерения (если настройки зависят от чего-либо, например, пользователя или организации) и ресурсы (собственно сами значения настроек).
  3. Из формы обработки обеспечьте возможность записи этих настроек в регистр сведений. Это можно сделать по кнопке "Сохранить настройки" или при закрытии формы.
  4. В модуле объекта обработки, который вызывается регламентным заданием, считывайте необходимые параметры из этого регистра сведений.

Посмотрим на пример записи и чтения:


// В модуле формы обработки (при сохранении настроек)
Процедура СохранитьНастройкиВРегистр()
    НаборЗаписей = РегистрыСведений.НастройкиОбработки.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.КлючНастройки.Установить("МояНастройка"); // Пример измерения
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() = 0 Тогда
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.КлючНастройки = "МояНастройка";
    Иначе
        НоваяЗапись = НаборЗаписей[0];
    КонецЕсли;
    
    НоваяЗапись.ЗначениеНастройки = МойРеквизитФормы; // Предположим, МойРеквизитФормы - это реквизит формы
    НаборЗаписей.Записать();
КонецПроцедуры

// В модуле объекта обработки (для регламентного задания)
Процедура ВыполнитьЗадание() Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    НастройкиОбработки.ЗначениеНастройки
        |ИЗ
        |    РегистрСведений.НастройкиОбработки КАК НастройкиОбработки
        |ГДЕ
        |    НастройкиОбработки.КлючНастройки = &КлючНастройки";
    
    Запрос.УстановитьПараметр("КлючНастройки", "МояНастройка");
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Если Выборка.Следующий() Тогда
        ПереданноеЗначение = Выборка.ЗначениеНастройки;
        Сообщить("Задание выполнено с настройкой: " + ПереданноеЗначение);
        // ... используем ПереданноеЗначение в логике регламентного задания
    Иначе
        Сообщить("Настройка 'МояНастройка' не найдена.");
    КонецЕсли;
КонецПроцедуры

Решение 3: Использование справочника для хранения настроек

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

  1. Создайте новый справочник, например, "НастройкиРегламентныхЗаданий".
  2. Добавьте в него необходимые реквизиты, которые будут хранить ваши настройки. Это могут быть строки, числа, булевы значения, даты или даже ссылки на другие объекты.
  3. Из формы обработки обеспечьте создание или редактирование элементов этого справочника.
  4. В модуле объекта обработки, вызываемого регламентным заданием, считывайте значения реквизитов из нужного элемента справочника.

Посмотрим на пример:


// В модуле формы обработки (при сохранении настроек)
Процедура СохранитьНастройкиВСправочник()
    // Предположим, у нас есть элемент справочника "НастройкиРегламентногоЗадания1"
    ЭлементНастроек = Справочники.НастройкиРегламентныхЗаданий.НайтиПоНаименованию("НастройкиРегламентногоЗадания1");
    Если ЭлементНастроек = Неопределено Тогда
        ЭлементНастроек = Справочники.НастройкиРегламентныхЗаданий.СоздатьЭлемент();
        ЭлементНастроек.Наименование = "НастройкиРегламентногоЗадания1";
    КонецЕсли;
    
    ЭлементНастроек.ПутьКФайлу = МойРеквизитФормыПутьКФайлу; // Реквизит формы
    ЭлементНастроек.КоличествоПопыток = МойРеквизитФормыКоличествоПопыток; // Реквизит формы
    ЭлементНастроек.Записать();
КонецПроцедуры

// В модуле объекта обработки (для регламентного задания)
Процедура ВыполнитьЗадание() Экспорт
    ЭлементНастроек = Справочники.НастройкиРегламентныхЗаданий.НайтиПоНаименованию("НастройкиРегламентногоЗадания1");
    Если ЭлементНастроек <> Неопределено Тогда
        ПутьКФайлу = ЭлементНастроек.ПутьКФайлу;
        КоличествоПопыток = ЭлементНастроек.КоличествоПопыток;
        
        Сообщить("Задание выполнено с настройками: " + ПутьКФайлу + ", " + КоличествоПопыток);
        // ... используем ПутьКФайлу и КоличествоПопыток
    Иначе
        Сообщить("Элемент настроек 'НастройкиРегламентногоЗадания1' не найден.");
    КонецЕсли;
КонецПроцедуры

Решение 4: Хранилище общих настроек

Механизм ХранилищеОбщихНастроек позволяет сохранять и загружать настройки вручную, привязывая их к определенному ключу. Это может быть удобным для сохранения пользовательских настроек или параметров, не требующих сложной структуры метаданных. Рассмотрим, как это работает.

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

Посмотрим на пример:


// В модуле формы обработки (при сохранении настроек)
Процедура СохранитьНастройкиВХранилище()
    Настройки = Новый Структура;
    Настройки.Вставить("ПериодОтчета", МойРеквизитФормыПериод);
    Настройки.Вставить("Организация", МойРеквизитФормыОрганизация);
    
    ХранилищеОбщихНастроек.Сохранить(Настройки, "НастройкиМоегоРегламентногоЗадания");
    Сообщить("Настройки сохранены в ХранилищеОбщихНастроек.");
КонецПроцедуры

// В модуле объекта обработки (для регламентного задания)
Процедура ВыполнитьЗадание() Экспорт
    Настройки = ХранилищеОбщихНастроек.Загрузить("НастройкиМоегоРегламентногоЗадания");
    
    Если Настройки <> Неопределено Тогда
        ПериодОтчета = Настройки.ПериодОтчета;
        Организация = Настройки.Организация;
        
        Сообщить("Задание выполнено с настройками: " + ПериодОтчета + ", " + Организация);
        // ... используем ПериодОтчета и Организация
    Иначе
        Сообщить("Настройки для 'НастройкиМоегоРегламентногоЗадания' не найдены.");
    КонецЕсли;
КонецПроцедуры

Обратите внимание, что ХранилищеОбщихНастроек сохраняет данные в формате сериализованного значения, поэтому при загрузке мы получаем тот же тип данных, что и сохраняли.

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

← К списку