При разработке пользовательских интерфейсов в 1С:Предприятии 8 нередко возникает задача предоставить пользователю выбор из нескольких взаимоисключающих вариантов (например, выбор метода списания: ФИФО или ЛИФО). Для этого часто используется элемент управления Поле переключателя. Однако начинающие разработчики нередко сталкиваются с ситуацией, когда выбор пользователя не восстанавливается при повторном открытии формы, переключатель всегда встает в одно и то же начальное значение или обработчики событий вовсе не выполняются.
Разберем типичные ошибки при реализации подобной логики, проанализируем, почему код может не работать, и рассмотрим наиболее оптимальные способы привязки переключателя к данным конфигурации.
Рассмотрим распространенный сценарий: на форме размещен реквизит МетодСписания (тип Число), для которого элемент управления оформлен в виде переключателя со списком выбора (0 — ФИФО, 1 — ЛИФО). Для хранения состояния в конфигурацию добавлены две булевы константы: МТ_ФИФО и МТ_ЛИФО.
Посмотрим на пример кода, с помощью которого разработчик пытается инициализировать форму:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
МСписание = МСписание();
Если МСписание = 1 Тогда
МетодСписания = 0;
Иначе
МетодСписания = 1;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция МСписание()
ФИФО = Константы.МТ_ФИФО.Получить();
ЛИФО = Константы.МТ_ЛИФО.Получить();
Если ФИФО = Истина Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
При таком подходе разработчик часто сталкивается с тем, что переключатель всегда остается в одном положении, а точка останова в процедуре не срабатывает. Выясним причины такого поведения:
ПриОткрытии в модуле формы не означает, что она автоматически выполнится. Необходимо обязательно открыть палитру свойств формы, перейти на закладку «События» и связать событие «При открытии» с процедурой модуля.ПриОткрытии крайне неэффективно. Чтение начальных значений и подготовку данных формы следует выполнять на сервере в процедуре ПриСозданииНаСервере еще до передачи формы клиенту.СписокВыбора. Если в реквизите записано число 0, а в списке выбора значение задано строкой "0", переключатель не сможет спозиционироваться.Истина или Ложь).Самый правильный и надежный путь в платформе 1С:Предприятие 8 — доверить управление состоянием стандартным механизмам платформы. Для взаимоисключающих опций следует использовать перечисление.
Разберем по шагам, как настроить такую схему:
МетодыСписания и двумя значениями: ФИФО и ЛИФО.МетодСписания, указав в качестве типа созданное перечисление: ПеречислениеСсылка.МетодыСписания.КонстантаМенеджерЗначения.МетодСписания.Значение этой константы в дерево элементов формы.При таком подходе программировать не требуется вовсе. Платформа самостоятельно выведет переключатель со всеми значениями перечисления, считает текущее значение константы при открытии формы и запишет его при сохранении данных стандартными кнопками.
Если по каким-либо причинам требуется оставить текущую структуру реквизитов формы, приведем программный код к правильным стандартам разработки под управляемые формы.
Рассмотрим корректную схему чтения данных при открытии и записи при закрытии:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализируем переключатель сразу на сервере при сборке формы
Если Константы.МТ_ФИФО.Получить() Тогда
МетодСписания = 0; // Индекс или значение для ФИФО
Иначе
МетодСписания = 1; // Индекс или значение для ЛИФО
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
СохранитьНастройкиНаСервере(МетодСписания);
ЭтаФорма.Закрыть();
КонецПроцедуры
&НаСервере
Процедура СохранитьНастройкиНаСервере(ЗначениеВыбора)
Если ЗначениеВыбора = 0 Тогда
Константы.МТ_ФИФО.Установить(Истина);
Константы.МТ_ЛИФО.Установить(Ложь);
Иначе
Константы.МТ_ФИФО.Установить(Ложь);
Константы.МТ_ЛИФО.Установить(Истина);
КонецЕсли;
КонецПроцедуры
Обратите внимание: обработчик ПриСозданииНаСервере должен быть обязательно назначен в палитре свойств формы. Это исключает лишний контекстный вызов сервера с клиента, который ранее выполнялся из ПриОткрытии.
Если выбранное положение переключателя не должно влиять на общие настройки всей базы, а предназначено для запоминания индивидуального выбора конкретного пользователя, использовать константы не нужно.
Проанализируем шаги настройки штатного сохранения:
МетодСписания).В результате платформа 1С будет автоматически записывать значение переключателя в системное хранилище настроек пользователя при закрытии формы и восстанавливать его при следующем запуске без единой строки встроенного языка.