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

Программист 1С v8.3 (Обычные формы)
← На главную

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

Разберем механизм хранения настроек в обычных формах

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

  1. Файловая база: Настройки записываются в локальный профиль пользователя операционной системы. Они хранятся в файлах с расширением .vrs по пути %AppData%\1C\1Cv8\.... Это делает их недоступными для сервера, если он запущен под другой учетной записью.
  2. Клиент-серверный вариант: Данные попадают в системную таблицу Files в базе данных SQL (учитывая объектные блокировки). Несмотря на то что они находятся в БД, они жестко привязаны к идентификатору пользователя 1С (UID) и ключу объекта.

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

Использование ХранилищаСистемныхНастроек для доступа к данным

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

Ключ объекта обычно имеет формат: НастройкаСохраненияЗначенийФормы.[ИмяОбъекта].[ИмяФормы]. Разберем по шагам, как прочитать эти данные из регламентного задания, зная имя пользователя, который сохранил настройки:


// Пример получения настроек конкретного пользователя
ИмяПользователяИсточник = "ИвановИИ"; // Тот, кто настраивал форму
КлючОбъекта = "НастройкаСохраненияЗначенийФормы.Обработка.МояОбработка.Форма";
КлючНастроек = ""; // Обычно пусто для стандартного сохранения

Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователяИсточник);

Если Настройки <> Неопределено Тогда
    // Настройки обычно возвращаются в виде структуры
    ПараметрДляЗадания = Настройки.НазваниеРеквизита;
КонецЕсли;

Важно помнить, что метод Загрузить может потребовать привилегированного режима, если текущий пользователь (под которым бежит регламент) не имеет прав на чтение настроек других пользователей. Используйте УстановитьПривилегированныйРежим(Истина) перед вызовом.

Специфика типовых решений (УПП, УТ 10.3, КА 1.1)

В конфигурациях, основанных на «старой» архитектуре (например, Управление производственным предприятием), существует дополнительный слой работы с настройками. Проанализируем возможности общего модуля УниверсальныеМеханизмы. Зачастую типовые обработки используют не только системное хранилище, но и специализированный регистр сведений СохраненныеНастройки.

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


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

Запрос.УстановитьПараметр("Пользователь", ПользовательСсылка);
Запрос.УстановитьПараметр("ИмяОбъекта", "МояОбработка");

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    СтруктураНастроек = Выборка.Настройка.Получить();
КонецЕсли;

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

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

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

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

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


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

Выясним причину возможных неудач

Если вы выполнили ХранилищеСистемныхНастроек.Загрузить, но получили Неопределено, обратите внимание на следующие моменты:

В завершение отметим: если вы проектируете новую систему «с нуля», старайтесь не завязываться на стандартный механизм «Сохранять значения» для регламентных заданий. Создайте отдельный справочник или регистр «Настройки регламентных заданий». Это позволит гибко управлять параметрами без привязки к конкретным пользователям и их локальным профилям Windows, обеспечивая стабильную работу серверного кода.

← На главную