Законы де Моргана в 1С

Казалось бы, при чем Булева Алгебра к 1С?
Предположим, есть задача - отобрать действующие договора на некую дату проверки &Дата.
При этом у договора есть дата начала и дата окончания, если дата окончания не задана, то договор действует до конца времен.
Как решается задача? В лоб так:
ВЫБРАТЬ Ссылка ИЗ Справочник.Договоры ГДЕ ДатаНачала <=
&Дата И (ДатаОкончания >= &Дата ИЛИ ДатаОкончания =
ДатаВремя(1,1,1))
Но операция ИЛИ вызывает некоторые проблемы по скорости, поэтому есть желание обойтись без нее. Как это сделать? Тут приходит на помощь законы Де Моргана.
Перепишем так:
ВЫБРАТЬ Ссылка ИЗ Справочник.Договоры ГДЕ ДатаНачала <= &Дата И НЕ (ДатаОкончания < &Дата И ДатаОкончания <> ДатаВремя(1,1,1))
И всё работает.
Проверяем выделенную зеленым часть условия:
1. Если дата окончания договора меньше даты проверки, то получим НЕ (ИСТИНА И ИСТИНА) = ЛОЖЬ
2. Если дата окончания договора больше или равно даты проверки, то получим НЕ (ЛОЖЬ И ИСТИНА) = ИСТИНА
3. Если дата окончания договора не заполнена, то получим НЕ (ЛОЖЬ) = истина.
Торжество формальной логики! Причем некоторые товарщи пытаются оптимизировать этот запрос через запросы с объединением, а ларчик открывается просто!
|
</> |