Как реализовать логическое НЕ при управлении доступностью элементов формы в 1С 7.7?

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

При разработке интерфейсов форм в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей включения или отключения кнопок и полей ввода в зависимости от заполненности реквизитов. На первый взгляд логично передать результат инверсии встроенной функции прямо в метод управления элементом формы, например: Форма.Кнопка.Доступность(НЕ ПустоеЗначение(Реквизит)). Однако платформа выдает синтаксическую ошибку. Разберем, почему так происходит, и рассмотрим проверенные способы решения этой задачи.

Выясним причину ошибки платформы 1С 7.7

Для понимания сути проблемы проанализируем особенности работы синтаксиса платформы 1С:Предприятие 7.7:

  1. Отсутствие отдельного типа данных «Булево»: В «семерке» не существуют примитивные логические значения Истина и Ложь. Вместо них используются числовые флаги: 1 означает истину (разрешено / включено), а 0 — ложь (запрещено / выключено).
  2. Строгие требования к аргументу метода: Метод Доступность() (а также Видимость(), Заблокировать() и другие) ожидает на вход числовой параметр: 1 (разрешено редактирование) или 0 (запрещено).
  3. Ограничение использования логического оператора НЕ: В 1С 7.7 логические операторы (НЕ, И, ИЛИ) используются исключительно внутри условных конструкций Если ... Тогда, Пока ... Цикл или тернарного оператора ?(,,). Выражение с оператором НЕ не возвращает числовое значение само по себе, поэтому его нельзя передать напрямую в качестве аргумента метода или присвоить переменной.

Встроенная функция ПустоеЗначение() уже возвращает числовой результат: 1, если значение не заполнено, и 0, если значение заполнено. Наша задача — инвертировать этот флаг, превратив 1 в 0, а 0 в 1.

Способ 1. Арифметическая инверсия (1 - Функция)

Самый компактный и изящный способ инвертировать числовой флаг 0 или 1 — вычесть его результат из единицы. Рассмотрим, как это работает:

  1. Если реквизит пуст, функция ПустоеЗначение(...) возвращает 1. Выражение 1 - 1 дает 0 (кнопка становится недоступной).
  2. Если реквизит заполнен, функция ПустоеЗначение(...) возвращает 0. Выражение 1 - 0 дает 1 (кнопка становится доступной).

Посмотрим на пример кода:


// Установка доступности кнопки формы через арифметическую инверсию
Форма.Кнопка.Доступность(1 - ПустоеЗначение(Реквизит));

Важное замечание: данный способ идеально подходит для функций, гарантированно возвращающих 0 или 1 (например, ПустоеЗначение(), Выбран(), Проведено()). Для произвольных условий сравнения (например, А > Б) его использовать напрямую нельзя, так как операция сравнения вне условных операторов не возвращает число.

Способ 2. Использование тернарного оператора ?(,,)

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

Разберем пример кода для управления кнопкой формы:


// Использование тернарного оператора для инверсии условия
Форма.Кнопка.Доступность(?(ПустоеЗначение(Реквизит) = 1, 0, 1));

Если требуется проверить сразу несколько полей формы, оператор ?(,,) позволяет наглядно записать составное условие с операторами И / ИЛИ и оператором НЕ:


// Проверка нескольких реквизитов формы
УсловиеДоступности = ?(НЕ (ПустоеЗначение(Реквизит1) = 1 ИЛИ ПустоеЗначение(Реквизит2) = 1), 1, 0);
Форма.Кнопка.Доступность(УсловиеДоступности);

Способ 3. Классический условный оператор Если ... Тогда

Для максимальной читаемости и наглядности кода (особенно при отладке и сопровождении) можно использовать традиционную структуру ветвления Если ... Тогда.

Рассмотрим реализацию данного подхода:


Если ПустоеЗначение(Реквизит) = 1 Тогда
    Форма.Кнопка.Доступность(0);
Иначе
    Форма.Кнопка.Доступность(1);
КонецЕсли;

Способ 4. Вспомогательная функция-инвертор

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

Проанализируем пример такой функции:


// Функция инверсии числового флага (0 в 1, 1 в 0)
Функция ИнвертироватьФлаг(ЗначениеЧисло)
    Возврат ?(ЗначениеЧисло = 0, 1, 0);
КонецФункции

// Пример вызова функции для управления формой
Форма.Кнопка.Доступность(ИнвертироватьФлаг(ПустоеЗначение(Реквизит)));

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

← На главную