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