Новый тип данных — Булево.
Самая простая логическая операция — это операция Равно. Она выясняет, равны между собой два значения или нет.
Эта операция определена для значений любых типов: для чисел, для строк, для дат и так далее. Важно лишь, чтобы оба значения, которые сравниваются, были одного и того же типа. Например, два числа или две строки.
Логическая операция Равно обозначается знаком «=». В подавляющем большинстве случаев логические операции используются в инструкциях Если и Цикл.
Знакомиться с операцией Равно будем с помощью инструкции присваивания. В ней эта операция будет выглядеть немного странно, поэтому для пущей важности заключим её в скобки:
Теперь внутри скобок напишем операцию Равно. Например, 5 = 5.
Затем напишем ещё одну инструкцию присваивания, но так, чтобы в операции "Равно" участвовали разные числа. Например, 5 и 2.
Запустим 1С:Предприятие в режиме отладки и посмотрим, чему равны переменные в этих инструкциях:
Там, где сравниваются два одинаковых числа, результатом является
значение Истина. А там, где сравниваются разные числа, результатом является значение Ложь. К тому же оба этих значения имеют тип Булево
Значения типа Булево — это значения, получаемые в результате логических операций. Значений типа Булево не бесконечное множество, как чисел или строк, а только два: Истина и Ложь.
Логических операций во встроенном языке, как и в жизни, довольно много. Все они интуитивно понятны, и нет особой надобности в том, чтобы тренироваться в их использовании. Единственное, что может вызвать трудность, — это то, какими символами они обозначаются:
Все перечисленные в этой таблице операции называются операциями сравнения, так как они сравнивают два значения. Причём операции Равно и "Не равно" можно применять к значениям любых типов. Главное, чтобы типы были одинаковыми с одной и с другой стороны операции.
А вот оставшиеся четыре операции (больше/меньше) можно применять только к двум числам, двум строкам или к двум датам.
Булевы операции
Знакомимся с самыми интересными логическими операциями. Кроме операций сравнения есть ещё группа логических операций, которые называются булевы
операции.
Если операции сравнения можно выполнять (в основном) над числами, строками и датами, то булевы операции выполняются только со значениями типа Булево. То есть со значениями Истина и Ложь.
Будем записывать булевы значения прямо в тексте программы, то есть использовать литералы. Литералы типа Булево выглядят очень
просто. Значение Истина обозначается Истина, а значение Ложь обозначается Ложь.
Например, для создания переменной, которая будет описывать погоду за
окном, можно написать:
Если в другой переменной захотим уточнить, есть на улице дождь или нет, то
можно написать так; и посмотрим, чему равны переменные:
Платформа раскрашивает слова Истина и Ложь красным цветом, потому что это специальные зарезервированные слова. И это значит, что переменную
с таким именем создать нельзя. Полный список зарезервированных слов можно посмотреть в документации «Руководство разработчика 8.3. Раздел 4.2.4.6. Зарезервированные слова».
Для знакомства с первой булевой операцией, создаем две переменные: ЯУмеюПлавать и РядомЕстьМоре. Задаем им значения, которые есть на самом деле. В образце присвоим им значение Истина:
Теперь нужно с помощью логической операции узнать, будете вы плавать в море или нет.
Сначала попробуйте сказать это обычными словами. Наверное, получится что-то вроде «если я умею плавать и если рядом есть море, то я буду плавать в море». Эта же фраза выглядит на встроенном языке 1С следующим образом:
Чтобы сказать то же самое на встроенном языке, используется операция И. Как она работает, можно проверить на этом примере, изменив значения переменных.
Плавать в море можно только в том случае, когда оно есть рядом и вы умеете плавать. Если моря рядом нет, то плавать просто негде. А если вы не умеете плавать, то у вас тоже ничего не получится. Еесли и моря нет, и плавать вы не умеете, то тем более поплавать в море вам не удастся.
Итак, операция И возвращает значение Истина только в том случае, когда оба
операнда имеют значение Истина. Во всех остальных случаях она возвращает
значение Ложь.
Теперь решим другую задачу. Создаем две переменные УМеняЕстьЛодка и УМеняЕстьПлот. Можем задать им любые значения, например, значение Истина:
Теперь нужно с помощью логической операции узнать, можно переплыть
через озеро или нет.
Сначала пробуем сказать это обычными словами. Наверное, получится что-то вроде «если у меня есть плот или лодка, то я могу переплыть через озеро».
А теперь посмотрим, как эта же фраза выглядит на встроенном языке:
Чтобы сказать то же самое на встроенном языке, используется операция ИЛИ. Изменим значения переменных.
Если у вас есть лодка, вы можете переплыть через озеро? Да.
А если у вас не лодка, а плот — тогда сможете? Да, сможете.
В каком случае вам не удастся переплыть через озеро? Когда нет
ни лодки, ни плота.
Таким образом, операция ИЛИ работает аналогично операции И, только в отношении значения Ложь. Она возвращает значение Ложь только в том случае, когда оба операнда имеют значение Ложь. Во всех остальных случаях она возвращает значение Истина.
Теперь усложняем пример и видим, что в одном выражении могут
использоваться сразу несколько булевых операций.
Создаем три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьБассейн. Задаем им те значения, которые есть на самом деле. Например, значение Истина:
Чему будет равна переменная ЯБудуПлавать?
Если вы отвечать словами, то: «Я буду плавать, если я умею плавать и рядом есть море или бассейн». Попробуем записать это на встроенном языке:
На первый взгляд кажется, что всё хорошо. Но нужно проверить.
Например, кто-то не умеет плавать. В этом случае не важно, есть рядом бассейн или нет: плавать он не должен. Но что говорит вам программа? Пробуем:
Программа говорит, что плавать будет. Получается какое-то «опасное» программирование. Просто не учли, что если несколько булевых операций встречаются в одном выражении, у них есть определённый порядок выполнения. Точно так же, как было с арифметическими операциями +, -, * и /.
Сначала выполняется операция И, а затем уже выполняется операция ИЛИ. Если
подряд встречаются несколько одинаковых операций, то они выполняются в той последовательности, в которой написаны.
Поэтому в примере выражение было посчитано таким образом:
Сначала была выполнена операция И, которая дала Ложь. Затем операция ИЛИ,
результатом которой явилась Истина. На самом деле в этом выражении важны две вещи. Что "умеет плавать" и что "есть, где плавать". Поэтому правильным решением будет РядомЕстьМоре ИЛИ РядомЕстьБассейн заключить в скобки:
Тогда платформа сначала вычислит то выражение, которое в скобках. То есть узнает: есть, где плавать, или плавать негде. А потом уже поинтересуется умением плавать:
Для закрепления примера, изменим его условие. Создаем три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьВанна. Задаем им значения, которые были в последнем примере: Ложь, Истина и Истина:
Вычислить нужно будет переменную, которая называется ЯБудуКупаться. Будьте
внимательны: имя переменной изменилось не просто так. Пробуйте записать выражение на встроенном языке и потом сравните:
Запустим 1С:Предприятие в режиме отладки и посмотрим, какой получается результат, если изменить значения переменных.
Почему в этом случае скобки не понадобились, хотя пример внешне очень похож на предыдущий? Скобки не понадобились потому, что «естественный» порядок выполнения логических операций в этом выражении вполне подходит:
Действительно, умение плавать важно только тогда, когда собираемся зайти в море. Если купаться в ванне, то умение плавать вам совершенно не нужно.
Поэтому совершенно правильно, что сначала выполняется операция И и выясняется, можно ли купаться в море. А затем уже проверяется наличие ванны, для использования которой способность плавать не требуется.
В заключение нужно сказать ещё об одной булевой операции — операции НЕ. Она возвращает булево значение, противоположное тому, которое имеется:
Обычно с использованием этой операции никаких трудностей не возникает. Единственное, что может понадобиться, это порядок выполнения булевых операций. Полностью он выглядит так:
• сначала выполняется то, что в скобках;
• затем операция НЕ;
• затем операция И;
• затем операция ИЛИ.
Задание 3.20
Чтобы по пути на работу защититься от дождя, вы берёте с собой зонт. С помощью переменных ЯИдуНаРаботу и ИдетДождь вычислите значение переменной НадоВзятьЗонт.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.
Задание 3.21
В каких случаях вы не ходите в школу? Когда выходной (праздники, каникулы) и когда вы болеете. С помощью переменных СегодняВыходной и ЯБолею
вычислите значение переменной ЯНеИдуВШколу.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.
Задание 3.22
В хорошую погоду, когда у вас нет занятий, вы всегда идёте гулять. С помощью
переменных ХорошаяПогода, СегодняВыходной и СегодняПраздник вычислите
значение переменной ЯИдуГулять.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.
Задание 3.23
Вы работаете только по будним дням. С помощью переменных СегодняСуббота
и СегодняВоскресенье вычислите значение переменной ЯИдуНаРаботу.
Проверьте, что ваша инструкция правильно работает при любых значениях исходных переменных.