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

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

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

Использование системного объекта ХранилищеОбщихНастроек

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

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

Проанализируем пример кода, который позволяет сохранять и восстанавливать настройки независимо от того, какой пользователь авторизован в данный момент:


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

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

В данном примере строка "Обмен_МойСклад_1С" выступает в роли идентификатора хранилища. Платформа 1С не проверяет, существует ли в списке пользователей ИБ пользователь с таким именем. Она просто создает запись в системной таблице, привязанную к этой строке.

Проблема безопасного режима во внешних обработках

Важно помнить, что если вы используете этот код внутри внешней обработки, загруженной в справочник Дополнительные отчеты и обработки (БСП), вы можете столкнуться с проблемой. По умолчанию такие обработки запускаются в безопасном режиме.

Выясним причину, почему это критично: в безопасном режиме метод УстановитьПривилегированныйРежим(Истина) просто игнорируется. Если у текущего пользователя нет прав «Администрирование данных», попытка записи настройки для другого (или виртуального) пользователя вызовет ошибку доступа.

Чтобы решить эту проблему, выполним следующие действия:

  1. Откроем карточку дополнительной обработки в интерфейсе системы.
  2. Переведем режим работы из «Безопасного» в «Небезопасный» (или укажите необходимые разрешения в профиле безопасности).
  3. Если вы разработчик и готовите обработку к регистрации, в функции СведенияОВнешнейОбработке() установите параметр БезопасныйРежим = Ложь;.

Альтернативный метод: Использование реквизита ХранилищеНастроек в БСП

Если ваша конфигурация построена на базе БСП (например, БП 3.0, УТ 11, ERP), рассмотрим более «штатный» способ хранения. В справочнике ДополнительныеОтчетыИОбработки имеется реквизит ХранилищеНастроек (тип ХранилищеЗначения).

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

  1. При открытии формы обработки программно считываем данные из элемента справочника ДополнительныеОтчетыИОбработки, по которому запущена текущая обработка.
  2. Помещаем структуру с настройками в реквизит ХранилищеНастроек этого элемента.
  3. При выполнении фонового задания считываем эти же данные.

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

Профессиональный подход: Регистр сведений

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

Проанализируем создание собственного регистра сведений для этих целей:

Использование регистра дает следующие преимущества:

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

Подведем итог. Выбор метода зависит от ваших задач:

  1. Для быстрой реализации в «бытовых» задачах используйте ХранилищеОбщихНастроек с указанием виртуального имени пользователя, как показано в коде выше. Не забывайте про отключение безопасного режима.
  2. Если вы работаете в рамках БСП и хотите тесной интеграции с механизмом дополнительных обработок, используйте реквизит ХранилищеНастроек в справочнике обработок.
  3. Для отказоустойчивых промышленных решений (интеграции, обмены) лучше создать отдельный Регистр сведений.

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

← На главную