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