Как получить значения реквизитов формы в модуле объекта при выполнении регламентного задания?

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

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

Разберем подробно, как правильно организовать получение настроек и реквизитов в модуле объекта обработки, чтобы код успешно отрабатывал «без участия человека».

Почему нельзя просто «открыть форму» на сервере?

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

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

Способ 1: Использование системного хранилища настроек

Если в вашей форме включено свойство «Автоматическое сохранение данных», 1С сохраняет значения реквизитов в системное хранилище. Мы можем программно прочитать эти данные из модуля объекта, даже если форма не открыта. Выясним, как это сделать правильно.

Для получения данных на сервере используется объект ХранилищеСистемныхНастроек. Нам понадобятся: КлючОбъекта (полный путь к форме) и КлючНастроек (обычно это имя настройки или «ОсновнаяНастройка»).

Рассмотрим пример кода, который можно разместить в модуле объекта:


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

КонецПроцедуры

Важный нюанс: Регламентное задание часто выполняется от имени специального пользователя (например, «DefUser» или «System»). Если вы сохранили настройки под своим именем, а задание запускается под другим, метод Загрузить без указания конкретного имени пользователя вернет Неопределено.

Способ 2: Интеграция с Библиотекой стандартных подсистем (БСП)

Если ваша внешняя обработка подключается через справочник «Дополнительные отчеты и обработки», механизм передачи параметров уже продуман разработчиками фирмы 1С. В этом случае нам не нужно обращаться к форме. Настройки для регламентного задания задаются в самом справочнике при настройке расписания.

Посмотрим на алгоритм реализации в модуле объекта:

  1. В модуле объекта должна присутствовать экспортная процедура ВыполнитьКоманду.
  2. Параметры, необходимые для работы (например, отборы или префиксы), передаются в структуру ПараметрыВыполненияКоманды.

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    // ПараметрыВыполненияКоманды.ДополнительнаяОбработкаСсылка - ссылка на элемент справочника
    // Из которого можно прочитать реквизит "ПараметрыОбъекта" (ХранилищеЗначения)
    
    Настройки = ПараметрыВыполненияКоманды.ПараметрыПовторногоИспользования;
    // Или чтение напрямую из параметров, заданных в интерфейсе БСП
    
КонецПроцедуры

Этот метод считается наиболее «чистым» и правильным с точки зрения архитектуры современных конфигураций.

Способ 3: Использование Регистров сведений

Проанализируем ситуацию, когда настройки должны быть общими для всех сеансов. Опытные разработчики рекомендуют полностью отказаться от хранения «бизнес-логики» в настройках формы. Если значение (например, «Дата последней загрузки») критически важно для работы фонового задания, его следует хранить в Регистре сведений.

Разберем преимущества этого подхода по шагам:

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

Пример получения данных через запрос:


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

Ограничения метода РеквизитыФормыВЗначение

Часто начинающие разработчики пытаются использовать метод РеквизитыФормыВЗначение. Выясним причину, по которой это не поможет в нашей задаче. Данный метод предназначен для преобразования данных из экранной формы в объект СправочникОбъект или ОбработкаОбъект внутри контекста этой самой формы.

Поскольку в регламентном задании контекста формы не существует, вызвать этот метод невозможно. Все данные, которые вы хотите видеть в модуле объекта, должны быть объявлены как Реквизиты обработки в дереве метаданных, а не просто существовать в списке реквизитов на закладке «Формы».

Резюме и рекомендации

Для успешного получения реквизитов в модуле объекта придерживайтесь следующих правил:

Следуя этим принципам, вы сможете создавать отказоустойчивые регламентные задания, которые корректно работают в любых условиях без необходимости «открывать форму» на сервере.

← На главную