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