Как сохранить и восстановить настройки в 1С на сервере и клиенте: сравнение механизмов СохранитьЗначение, ПоместитьВоВременноеХранилище и ХранилищеНастроек?

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

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

Давайте выясним, как работают различные механизмы и в каких случаях их следует применять.

1. Сохранение и восстановление значений с помощью функций СохранитьЗначение() и ВосстановитьЗначение()

Исторически эти функции были одними из первых способов сохранения данных в 1С. Они просты в использовании, но имеют серьезные ограничения, которые важно учитывать.

Назначение и принцип работы:

  1. Локальное хранение: Функции СохранитьЗначение() и ВосстановитьЗначение() предназначены для сохранения значений в локальном профиле пользователя 1С на клиентском компьютере. Это означает, что данные записываются в файлы, расположенные, как правило, в каталоге пользователя операционной системы (например, C:\Users\<Имя пользователя Windows>\AppData\Roaming\1C\1Cv8\ для Windows 7 и выше).
  2. Привязка к связке "база-пользователь-компьютер": Сохраненные данные привязаны к конкретной информационной базе, конкретному пользователю 1С и конкретному компьютеру, на котором они были сохранены.
  3. Доступность: Эти функции доступны преимущественно в толстом клиенте. Их использование в тонком клиенте или веб-клиенте сильно ограничено или невозможно, поскольку они не имеют прямого доступа к локальной файловой системе пользователя в той же мере.

Ограничения и недостатки:

  1. Ненадежность: Локальные профили пользователей Windows подвержены повреждениям или "слетанию" по разным причинам (сбои системы, некорректное завершение работы, ошибки диска). Это может привести к безвозвратной потере сохраненных данных.
  2. Привязка к компьютеру: Сохраненные настройки доступны только на том компьютере, где они были созданы. Если пользователь 1С переходит на другой компьютер или даже заходит под другой учетной записью Windows на том же компьютере, сохраненные данные становятся недоступными для него.
  3. Не подходят для серверного доступа: На вопрос, можно ли "достучаться" до таких настроек с сервера, ответ однозначен: нет. Сервер 1С не имеет доступа к локальному профилю клиента. Эти функции не предназначены для обмена данными между клиентом и сервером или для хранения настроек, которые должны быть доступны со всех рабочих мест.
  4. Ограничения по размеру: Хотя напрямую не указано, существуют практические ограничения на объем данных, которые имеет смысл сохранять таким способом, особенно если это сложные объекты или большие таблицы значений.

Когда использовать:

Мы рекомендуем использовать СохранитьЗначение() и ВосстановитьЗначение() только для:

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

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

2. Временное хранение данных: ПоместитьВоВременноеХранилище() и ПолучитьИзВременногоХранилища()

Эти функции часто приходят на ум, когда нужна передача данных между клиентом и сервером, но их назначение принципиально отличается от сохранения постоянных настроек.

Назначение и принцип работы:

  1. Обмен данными между клиентом и сервером: Основная цель этих функций — обеспечить эффективный и безопасный обмен данными между клиентским и серверным контекстом. Они широко используются для передачи больших объемов данных, таких как файлы, таблицы значений, двоичные данные, между клиентом и сервером без необходимости сериализации/десериализации на каждом шаге.
  2. Хранение на сервере: Данные помещаются во временное хранилище на сервере 1С. Клиенту возвращается лишь уникальный адрес (идентификатор) этих данных в хранилище.
  3. Доступность: Эти методы доступны как на клиенте, так и на сервере, что делает их очень удобными для асинхронных операций и передачи данных в фоновые задания.

Ключевой недостаток – временность хранения:

Как следует из названия, "Временное хранилище" означает, что данные хранятся временно.

  1. Обычно данные удаляются после первого же считывания по указанному адресу.
  2. Если данные привязаны к форме, они существуют до закрытия этой формы.
  3. В любом случае, данные не предназначены для долгосрочного хранения и не сохраняются между сеансами работы пользователя. Использовать эти функции для сохранения настроек наподобие СохранитьЗначение / ВосстановитьЗначение для последующего восстановления в другом сеансе работы НЕЛЬЗЯ!

Когда использовать:

Мы используем ПоместитьВоВременноеХранилище() и ПолучитьИзВременногоХранилища() для:

  1. Передачи файлов с клиента на сервер и обратно.
  2. Обмена большими таблицами значений или объектами между клиентским и серверным кодом в рамках одного сеанса.
  3. Обеспечения работы фоновых заданий, которым нужно вернуть результат в текущий сеанс пользователя.

3. Надежное хранение настроек в базе данных: Объекты "ХранилищеНастроек"

Для надежного и постоянного сохранения пользовательских настроек, которые должны быть доступны с любого рабочего места и в любом сеансе работы, платформа 1С:Предприятие 8.2 и выше предоставляет механизм хранилищ настроек. Это основной и наиболее рекомендуемый способ сохранения конфигурационных параметров и пользовательских предпочтений.

3.1. Типы хранилищ настроек

В 1С существует два основных типа хранилищ настроек (при этом также может быть внедрена подсистема предопределенных настроек):

  1. Стандартное хранилище настроек (СтандартноеХранилищеНастроекМенеджер / SystemSettingsStorage):

    Это системное хранилище, которое используется платформой по умолчанию для сохранения различных настроек. Оно хранит данные в служебных таблицах информационной базы. К нему обращаются через глобальные объекты-менеджеры, предназначенные для конкретных типов настроек:

    • ХранилищеВариантовОтчетов (для вариантов отчетов СКД, см. также наименование отчета в конфигурации по справочнику Варианты отчетов)
    • ХранилищеПользовательскихНастроекОтчетов (для пользовательских настроек отчетов)
    • ХранилищеНастроекДанныхФорм (для настроек данных форм, где может пригодиться редактор форм в режиме предприятия)
    • ХранилищеОбщихНастроек (для общих настроек, доступных всем пользователям)
    • ХранилищеСистемныхНастроек (для системных настроек)
    • ХранилищеПользовательскихНастроекДинамическихСписков (для настроек динамических списков)

    Платформа автоматически сохраняет многие настройки форм и отчетов в стандартных хранилищах, если соответствующие свойства (например, АвтоматическоеСохранениеДанных у формы) включены.

  2. Пользовательские хранилища настроек (ХранилищеНастроекМенеджер.<ИмяХранилища> / SettingsStorage):

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

3.2. Доступность и место хранения

  1. Место хранения: Главное отличие и преимущество хранилищ настроек заключается в том, что данные хранятся непосредственно в информационной базе. Это обеспечивает их высокую надежность и доступность.
  2. Независимость: Настройки, сохраненные таким образом, не зависят от компьютера, с которого работает пользователь, и от его учетной записи Windows. Пользователь 1С увидит свои настройки, войдя в базу с любого рабочего места.
  3. Доступность объектов-менеджеров: Объекты-менеджеры хранилищ настроек (например, СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.МоеХранилище) доступны на клиенте, сервере и во внешнем соединении.
  4. Доступность методов сохранения/загрузки: Сами методы Сохранить() и Загрузить(), а также методы, работающие с хранилищем (например, из общих модулей БСП), обычно выполняются на стороне сервера. Это гарантирует целостность данных и управляемость доступом. Соответственно, при работе в управляемых формах нам придется использовать серверные процедуры или функции для взаимодействия с хранилищем.

3.3. Методы для работы с хранилищами настроек

Для сохранения и восстановления настроек через объекты-менеджеры хранилищ мы используем следующие методы:

1. Для сохранения настроек:

У объектов-менеджеров хранилищ есть метод Сохранить():


СтандартноеХранилищеНастроекМенеджер.Сохранить(Значение, Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);

Или для пользовательского хранилища:


ХранилищеНастроекМенеджер.МоеХранилище.Сохранить(Значение, Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);
  1. Значение: Произвольное сериализуемое значение, которое мы хотим сохранить (например, структура, соответствие, таблица значений, массив).
  2. Ключ: Строковый ключ, по которому будет идентифицироваться наша настройка. Мы сами определяем этот ключ.
  3. ИмяПользователя: Имя пользователя 1С, для которого сохраняется настройка (если Неопределено, то для текущего пользователя).
  4. ИмяПриложения: Имя приложения, из которого производится сохранение (например, "Клиент тонкий", "Клиент толстый", "Веб-клиент"). Это позволяет хранить разные настройки для разных типов клиентов.
  5. ПроизвольныйИдентификатор: Дополнительный идентификатор, который позволяет уточнить, для какого объекта или формы сохраняется настройка.

2. Для восстановления настроек:

Для загрузки сохраненных настроек используется метод Загрузить():


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

Или для пользовательского хранилища:


ЗначениеНастроек = ХранилищеНастроекМенеджер.МоеХранилище.Загрузить(Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);

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

3.4. Использование с внешними обработками и отчетами

Для внешних обработок и отчетов, особенно если они разрабатываются на управляемых формах (для 1С:Предприятие 8.2 и выше), также рекомендуется использовать хранилища настроек. Если мы переконвертировали обработку из 8.1, где использовались СохранитьЗначение(), нам нужно будет переписать логику сохранения и восстановления настроек с использованием серверных вызовов к хранилищам настроек.

Пример интеграции во внешнюю обработку:

  1. Создайте серверные процедуры: В модуле формы внешней обработки (или в отдельном общем модуле, если это уместно) создайте серверные процедуры для сохранения и загрузки настроек.
    
    // В модуле формы внешней обработки
    &НаСервере
    Процедура СохранитьНастройкиНаСервере(ЗначенияНастроек)
        СтандартноеХранилищеНастроекМенеджер.Сохранить(ЗначенияНастроек, "МоиНастройкиВнешнейОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
        // Или так, если у нас есть свой объект метаданных "ХранилищеНастроек"
        // ХранилищеНастроекМенеджер.МоеХранилище.Сохранить(ЗначенияНастроек, "МоиНастройкиОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
    КонецПроцедуры
    
    &НаСервере
    Функция ЗагрузитьНастройкиНаСервере()
        Возврат СтандартноеХранилищеНастроекМенеджер.Загрузить("МоиНастройкиВнешнейОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
        // Или так
        // Возврат ХранилищеНастроекМенеджер.МоеХранилище.Загрузить("МоиНастройкиОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
    КонецФункции
    
  2. Вызывайте с клиента: Из обработчиков команд формы (например, при нажатии кнопки "Сохранить" или при закрытии формы) вызывайте эти серверные процедуры.
    
    &НаКлиенте
    Процедура КомандаСохранить(Команда)
        // Собираем значения из реквизитов формы в структуру
        ЗначенияНастроек = Новый Структура;
        ЗначенияНастроек.Вставить("Реквизит1", Реквизит1);
        ЗначенияНастроек.Вставить("Реквизит2", Реквизит2);
        // ... и так далее для всех параметров
    
        СохранитьНастройкиНаСервере(ЗначенияНастроек);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) // или другой подходящий обработчик
        ЗначенияНастроек = ЗагрузитьНастройкиНаСервере();
        Если ЗначенияНастроек <> Неопределено Тогда
            // Заполняем реквизиты формы из загруженной структуры
            Для Каждого КлючИЗначение Из ЗначенияНастроек Цикл
                Попытка
                    ЭтотОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
                Исключение
                    // Возможно, реквизит формы уже не существует или имеет другой тип
                КонецПопытки;
            КонецЦикла;
        КонецЕсли;
    КонецПроцедуры
    
  3. УникальныйИдентификатор: Для внешних обработок и отчетов особенно важно корректно определить УникальныйИдентификатор. Часто в качестве него используется УникальныйИдентификатор самого внешнего отчета/обработки или его имя. Это позволяет различать настройки разных экземпляров или версий одной и той же обработки. Например, для внешней обработки это может быть ЭтотОбъект.УникальныйИдентификатор, или генерируемый GUID, или просто уникальная строка.

3.5. Вспомогательные процедуры из БСП: ОбщегоНазначения.ХранилищеНастроекДанныхФорм...

В типовых конфигурациях, использующих Библиотеку стандартных подсистем (БСП), часто предоставляются удобные процедуры-обертки для работы с хранилищами настроек, например:

Эти процедуры упрощают работу, так как инкапсулируют логику формирования ключей, обработки ошибок и взаимодействия со СтандартноеХранилищеНастроекМенеджер. Они могут поддерживать более длинные ключи настроек, используя хеширование, что полезно для сложных форм. Мы рекомендуем использовать их, если ваша конфигурация включает БСП, так как они обеспечивают стандартизированный и надежный подход к сохранению настроек форм.

Пример использования процедур БСП:


// В серверной процедуре
ЗначенияФормы = Новый Структура;
ЗначенияФормы.Вставить("ДатаНачала", Объект.ДатаНачала);
ЗначенияФормы.Вставить("Организация", Объект.Организация);
// ... добавить другие реквизиты формы

// Параметры для формирования ключа настроек
ПараметрыСохранения = Новый Структура;
ПараметрыСохранения.Вставить("КлючНастроек", "МоиНастройкиОбработки"); // Уникальный ключ для этой формы/обработки
ПараметрыСохранения.Вставить("ИмяОбъектаНастроек", "ВнешняяОбработка_ПримерНастроек"); // Имя объекта, к которому относятся настройки

ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить(ЗначенияФормы, ПараметрыСохранения);

// Для загрузки
ЗначенияФормыЗагруженные = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(ПараметрыСохранения);
Если ЗначенияФормыЗагруженные <> Неопределено Тогда
    // Заполняем реквизиты формы
    Объект.ДатаНачала = ЗначенияФормыЗагруженные.ДатаНачала;
    Объект.Организация = ЗначенияФормыЗагруженные.Организация;
КонецЕсли;

Обратите внимание, что эти процедуры требуют передачи параметров в виде структур, что делает код более гибким и читаемым.

Выводы и рекомендации

Мы видим, что в 1С существует несколько механизмов для работы со значениями, и выбор каждого из них зависит от конкретной задачи:

  1. Для временного, локального хранения небольших, несущественных данных, привязанных к конкретному компьютеру и пользователю в толстом клиенте, мы можем использовать СохранитьЗначение() / ВосстановитьЗначение(), но с осознанием их ненадежности.
  2. Для кратковременного обмена данными между клиентом и сервером в рамках одного сеанса, особенно для больших объемов или файлов, мы применяем ПоместитьВоВременноеХранилище() / ПолучитьИзВременногоХранилища(). Эти функции не подходят для постоянных настроек.
  3. Для надежного, постоянного хранения пользовательских и системных настроек, доступных с любого рабочего места и в любом сеансе, мы должны использовать объекты "ХранилищеНастроек" (СтандартноеХранилищеНастроекМенеджер или собственные объекты метаданных "ХранилищеНастроек"). Это наиболее универсальный и рекомендуемый способ, который работает в управляемых формах через серверные вызовы.

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

← На главную