При разработке и адаптации решений на платформе 1С нам часто требуется сохранять и восстанавливать пользовательские настройки, параметры форм или временные данные. Однако выбор подходящего механизма сохранения может быть неочевидным, особенно когда речь идет о доступности данных на клиенте и сервере, их надежности и долговечности. В этой статье мы подробно разберем основные методы сохранения и восстановления значений в 1С, проанализируем их особенности и области применения, чтобы вы могли выбрать наиболее подходящий для вашей задачи.
Давайте выясним, как работают различные механизмы и в каких случаях их следует применять.
СохранитьЗначение() и ВосстановитьЗначение()Исторически эти функции были одними из первых способов сохранения данных в 1С. Они просты в использовании, но имеют серьезные ограничения, которые важно учитывать.
Назначение и принцип работы:
СохранитьЗначение() и ВосстановитьЗначение() предназначены для сохранения значений в локальном профиле пользователя 1С на клиентском компьютере. Это означает, что данные записываются в файлы, расположенные, как правило, в каталоге пользователя операционной системы (например, C:\Users\<Имя пользователя Windows>\AppData\Roaming\1C\1Cv8\ для Windows 7 и выше).Ограничения и недостатки:
Когда использовать:
Мы рекомендуем использовать СохранитьЗначение() и ВосстановитьЗначение() только для:
Для всех остальных случаев, особенно для сохранения важных пользовательских настроек или параметров, доступных в разных сеансах и с разных компьютеров, следует использовать более надежные механизмы, включая использование ресурсов регистров сведений для хронологического хранения данных.
ПоместитьВоВременноеХранилище() и ПолучитьИзВременногоХранилища()Эти функции часто приходят на ум, когда нужна передача данных между клиентом и сервером, но их назначение принципиально отличается от сохранения постоянных настроек.
Назначение и принцип работы:
Ключевой недостаток – временность хранения:
Как следует из названия, "Временное хранилище" означает, что данные хранятся временно.
СохранитьЗначение / ВосстановитьЗначение для последующего восстановления в другом сеансе работы НЕЛЬЗЯ!Когда использовать:
Мы используем ПоместитьВоВременноеХранилище() и ПолучитьИзВременногоХранилища() для:
Для надежного и постоянного сохранения пользовательских настроек, которые должны быть доступны с любого рабочего места и в любом сеансе работы, платформа 1С:Предприятие 8.2 и выше предоставляет механизм хранилищ настроек. Это основной и наиболее рекомендуемый способ сохранения конфигурационных параметров и пользовательских предпочтений.
В 1С существует два основных типа хранилищ настроек (при этом также может быть внедрена подсистема предопределенных настроек):
СтандартноеХранилищеНастроекМенеджер / SystemSettingsStorage):
Это системное хранилище, которое используется платформой по умолчанию для сохранения различных настроек. Оно хранит данные в служебных таблицах информационной базы. К нему обращаются через глобальные объекты-менеджеры, предназначенные для конкретных типов настроек:
ХранилищеВариантовОтчетов (для вариантов отчетов СКД, см. также наименование отчета в конфигурации по справочнику Варианты отчетов)ХранилищеПользовательскихНастроекОтчетов (для пользовательских настроек отчетов)ХранилищеНастроекДанныхФорм (для настроек данных форм, где может пригодиться редактор форм в режиме предприятия)ХранилищеОбщихНастроек (для общих настроек, доступных всем пользователям)ХранилищеСистемныхНастроек (для системных настроек)ХранилищеПользовательскихНастроекДинамическихСписков (для настроек динамических списков)Платформа автоматически сохраняет многие настройки форм и отчетов в стандартных хранилищах, если соответствующие свойства (например, АвтоматическоеСохранениеДанных у формы) включены.
ХранилищеНастроекМенеджер.<ИмяХранилища> / SettingsStorage):
Разработчик может создавать собственные объекты метаданных типа "ХранилищеНастроек". Это дает полный контроль над механизмом хранения: можно определить собственную структуру хранения, настроить права доступа, реализовать дополнительную программную обработку и сохранять настройки для разных подсистем или объектов в отдельных хранилищах. Это удобно, когда стандартных возможностей недостаточно или требуется более сложная логика.
СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.МоеХранилище) доступны на клиенте, сервере и во внешнем соединении.Сохранить() и Загрузить(), а также методы, работающие с хранилищем (например, из общих модулей БСП), обычно выполняются на стороне сервера. Это гарантирует целостность данных и управляемость доступом. Соответственно, при работе в управляемых формах нам придется использовать серверные процедуры или функции для взаимодействия с хранилищем.Для сохранения и восстановления настроек через объекты-менеджеры хранилищ мы используем следующие методы:
1. Для сохранения настроек:
У объектов-менеджеров хранилищ есть метод Сохранить():
СтандартноеХранилищеНастроекМенеджер.Сохранить(Значение, Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);
Или для пользовательского хранилища:
ХранилищеНастроекМенеджер.МоеХранилище.Сохранить(Значение, Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);
Значение: Произвольное сериализуемое значение, которое мы хотим сохранить (например, структура, соответствие, таблица значений, массив).Ключ: Строковый ключ, по которому будет идентифицироваться наша настройка. Мы сами определяем этот ключ.ИмяПользователя: Имя пользователя 1С, для которого сохраняется настройка (если Неопределено, то для текущего пользователя).ИмяПриложения: Имя приложения, из которого производится сохранение (например, "Клиент тонкий", "Клиент толстый", "Веб-клиент"). Это позволяет хранить разные настройки для разных типов клиентов.ПроизвольныйИдентификатор: Дополнительный идентификатор, который позволяет уточнить, для какого объекта или формы сохраняется настройка.2. Для восстановления настроек:
Для загрузки сохраненных настроек используется метод Загрузить():
ЗначениеНастроек = СтандартноеХранилищеНастроекМенеджер.Загрузить(Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);
Или для пользовательского хранилища:
ЗначениеНастроек = ХранилищеНастроекМенеджер.МоеХранилище.Загрузить(Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор);
Параметры Ключ, ИмяПользователя, ИмяПриложения, ПроизвольныйИдентификатор должны совпадать с теми, которые были указаны при сохранении, чтобы корректно найти нужную настройку.
Для внешних обработок и отчетов, особенно если они разрабатываются на управляемых формах (для 1С:Предприятие 8.2 и выше), также рекомендуется использовать хранилища настроек. Если мы переконвертировали обработку из 8.1, где использовались СохранитьЗначение(), нам нужно будет переписать логику сохранения и восстановления настроек с использованием серверных вызовов к хранилищам настроек.
Пример интеграции во внешнюю обработку:
// В модуле формы внешней обработки
&НаСервере
Процедура СохранитьНастройкиНаСервере(ЗначенияНастроек)
СтандартноеХранилищеНастроекМенеджер.Сохранить(ЗначенияНастроек, "МоиНастройкиВнешнейОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
// Или так, если у нас есть свой объект метаданных "ХранилищеНастроек"
// ХранилищеНастроекМенеджер.МоеХранилище.Сохранить(ЗначенияНастроек, "МоиНастройкиОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
КонецПроцедуры
&НаСервере
Функция ЗагрузитьНастройкиНаСервере()
Возврат СтандартноеХранилищеНастроекМенеджер.Загрузить("МоиНастройкиВнешнейОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
// Или так
// Возврат ХранилищеНастроекМенеджер.МоеХранилище.Загрузить("МоиНастройкиОбработки", Неопределено, Неопределено, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура КомандаСохранить(Команда)
// Собираем значения из реквизитов формы в структуру
ЗначенияНастроек = Новый Структура;
ЗначенияНастроек.Вставить("Реквизит1", Реквизит1);
ЗначенияНастроек.Вставить("Реквизит2", Реквизит2);
// ... и так далее для всех параметров
СохранитьНастройкиНаСервере(ЗначенияНастроек);
КонецПроцедуры
&НаКлиенте
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) // или другой подходящий обработчик
ЗначенияНастроек = ЗагрузитьНастройкиНаСервере();
Если ЗначенияНастроек <> Неопределено Тогда
// Заполняем реквизиты формы из загруженной структуры
Для Каждого КлючИЗначение Из ЗначенияНастроек Цикл
Попытка
ЭтотОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
Исключение
// Возможно, реквизит формы уже не существует или имеет другой тип
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
УникальныйИдентификатор. Часто в качестве него используется УникальныйИдентификатор самого внешнего отчета/обработки или его имя. Это позволяет различать настройки разных экземпляров или версий одной и той же обработки. Например, для внешней обработки это может быть ЭтотОбъект.УникальныйИдентификатор, или генерируемый GUID, или просто уникальная строка.
ОбщегоНазначения.ХранилищеНастроекДанныхФорм...В типовых конфигурациях, использующих Библиотеку стандартных подсистем (БСП), часто предоставляются удобные процедуры-обертки для работы с хранилищами настроек, например:
ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить(...)ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(...)ОбщегоНазначения.ХранилищеНастроекДанныхФормУдалить(...)Эти процедуры упрощают работу, так как инкапсулируют логику формирования ключей, обработки ошибок и взаимодействия со СтандартноеХранилищеНастроекМенеджер. Они могут поддерживать более длинные ключи настроек, используя хеширование, что полезно для сложных форм. Мы рекомендуем использовать их, если ваша конфигурация включает БСП, так как они обеспечивают стандартизированный и надежный подход к сохранению настроек форм.
Пример использования процедур БСП:
// В серверной процедуре
ЗначенияФормы = Новый Структура;
ЗначенияФормы.Вставить("ДатаНачала", Объект.ДатаНачала);
ЗначенияФормы.Вставить("Организация", Объект.Организация);
// ... добавить другие реквизиты формы
// Параметры для формирования ключа настроек
ПараметрыСохранения = Новый Структура;
ПараметрыСохранения.Вставить("КлючНастроек", "МоиНастройкиОбработки"); // Уникальный ключ для этой формы/обработки
ПараметрыСохранения.Вставить("ИмяОбъектаНастроек", "ВнешняяОбработка_ПримерНастроек"); // Имя объекта, к которому относятся настройки
ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить(ЗначенияФормы, ПараметрыСохранения);
// Для загрузки
ЗначенияФормыЗагруженные = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить(ПараметрыСохранения);
Если ЗначенияФормыЗагруженные <> Неопределено Тогда
// Заполняем реквизиты формы
Объект.ДатаНачала = ЗначенияФормыЗагруженные.ДатаНачала;
Объект.Организация = ЗначенияФормыЗагруженные.Организация;
КонецЕсли;
Обратите внимание, что эти процедуры требуют передачи параметров в виде структур, что делает код более гибким и читаемым.
Мы видим, что в 1С существует несколько механизмов для работы со значениями, и выбор каждого из них зависит от конкретной задачи:
СохранитьЗначение() / ВосстановитьЗначение(), но с осознанием их ненадежности.ПоместитьВоВременноеХранилище() / ПолучитьИзВременногоХранилища(). Эти функции не подходят для постоянных настроек.СтандартноеХранилищеНастроекМенеджер или собственные объекты метаданных "ХранилищеНастроек"). Это наиболее универсальный и рекомендуемый способ, который работает в управляемых формах через серверные вызовы.При переходе от старых механизмов к новым или при разработке новых решений, всегда отдавайте предпочтение хранилищам настроек, чтобы обеспечить максимальную надежность, доступность и масштабируемость ваших конфигураций.