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