Статья
Версия для печати
Обсудить на форуме
Использование псевдо-логических выражений во встроенном языке 1С


Уже после недолгого знакомства с 1С:Языком становится очевидно, что логического типа данных очень не хватает. Тем не менее многие встроенные функции возвращают значения 0 и 1 - так почему не использовать их как логические? Сразу скажу - от конструкций типа

Код: (Text)
Если (Результат=1) Тогда
        ...
КонецЕсли;

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

Значения типа: Истина(T) = 1, Ложь(F) = 0;
Операторы: И = _И(Зн1,Зн2); ИЛИ = _ИЛИ(Зн1,Зн2); НЕ = _НЕ(Зн);

Что из себя представляют функции _И, _ИЛИ, _НЕ? Все очень просто (приведены объявления для глобального модуля):

Код: (Text)
Функция _И(Зн1, Зн2) Экспорт Возврат Мин(Зн1, Зн2); КонецФункции;
Функция _ИЛИ(Зн1, Зн2) Экспорт Возврат Макс(Зн1, Зн2); КонецФункции;
Функция _НЕ(Зн) Экспорт Возврат 1-Зн; КонецФункции;

Здесь нет утяжеляющих конструкцию и увеличивающих время выполнения проверок на допустимость значений, т.е. предполагается аккуратная работа с функциями. Желающие могут дописать эти проверки, ниже будет показано как это сделать.
Проверим таблицу истинности, например, для функции _И:

"И"  1 | F | T |               _И  1 | 0 | 1 |
    2 -+---+---+                  2 -+---+---+
     F | F | F |                   0 | 0 | 0 |
     T | F | T |                   1 | 0 | 1 |
    ---+---+---+                  ---+---+---+


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

Где это можно использовать?
Наиболее часто я использую такой подход в функции Доступность(), которая определяет Доступность/Видимость некоторых компонентов формы (Эта функция привязывается к свойству Дополнительно-> Формула любого текстового элемента формы и вызывается при любой изменении на форме). Пример типичного использования данных методов:

Код: (Text)
Функция Доступность()
        Дост1 = Мин(1, ТЗ1.КоличествоСтрок()); // 1-если есть хотя бы 1 строка
        Дост1 = _И(Дост1, Элемент1.Выбран());
        Дост2 = Мин(1, ТЗ2.КоличествоСтрок()); // 1-если есть хотя бы 1 строка
        Дост2 = _И(Дост2, Элемент2.Выбран());
        кнВыполнить.Доступность(_ИЛИ(Дост1, Дост2));
КонецФункции;

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

Преобразования значений из другого диапазона. Самым универсальным (и самым простым) вариантом можно предложить функцию ?(,,). Например код:

Код: (Text)
Зн = ?(Зн=0,0,1);

Преобразовывает значение как это принято в С: 0 - False, все остальное - True.
Если имеем значение заведомо целое и не меньше 0 то можно воспользоваться приведенным выше в примере кодом:

Код: (Text)
Зн = Мин(1, НекотораяФункция());

Этот код подходит для методов КоличествоСтрок, РазмерСписка и подобных.

Предостережение: использовать описанную методику нужно аккуратно, потому что в некоторых случаях вместо улучшения читабельности кода можем получить прямо противоположный результат.


Автор: Ярослав AKA Kivals
Версия для печати
Обсудить на форуме