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