Как заменить методы СохранитьЗначения() и ВосстановитьЗначения() в тонком клиенте 1С?

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

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

Типичные ошибки при использовании ХранилищеОбщихНастроек

Для программного управления настройками в тонком клиенте разработчики часто обращаются к глобальному объекту ХранилищеОбщихНастроек. Однако при первом написании кода нередко допускаются две критические ошибки:

  1. Использование динамического идентификатора формы: Обращение к свойству ЭтаФорма.УникальныйИдентификатор генерирует новый UUID при каждом новом открытии формы. В результате данные сохраняются под ключом, который при следующем запуске больше никогда не повторится, и прочитать их обратно невозможно.
  2. Передача ссылки на справочник пользователей: Параметр ИмяПользователя в методах ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить() ожидает строковое системное имя (результат функции ИмяПользователя()), а не ссылку из ПараметрыСеанса.ТекущийПользователь. Более того, если передавать имя пользователя явно, платформе потребуются административные права. Если этот параметр оставить пустым, система автоматически сохранит настройки для текущего активного пользователя без лишних проверок прав.

Способ 1. Программное сохранение через ХранилищеОбщихНастроек с фиксированным ключом

Рассмотрим, как правильно вызывать методы сохранения и загрузки. В качестве ключа объекта следует использовать постоянную строку — например, полное имя метаданных формы или фиксированный строковый идентификатор.

Пример программного восстановления настроек при открытии формы:


&НаСервере
Процедура ЗагрузитьНастройкиНаСервере()
    КлючОбъекта = "Обработка.ПрайсыКонкурентов.Форма.Форма";
    КлючНастроек = "СписокЗначенийПрайсыКонкурентов";
    
    // Если пользователь не указан, берется текущий пользователь сеанса
    СохраненныйСписок = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
    
    Если ЗначениеЗаполнено(СохраненныйСписок) Тогда
        РеквизитСписок.ЗагрузитьЗначения(СохраненныйСписок.ВыгрузитьЗначения());
    КонецЕсли;
КонецПроцедуры

Пример сохранения данных перед закрытием формы:


&НаСервере
Процедура СохранитьНастройкиНаСервере()
    КлючОбъекта = "Обработка.ПрайсыКонкурентов.Форма.Форма";
    КлючНастроек = "СписокЗначенийПрайсыКонкурентов";
    
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, РеквизитСписок);
КонецПроцедуры

Способ 2. Использование штатных событий управляемой формы

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

Разберем по шагам настройку стандартного сохранения:

  1. Откроем палитру свойств самой управляемой формы.
  2. Установим свойство АвтоматическоеСохранениеДанныхВНастройках в значение Использовать.
  3. Создадим на сервере два обработчика событий формы: ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.

Посмотрим на пример кода в модуле формы:


&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    // В структуру Настройки передаем нужные значения
    Настройки.Вставить("СписокЗначенийПрайсыКонкурентов", РеквизитСписок);
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    СохраненныеЗначения = Неопределено;
    Если Настройки.Свойство("СписокЗначенийПрайсыКонкурентов", СохраненныеЗначения) Тогда
        Если ЗначениеЗаполнено(СохраненныеЗначения) Тогда
            РеквизитСписок.ЗагрузитьЗначения(СохраненныеЗначения.ВыгрузитьЗначения());
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Способ 3. Автоматическое сохранение через свойства реквизитов формы

Если сохраняемые данные хранятся не во временных переменных модуля, а являются полноценными реквизитами формы (например, реквизит с типом СписокЗначений, Строка, Число), можно обойтись вовсе без написания кода:

  1. В свойствах формы включаем АвтоматическоеСохранениеДанныхВНастройках (значение Использовать).
  2. В палитре свойств конкретного реквизита формы находим пункт Сохранение и устанавливаем флаг СохранятьДанные.

Если данные заполняются в элементах табличной части или таблицы значений, достаточно выгрузить их в отдельный реквизит формы типа СписокЗначений или Массив перед завершением работы, и платформа сохранит их автоматически.

Важные ограничения и особенности

Проанализируем ключевые нюансы, о которых важно помнить при работе с настройками в тонком клиенте:

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