В процессе разработки механизмов обмена данными или сложных регламентных заданий часто возникает необходимость хранить настройки, которые должны быть доступны одновременно и обычному пользователю (для ручного запуска), и «роботу» (для запуска по расписанию). Стандартное поведение платформы 1С предполагает разделение настроек по пользователям, что создает определенные трудности. В этой статье мы подробно разберем, как обойти это ограничение и реализовать единое хранилище настроек.
Платформа 1С предоставляет объект ХранилищеОбщихНастроек, который по умолчанию предназначен для хранения пользовательских предпочтений (состояние форм, фильтры и т.д.). Однако его методы Сохранить() и Загрузить() обладают важной особенностью: параметром ИмяПользователя.
Рассмотрим ситуацию: если мы не укажем имя пользователя, система запишет данные для текущего сеанса. Но если мы программно укажем «виртуальное» имя пользователя, настройки станут общими для всех, кто знает этот строковый идентификатор. Разберем по шагам, как это реализовать.
Проанализируем пример кода, который позволяет сохранять и восстанавливать настройки независимо от того, какой пользователь авторизован в данный момент:
Функция СохранитьХранимуюНастройку(ИмяНастройки, Значение) Экспорт
// Включаем привилегированный режим, чтобы иметь права на запись настроек
// от имени другого (пусть и виртуального) пользователя
УстановитьПривилегированныйРежим(Истина);
// В качестве четвертого параметра передаем уникальный ключ нашего "виртуального пользователя"
ХранилищеОбщихНастроек.Сохранить("Обмен_МойСклад_1С", ИмяНастройки, Значение, , "Обмен_МойСклад_1С");
КонецФункции
Функция ВосстановитьХранимуюНастройку(ИмяНастройки) Экспорт
УстановитьПривилегированныйРежим(Истина);
// Читаем данные, указывая тот же самый ключ в последнем параметре
Возврат ХранилищеОбщихНастроек.Загрузить("Обмен_МойСклад_1С", ИмяНастройки, , "Обмен_МойСклад_1С");
КонецФункции
В данном примере строка "Обмен_МойСклад_1С" выступает в роли идентификатора хранилища. Платформа 1С не проверяет, существует ли в списке пользователей ИБ пользователь с таким именем. Она просто создает запись в системной таблице, привязанную к этой строке.
Важно помнить, что если вы используете этот код внутри внешней обработки, загруженной в справочник Дополнительные отчеты и обработки (БСП), вы можете столкнуться с проблемой. По умолчанию такие обработки запускаются в безопасном режиме.
Выясним причину, почему это критично: в безопасном режиме метод УстановитьПривилегированныйРежим(Истина) просто игнорируется. Если у текущего пользователя нет прав «Администрирование данных», попытка записи настройки для другого (или виртуального) пользователя вызовет ошибку доступа.
Чтобы решить эту проблему, выполним следующие действия:
СведенияОВнешнейОбработке() установите параметр БезопасныйРежим = Ложь;.Если ваша конфигурация построена на базе БСП (например, БП 3.0, УТ 11, ERP), рассмотрим более «штатный» способ хранения. В справочнике ДополнительныеОтчетыИОбработки имеется реквизит ХранилищеНастроек (тип ХранилищеЗначения).
Это решение удобно тем, что настройки привязаны непосредственно к самому объекту обработки в базе данных. Посмотрим на алгоритм работы с этим реквизитом:
ДополнительныеОтчетыИОбработки, по которому запущена текущая обработка.ХранилищеНастроек этого элемента.Этот подход гарантирует, что настройки не «потеряются» при очистке кэша или системных таблиц хранилищ настроек, так как они являются частью обычных данных информационной базы.
Рассмотрим ситуацию, когда настроек много и они требуют сложной структуры. В этом случае использование ХранилищеОбщихНастроек может быть неоптимальным из-за ограничений на длину ключа (обычно до 128 символов) и особенностей кэширования платформой.
Проанализируем создание собственного регистра сведений для этих целей:
КлючНастройки (Строка) или УзелИнформационнойБазы.ЗначениеНастройки (Тип ХранилищеЗначения).Использование регистра дает следующие преимущества:
Подведем итог. Выбор метода зависит от ваших задач:
При использовании ХранилищеОбщихНастроек всегда проверяйте корректность передачи параметров, особенно КлючОбъекта и ИмяПользователя, так как любая опечатка приведет к созданию новой независимой ветки настроек, которую вы не сможете найти при загрузке.