Как правильно сохранить и восстановить положение переключателя на форме в 1С

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

При разработке пользовательских интерфейсов в 1С:Предприятии 8 нередко возникает задача предоставить пользователю выбор из нескольких взаимоисключающих вариантов (например, выбор метода списания: ФИФО или ЛИФО). Для этого часто используется элемент управления Поле переключателя. Однако начинающие разработчики нередко сталкиваются с ситуацией, когда выбор пользователя не восстанавливается при повторном открытии формы, переключатель всегда встает в одно и то же начальное значение или обработчики событий вовсе не выполняются.

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

Типичные ошибки при ручном управлении переключателем

Рассмотрим распространенный сценарий: на форме размещен реквизит МетодСписания (тип Число), для которого элемент управления оформлен в виде переключателя со списком выбора (0 — ФИФО, 1 — ЛИФО). Для хранения состояния в конфигурацию добавлены две булевы константы: МТ_ФИФО и МТ_ЛИФО.

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)    
    МСписание = МСписание(); 
    Если МСписание = 1 Тогда
        МетодСписания = 0;
    Иначе 
        МетодСписания = 1;
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция МСписание()    
    ФИФО = Константы.МТ_ФИФО.Получить();
    ЛИФО = Константы.МТ_ЛИФО.Получить();
    Если ФИФО = Истина Тогда 
        Возврат 1;
    Иначе
        Возврат 0;
    КонецЕсли;     
КонецФункции

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

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

Решение 1. Оптимальная архитектура: использование перечисления и константы без кода

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

Разберем по шагам, как настроить такую схему:

  1. Создадим объект метаданных Перечисление с именем МетодыСписания и двумя значениями: ФИФО и ЛИФО.
  2. Создадим объект метаданных Константа с именем МетодСписания, указав в качестве типа созданное перечисление: ПеречислениеСсылка.МетодыСписания.
  3. Создадим форму (например, общую форму настроек) и добавим в ее основные реквизиты объект с типом КонстантаМенеджерЗначения.МетодСписания.
  4. Перетащим ветку Значение этой константы в дерево элементов формы.
  5. В палитре свойств созданного элемента управления установим свойство Вид в значение Поле переключателя.

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

Решение 2. Инициализация и сохранение значения через события формы

Если по каким-либо причинам требуется оставить текущую структуру реквизитов формы, приведем программный код к правильным стандартам разработки под управляемые формы.

Рассмотрим корректную схему чтения данных при открытии и записи при закрытии:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Инициализируем переключатель сразу на сервере при сборке формы
    Если Константы.МТ_ФИФО.Получить() Тогда
        МетодСписания = 0; // Индекс или значение для ФИФО
    Иначе
        МетодСписания = 1; // Индекс или значение для ЛИФО
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
    СохранитьНастройкиНаСервере(МетодСписания);
    ЭтаФорма.Закрыть();
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройкиНаСервере(ЗначениеВыбора)
    Если ЗначениеВыбора = 0 Тогда
        Константы.МТ_ФИФО.Установить(Истина);
        Константы.МТ_ЛИФО.Установить(Ложь);
    Иначе
        Константы.МТ_ФИФО.Установить(Ложь);
        Константы.МТ_ЛИФО.Установить(Истина);
    КонецЕсли;
КонецПроцедуры

Обратите внимание: обработчик ПриСозданииНаСервере должен быть обязательно назначен в палитре свойств формы. Это исключает лишний контекстный вызов сервера с клиента, который ранее выполнялся из ПриОткрытии.

Решение 3. Сохранение положения переключателя в пользовательских настройках

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

Проанализируем шаги настройки штатного сохранения:

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

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

← На главную