Почему не меняется значение реквизита при выборе переключателя на форме 1С 7.7 и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке форм в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с нестандартным поведением элемента диалога Переключатель (Radio Button). Типичная ситуация: на форму помещается группа переключателей, связанная с реквизитом шапки документа или справочника, а в формулу элемента прописывается вызов процедуры модуля формы. Однако при клике на переключатель процедура считывает старое значение переменной, либо реквизит вовсе не меняет своего значения при первом выборе.

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

Причины некорректного поведения переключателей в 1С 7.7

Проанализируем, почему возникает данная проблема на техническом уровне:

  1. Особенность последовательности событий: В платформе 1С 7.7 формула, привязанная к элементу диалога, вызывается в момент клика мышью до того, как платформа успевает записать новое выбранное значение в связанную переменную. Поэтому обращение к реквизиту напрямую из вызванной процедуры возвращает его предыдущее значение.
  2. Отсутствие начальной инициализации: Если реквизит документа имеет значение 0 (не выбран), при первом клике синхронизация состояния группы переключателей в памяти платформы может дать сбой.
  3. Ошибки в настройках элементов на форме: Переключатели объединяются в единую группу платформой автоматически только при строгом соблюдении правил установки свойств и порядка обхода элементов.

Базовые правила настройки группы переключателей

Перед отладкой программного кода проанализируем настройки самих элементов диалога в редакторе формы. Чтобы платформа 1С 7.7 воспринимала несколько переключателей как единый реквизит, необходимо соблюдать следующие правила:

  1. Свойство «Первый в группе»: Галочка Первый в группе должна быть установлена только у одного (самого первого) переключателя из всей группы. У всех последующих переключателей этой группы флаг должен быть снят.
  2. Заполнение идентификатора: Идентификатор реквизита (например, Вработе) прописывается только у первого переключателя. У остальных элементов группы поле Идентификатор оставляют пустым. У них заполняется только свойство Выбираемое значение (числа 1, 2, 3 и т. д.).
  3. Порядок обхода (Tab Order): В настройках порядка обхода элементов диалога элементы группы переключателей должны следовать строго друг за другом. Если между ними в порядке обхода окажется другой элемент (текст, поле ввода, кнопка), группа будет разорвана. Автоматический порядок обхода формы в свойствах диалога рекомендуется отключить и настроить последовательность вручную.

Способы решения проблемы с вычислением формулы

Способ 1. Передача значения через параметр формулы

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

В свойстве «Формула» каждого переключателя группы пропишем вызов процедуры с передачей числа:

В модуле формы реализуем процедуру, которая явно присваивает переданное значение реквизиту:


Процедура ИзмВработе(ЗначНов)
    Вработе = ЗначНов;
    Сообщить("Текущее значение реквизита: " + Вработе);
КонецПроцедуры

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

Способ 2. Инициализация реквизита при открытии формы

Посмотрим на ситуацию, когда документ только создается и реквизит еще не засыпан. Если реквизит равен 0, группа переключателей находится в неопределенном состоянии. Чтобы избежать сбоев при первом клике, вызовем инициализацию в предопределенной процедуре ПриОткрытии():


Процедура ПриОткрытии()
    Если Вработе = 0 Тогда
        Вработе = 1; // Устанавливаем значение по умолчанию
    КонецЕсли;
КонецПроцедуры

Способ 3. Использование служебного элемента «Текст»

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

  1. Разместим на форме элемент диалога Текст.
  2. В свойстве «Формула» этого текста напишем вызов функции: ОбновитьСостояние().
  3. В модуле формы опишем функцию:

Функция ОбновитьСостояние()
    // Данная функция вычисляется после того, как платформа обновила реквизит Вработе
    // Здесь всегда считывается актуальное значение
    Возврат "";
КонецФункции

Альтернативные варианты

Если логика формы требует сложного управления элементами, проанализируем альтернативные варианты проектирования интерфейса:

← На главную