Как отследить изменение флажка и управлять доступностью кнопок в 1С 7.7?

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

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

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

Причина проблемы: особенности модели событий в 1С 7.7

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

В платформе 7.7 привязка пользовательских действий к коду модуля диалога выполняется через специальное свойство элементов — Формула.

Способ 1. Вызов процедуры через свойство «Формула» флажка (рекомендуемый)

Рассмотрим самый простой и правильный способ решения задачи. Флажок в 1С 7.7 принимает числовые значения: 1 (включен) и 0 (выключен). Метод Доступность() также ожидает числовое значение (1 — элемент доступен, 0 — заблокирован). Это позволяет связывать состояние флажка и доступность кнопки напрямую.

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

Процедура ПриИзмененииФлажка()
    Форма.Подключиться.Доступность(Флаг);
КонецПроцедуры

Чтобы кнопки сразу при открытии формы имели корректное состояние (например, если флажок изначально сброшен в 0), вызовем ту же процедуру в предопределенном обработчике ПриОткрытии:


Процедура ПриОткрытии()
    ПриИзмененииФлажка();
КонецПроцедуры

Способ 2. Использование невидимого текстового поля для вычисления формулы

Рассмотрим альтернативный способ, который часто применяется в типовых конфигурациях (включая конфигурацию «Торговля и Склад 7.7»). Если состояние интерфейса зависит сразу от множества условий (наличия файлов на диске, выбранных строк в таблице, состояния нескольких реквизитов), можно создать общую функцию обновления интерфейса.

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

Функция ДоступностьКнопок()
    
    // Управление доступностью по условиям наличия файлов
    ЕстьФайлВыгрузки = ФС.СуществуетФайл(ИмяФайлаВыгрузки);
    Форма.кнПросмотрВыгрузки.Доступность(ЕстьФайлВыгрузки);
    Форма.кнПросмотрВыгрузкиДоп.Доступность(ЕстьФайлВыгрузки);
    
    ЕстьФайлЗагрузки = ФС.СуществуетФайл(ИмяФайлаЗагрузки);
    Форма.кнЗагрузить.Доступность(ЕстьФайлЗагрузки);
    Форма.кнПросмотрЗагрузки.Доступность(ЕстьФайлЗагрузки);
    
    // Прямая передача значения переменной флажка
    Форма.Подключиться.Доступность(Флаг);
    
КонецФункции

Важное ограничение: функция, указанная в формуле текстового поля, вызывается платформой при каждом обновлении и перерисовке диалога (при движении мыши, смене фокуса). Не размещайте внутри таких функций тяжелые алгоритмы, циклы по таблицам или частые обращения к диску через объект ФС без кэширования, так как это может приводить к мерцанию интерфейса и задержкам отклика программы.

← На главную