Найти в Дзене

12. Тип Булево и логические операции

Новый тип данных — Булево.
Самая простая логическая операция — это операция Равно. Она выясняет, равны между собой два значения или нет.
Эта операция определена для значений любых типов: для чисел, для строк, для дат и так далее. Важно лишь, чтобы оба значения, которые сравниваются, были одного и того же типа. Например, два числа или две строки.
Логическая операция Равно обозначается знаком «=». В подавляющем большинстве случаев логические операции используются в инструкциях Если и Цикл. Знакомиться с операцией Равно будем с помощью инструкции присваивания. В ней эта операция будет выглядеть немного странно, поэтому для пущей важности заключим её в скобки: Теперь внутри скобок напишем операцию Равно. Например, 5 = 5.
Затем напишем ещё одну инструкцию присваивания, но так, чтобы в операции "Равно" участвовали разные числа. Например, 5 и 2.
Запустим 1С:Предприятие в режиме отладки и посмотрим, чему равны переменные в этих инструкциях: Там, где сравниваются два одинаковых числа, результа

Новый тип данных — Булево.
Самая простая логическая операция — это операция Равно. Она выясняет, равны между собой два значения или нет.
Эта операция определена для значений любых типов: для чисел, для строк, для дат и так далее. Важно лишь, чтобы оба значения, которые сравниваются, были одного и того же типа. Например, два числа или две строки.
Логическая операция Равно обозначается знаком «=». В подавляющем большинстве случаев логические операции используются в инструкциях Если и Цикл.

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

Заготовка для операции «Равно»
Заготовка для операции «Равно»

Теперь внутри скобок напишем операцию Равно. Например, 5 = 5.
Затем напишем ещё одну инструкцию присваивания, но так, чтобы в операции "Равно" участвовали разные числа. Например, 5 и 2.
Запустим 1С:Предприятие в режиме отладки и посмотрим, чему равны переменные в этих инструкциях:

Значение «Истина» и значение «Ложь»
Значение «Истина» и значение «Ложь»

Там, где сравниваются два одинаковых числа, результатом является
значение Истина. А там, где сравниваются разные числа, результатом является значение Ложь. К тому же оба этих значения имеют тип Булево
Значения типа Булево — это значения, получаемые в результате логических операций. Значений типа Булево не бесконечное множество, как чисел или строк, а только два: Истина и Ложь.
Логических операций во встроенном языке, как и в жизни, довольно много. Все они интуитивно понятны, и нет особой надобности в том, чтобы тренироваться в их использовании. Единственное, что может вызвать трудность, — это то, какими символами они обозначаются:

Операции сравнения
Операции сравнения

Все перечисленные в этой таблице операции называются операциями сравнения, так как они сравнивают два значения. Причём операции Равно и "Не равно" можно применять к значениям любых типов. Главное, чтобы типы были одинаковыми с одной и с другой стороны операции.
А вот оставшиеся четыре операции (больше/меньше) можно применять только к двум числам, двум строкам или к двум датам.

Булевы операции

Знакомимся с самыми интересными логическими операциями. Кроме операций сравнения есть ещё группа логических операций, которые называются булевы
операции.
Если операции сравнения можно выполнять (в основном) над числами, строками и датами, то булевы операции выполняются только со значениями типа Булево. То есть со значениями Истина и Ложь.
Будем записывать булевы значения прямо в тексте программы, то есть использовать литералы. Литералы типа Булево выглядят очень
просто. Значение Истина обозначается Истина, а значение Ложь обозначается Ложь.
Например, для создания переменной, которая будет описывать погоду за
окном, можно написать:

Литерал значения «Истина»
Литерал значения «Истина»

Если в другой переменной захотим уточнить, есть на улице дождь или нет, то
можно написать так; и посмотрим, чему равны переменные:

-5

Платформа раскрашивает слова Истина и Ложь красным цветом, потому что это специальные зарезервированные слова. И это значит, что переменную
с таким именем создать нельзя. Полный список зарезервированных слов можно посмотреть в документации «Руководство разработчика 8.3. Раздел 4.2.4.6. Зарезервированные слова».

Для знакомства с первой булевой операцией, создаем две переменные: ЯУмеюПлавать и РядомЕстьМоре. Задаем им значения, которые есть на самом деле. В образце присвоим им значение Истина:

Переменные «ЯУмеюПлавать» и «РядомЕстьМоре»
Переменные «ЯУмеюПлавать» и «РядомЕстьМоре»

Теперь нужно с помощью логической операции узнать, будете вы плавать в море или нет.
Сначала попробуйте сказать это обычными словами. Наверное, получится что-то вроде «если я умею плавать и если рядом есть море, то я буду плавать в море». Эта же фраза выглядит на встроенном языке 1С следующим образом:

Операция «И»
Операция «И»

Чтобы сказать то же самое на встроенном языке, используется операция И. Как она работает, можно проверить на этом примере, изменив значения переменных.
Плавать в море можно только в том случае, когда оно есть рядом и вы умеете плавать. Если моря рядом нет, то плавать просто негде. А если вы не умеете плавать, то у вас тоже ничего не получится. Еесли и моря нет, и плавать вы не умеете, то тем более поплавать в море вам не удастся.
Итак, операция И возвращает значение Истина только в том случае, когда оба
операнда имеют значение Истина. Во всех остальных случаях она возвращает
значение Ложь.
Теперь решим другую задачу. Создаем две переменные УМеняЕстьЛодка и УМеняЕстьПлот. Можем задать им любые значения, например, значение Истина:

Переменные «УМеняЕстьЛодка» и «УМеняЕстьПлот»
Переменные «УМеняЕстьЛодка» и «УМеняЕстьПлот»

Теперь нужно с помощью логической операции узнать, можно переплыть
через озеро или нет.
Сначала пробуем сказать это обычными словами. Наверное, получится что-то вроде «если у меня есть плот или лодка, то я могу переплыть через озеро».
А теперь посмотрим, как эта же фраза выглядит на встроенном языке:

Операция «ИЛИ»
Операция «ИЛИ»

Чтобы сказать то же самое на встроенном языке, используется операция ИЛИ. Изменим значения переменных.
Если у вас есть лодка, вы можете переплыть через озеро? Да.
А если у вас не лодка, а плот — тогда сможете? Да, сможете.
В каком случае вам не удастся переплыть через озеро? Когда нет
ни лодки, ни плота.
Таким образом, операция ИЛИ работает аналогично операции И, только в отношении значения Ложь. Она возвращает значение Ложь только в том случае, когда оба операнда имеют значение Ложь. Во всех остальных случаях она возвращает значение Истина.
Теперь усложняем пример и видим, что в одном выражении могут
использоваться сразу несколько булевых операций.
Создаем три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьБассейн. Задаем им те значения, которые есть на самом деле. Например, значение Истина:

Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и
«РядомЕстьБассейн»
Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьБассейн»

Чему будет равна переменная ЯБудуПлавать?
Если вы отвечать словами, то: «Я буду плавать, если я умею плавать и рядом есть море или бассейн». Попробуем записать это на встроенном языке:

Переменная «ЯБудуПлавать»
Переменная «ЯБудуПлавать»

На первый взгляд кажется, что всё хорошо. Но нужно проверить.
Например, кто-то не умеет плавать. В этом случае не важно, есть рядом бассейн или нет: плавать он не должен. Но что говорит вам программа? Пробуем:

ЯБудуПлавать = Истина
ЯБудуПлавать = Истина

Программа говорит, что плавать будет. Получается какое-то «опасное» программирование. Просто не учли, что если несколько булевых операций встречаются в одном выражении, у них есть определённый порядок выполнения. Точно так же, как было с арифметическими операциями +, -, * и /.
Сначала выполняется операция И, а затем уже выполняется операция ИЛИ. Если
подряд встречаются несколько одинаковых операций, то они выполняются в той последовательности, в которой написаны.
Поэтому в примере выражение было посчитано таким образом:

Порядок вычисления выражения
Порядок вычисления выражения

Сначала была выполнена операция И, которая дала Ложь. Затем операция ИЛИ,
результатом которой явилась Истина. На самом деле в этом выражении важны две вещи. Что "умеет плавать" и что "есть, где плавать". Поэтому правильным решением будет РядомЕстьМоре ИЛИ РядомЕстьБассейн заключить в скобки:

ЯБудуПлавать = Ложь
ЯБудуПлавать = Ложь

Тогда платформа сначала вычислит то выражение, которое в скобках. То есть узнает: есть, где плавать, или плавать негде. А потом уже поинтересуется умением плавать:

Порядок вычисления выражения
Порядок вычисления выражения

Для закрепления примера, изменим его условие. Создаем три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьВанна. Задаем им значения, которые были в последнем примере: Ложь, Истина и Истина:

Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьВанна»
Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьВанна»

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

ЯБудуКупаться = Истина
ЯБудуКупаться = Истина

Запустим 1С:Предприятие в режиме отладки и посмотрим, какой получается результат, если изменить значения переменных.
Почему в этом случае скобки не понадобились, хотя пример внешне очень похож на предыдущий? Скобки не понадобились потому, что «естественный» порядок выполнения логических операций в этом выражении вполне подходит:

Порядок вычисления выражения
Порядок вычисления выражения

Действительно, умение плавать важно только тогда, когда собираемся зайти в море. Если купаться в ванне, то умение плавать вам совершенно не нужно.
Поэтому совершенно правильно, что сначала выполняется операция И и выясняется, можно ли купаться в море. А затем уже проверяется наличие ванны, для использования которой способность плавать не требуется.
В заключение нужно сказать ещё об одной булевой операции — операции НЕ. Она возвращает булево значение, противоположное тому, которое имеется:

Операция «НЕ»
Операция «НЕ»

Обычно с использованием этой операции никаких трудностей не возникает. Единственное, что может понадобиться, это порядок выполнения булевых операций. Полностью он выглядит так:
• сначала выполняется то, что в скобках;
• затем операция НЕ;
• затем операция И;

• затем операция ИЛИ.

Задание 3.20
Чтобы по пути на работу защититься от дождя, вы берёте с собой зонт. С помощью переменных ЯИдуНаРаботу и ИдетДождь вычислите значение переменной НадоВзятьЗонт.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.


Задание 3.21
В каких случаях вы не ходите в школу? Когда выходной (праздники, каникулы) и когда вы болеете. С помощью переменных СегодняВыходной и ЯБолею
вычислите значение переменной ЯНеИдуВШколу.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.


Задание 3.22
В хорошую погоду, когда у вас нет занятий, вы всегда идёте гулять. С помощью
переменных ХорошаяПогода, СегодняВыходной и СегодняПраздник вычислите
значение переменной ЯИдуГулять.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.


Задание 3.23
Вы работаете только по будним дням. С помощью переменных СегодняСуббота
и СегодняВоскресенье вычислите значение переменной ЯИдуНаРаботу.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.