При разработке механизмов автоматизации часто возникает ситуация, когда пользователю удобно настроить параметры отчета или обработки в интерактивном режиме (через обычную форму), а затем он хочет, чтобы регламентное задание выполнялось с теми же самыми параметрами. Однако стандартный механизм «Сохранять значения», встроенный в обычные формы, работает не совсем очевидно для серверного контекста. В этой статье мы подробно разберем, где физически хранятся эти настройки и как их корректно «подцепить» в фоновом задании, не снимая конфигурацию с поддержки.
Для начала проанализируем, как работает флаг Сохранять значения в свойствах обычной формы. Когда пользователь нажимает кнопку «Сохранить значения» или закрывает форму с установленным флагом автоматического сохранения, система 1С записывает данные в зависимости от типа базы:
.vrs по пути %AppData%\1C\1Cv8\.... Это делает их недоступными для сервера, если он запущен под другой учетной записью.Files в базе данных SQL (учитывая объектные блокировки). Несмотря на то что они находятся в БД, они жестко привязаны к идентификатору пользователя 1С (UID) и ключу объекта.Основная проблема заключается в том, что регламентное задание запускается от имени специального пользователя (например, «Робот» или учетная запись службы 1С), у которого свой собственный пустой профиль настроек. Поэтому настройки «Васи» никогда не подтянутся в сеанс «Робота» автоматически.
Рассмотрим программный способ извлечения данных, которые были сохранены стандартными средствами формы. Даже если вы не нашли их в явном виде через консоль запросов, они доступны через объект ХранилищеСистемныхНастроек. Выясним причину, по которой поиск по стандартным ключам часто не дает результата: для обычных форм путь к настройкам формируется специфически.
Ключ объекта обычно имеет формат: НастройкаСохраненияЗначенийФормы.[ИмяОбъекта].[ИмяФормы]. Разберем по шагам, как прочитать эти данные из регламентного задания, зная имя пользователя, который сохранил настройки:
// Пример получения настроек конкретного пользователя
ИмяПользователяИсточник = "ИвановИИ"; // Тот, кто настраивал форму
КлючОбъекта = "НастройкаСохраненияЗначенийФормы.Обработка.МояОбработка.Форма";
КлючНастроек = ""; // Обычно пусто для стандартного сохранения
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователяИсточник);
Если Настройки <> Неопределено Тогда
// Настройки обычно возвращаются в виде структуры
ПараметрДляЗадания = Настройки.НазваниеРеквизита;
КонецЕсли;
Важно помнить, что метод Загрузить может потребовать привилегированного режима, если текущий пользователь (под которым бежит регламент) не имеет прав на чтение настроек других пользователей. Используйте УстановитьПривилегированныйРежим(Истина) перед вызовом.
В конфигурациях, основанных на «старой» архитектуре (например, Управление производственным предприятием), существует дополнительный слой работы с настройками. Проанализируем возможности общего модуля УниверсальныеМеханизмы. Зачастую типовые обработки используют не только системное хранилище, но и специализированный регистр сведений СохраненныеНастройки.
Посмотрим, как можно программно обратиться к этому регистру. Данные в нем хранятся в виде ХранилищаЗначения, что позволяет помещать туда сложные структуры данных, массивы и таблицы значений.
// Чтение из регистра СохраненныеНастройки в УПП
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройки.СохранениеНастройки КАК Настройка
|ИЗ
| РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
|ГДЕ
| СохраненныеНастройки.Пользователь = &Пользователь
| И СохраненныеНастройки.ИмяОбъекта = &ИмяОбъекта";
Запрос.УстановитьПараметр("Пользователь", ПользовательСсылка);
Запрос.УстановитьПараметр("ИмяОбъекта", "МояОбработка");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтруктураНастроек = Выборка.Настройка.Получить();
КонецЕсли;
Если ваша обработка находится на поддержке и вы не хотите менять ее код, проверьте, не использует ли она функции УниверсальныеМеханизмы.ПолучитьНастройку(). Если да, то данные гарантированно лежат в вышеуказанном регистре.
Поскольку регламентное задание не имеет формы, мы не можем вызвать метод Открыть(), чтобы сработали стандартные механизмы восстановления. Рассмотрим стратегию «Обертки», которая позволит сохранить обработку на поддержке в неизменном виде:
ХранилищеСистемныхНастроек.Загрузить или запрос к регистру СохраненныеНастройки для получения параметров.Проанализируем пример вызова типовой процедуры обработки с передачей параметров:
Процедура ВыполнитьОбработкуПоРегламенту() Экспорт
// 1. Получаем настройки (допустим, из регистра)
Параметры = ПолучитьПараметрыИзНастроек("Администратор", "ЗагрузкаДанных");
// 2. Создаем объект обработки
ОбработкаОбъект = Обработки.ЗагрузкаДанных.Создать();
// 3. Заполняем реквизиты объекта полученными данными
ЗаполнитьЗначенияСвойств(ОбработкаОбъект, Параметры);
// 4. Вызываем основной алгоритм
ОбработкаОбъект.ВыполнитьЗагрузку();
КонецПроцедуры
Если вы выполнили ХранилищеСистемныхНастроек.Загрузить, но получили Неопределено, обратите внимание на следующие моменты:
ПередСохранениемЗначений или через замер производительности.В завершение отметим: если вы проектируете новую систему «с нуля», старайтесь не завязываться на стандартный механизм «Сохранять значения» для регламентных заданий. Создайте отдельный справочник или регистр «Настройки регламентных заданий». Это позволит гибко управлять параметрами без привязки к конкретным пользователям и их локальным профилям Windows, обеспечивая стабильную работу серверного кода.