Как сохранить параметры внешней обработки для выполнения по регламентному заданию?

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

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

В этой статье мы разберем, как обеспечить сохранение настроек внешней обработки и их корректное считывание при выполнении серверного кода. Мы проанализируем стандартные механизмы платформы и способы работы с хранилищами данных.

Использование ХранилищаНастроекДанныхФорм

Самый простой способ, который часто применяют разработчики, — это использование объекта ХранилищеНастроекДанныхФорм. Этот механизм позволяет сохранять значения реквизитов обработки непосредственно в системные таблицы базы данных, привязывая их к определенному ключу.

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

Проанализируем пример кода для сохранения значения реквизита Контрагент:


// В модуле формы
Процедура КомандаСохранитьНастройки(Команда)
    ХранилищеНастроекДанныхФорм.Сохранить("УникальныйКлючНастроек_Контрагент", , Объект.Контрагент);
    Сообщить("Настройки сохранены");
КонецПроцедуры

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


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

Проблема контекста сеанса и пользователя

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

Выясним причину: при вызове метода Загрузить() без указания пользователя система ищет данные для того имени, под которым запущен текущий сеанс. В регламентном задании этот сеанс отличается от сеанса пользователя в интерфейсе.

Альтернатива: ХранилищеОбщихНастроек

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

Посмотрим на пример работы с общим хранилищем:


// Сохранение настроек (доступно всем)
ХранилищеОбщихНастроек.Сохранить("ПараметрыМоейОбработки", "КлючНастроек", СтруктураПараметров);

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

Использование структуры (объекта Структура) позволяет сохранить сразу несколько реквизитов обработки одним блоком данных, что гораздо удобнее при большом количестве параметров.

Использование возможностей БСП (Библиотеки Стандартных Подсистем)

Если вы работаете в современной конфигурации, такой как УТ 11, ERP 2 или КА 2, внешние обработки обычно регистрируются в справочнике ДополнительныеОтчетыИОбработки. Проанализируем возможности этого механизма:

  1. Стандартные реквизиты: Справочник имеет встроенные механизмы хранения настроек в реквизитах типа ХранилищеЗначения.
  2. Программный интерфейс: БСП предоставляет функции для извлечения параметров конкретного экземпляра обработки. Это позволяет избежать конфликтов, если одна и та же внешняя обработка добавлена в базу дважды с разными настройками (например, для разных филиалов).
  3. Безопасность: Использование штатного справочника гарантирует, что при обновлении платформы или версии обработки ваши настройки не «слетят», так как они привязаны к ссылке на элемент справочника, а не к строковому ключу.

Рекомендации по реализации надежного кода

При разработке серверной части обработки (модуля объекта) всегда проверяйте результат загрузки данных. Проанализируем ситуацию, когда настройки еще никогда не сохранялись. В этом случае метод Загрузить() вернет Неопределено.

Чтобы избежать аварийного завершения регламентного задания, используйте следующую конструкцию:


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

Важный совет: Если настройки обработки должны быть глобальными и их изменение требуется крайне редко, можно рассмотреть создание Константы с типом ХранилищеЗначения. Это обеспечит максимальную производительность, так как чтение констант кэшируется платформой.

Таким образом, выбор метода сохранения зависит от того, насколько часто будут меняться параметры и под каким пользователем запускается регламентное задание. Для простых задач в рамках одного пользователя подойдет ХранилищеНастроекДанныхФорм, а для надежной промышленной эксплуатации лучше использовать ХранилищеОбщихНастроек или механизмы БСП.

← На главную