Профессия — 1С

Рукопашный бой Карташ

Категории

Условия в языке программирования 1С

рубрики: Язык программирования 1С | Дата: 5 Май, 2017

В любом языке программирования существуют операторы ветвления (условные операторы). Когда в зависимости от истинности некоторого условия выполняется один либо другой набор команд.




В языке программирования 1С этой цели служит конструкция




Если <Логическое выражение> Тогда
	//Набор команд 1
ИначеЕсли <Логическое выражение> Тогда
	//Набор команд 2
Иначе
	//Набор команд 3
КонецЕсли;

Алгоритм работы достаточно прост. По очереди проверяются логические выражения следующие за операторами Если и ИначеЕсли. Как только очередное логическое выражение принимает значение Истина выполняется набор команд, следующих за этим логическим выражением. Больше никаких проверок не делается и выполнение блока Если…КонецЕсли; на этом завершается. Если у всех логических выражений значение оказалось Ложь, будет выполнен набор команд, следующих за оператором Иначе.
Конструкция ИначеЕсли <Логическое выражение> Тогда может повторяться столько раз сколько необходимо. При этом она может вообще не использоваться как и оператор Иначе. То есть в простейшем случае мы имеем:




Если <Логическое выражение> Тогда
	//Набор команд
КонецЕсли;

В логических выражениях могут применяться математические операторы сравнения (=, >, <, >=, <=, <>) и булевы операции (И, ИЛИ, НЕ). Важно понимать, что логическое выражение должно возвращать либо Ложь либо Истина.




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




&НаКлиенте
Функция ПроверитьПрава()
	Возврат Истина;
КонецФункции

&НаКлиенте
Функция ПолучитьКакоеТоЧисло()
	Возврат 1;
КонецФункции

&НаКлиенте
Процедура ПримерыЛогическихВыражений()

	Отказ = Ложь;
	Если НЕ Отказ Тогда
		//Набор команд
	КонецЕсли;

	Если ПолучитьКакоеТоЧисло() = 1 Тогда
		//Набор команд
	КонецЕсли;

	Если ПроверитьПрава() Тогда
		//Набор команд
	КонецЕсли;

КонецПроцедуры

А теперь рассмотрим одну особенность, связанную с использованием булевых операций. Допустим у нас есть вот такая конструкция:


Если <ЛогическоеВыражение_1> ИЛИ <ЛогическоеВыражение_2> Тогда

Совершенно очевидно, что если у нас ЛогическоеВыражение_1 = Истина, то проверять на истинность ЛогическоеВыражение_2 нет никакого смысла, т.к. в этом случае все равно ЛогическоеВыражение_1 ИЛИ ЛогическоеВыражение_2 = Истина. И начиная с версии 8.0 платформа так и поступает, т.е. последующие логические выражения будет вычисляться только в том случае, если уже вычисленные не позволяют однозначно определить результат в целом. Знание этого факта позволяет избежать ошибок и сократить количество кода.
В качестве примера обратимся к распространенной ситуации, когда у нас есть реквизит составного типа и нам надо проверить его на заполненность. Пусть у нас есть реквизит составного типа Контрагент, который может принимать тип Справочник.Физлица либо Справочник.Организации. На время этого примера забудем про функцию ЗначениеЗаполнено(). Как известно когда у нас еще не выбран тип составного реквизита, его значение равно Неопределено. Таким образом реквизит незаполнен, когда его значение неопределено либо пустая ссылка. И мы можем записать наше условие в двух вариантах:




// Вариант_1
Если Контрагент = Неопределено ИЛИ Контрагент.Пустая() Тогда

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Не выбран контрагент";
	Сообщение.Сообщить();

КонецЕсли;

// Вариант_2
Если Контрагент.Пустая() ИЛИ Контрагент = Неопределено Тогда

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Не выбран контрагент";
	Сообщение.Сообщить();

КонецЕсли;

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

В некоторых случаях можно применять сокращенную запись конструкции с условием. Синтаксис ее следующий:




?(<Логическое выражение>, <ВыражениеЕслиИстина>, <ВыражениеЕслиЛожь>)

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




Если Отказ Тогда
	ТекстСообщения = "Ошибка";
Иначе
	ТекстСообщения = "Операция завершена";
КонецЕсли;

записать всего одной строчкой:




ТекстСообщения = ?(Отказ, "Ошибка", "Операция завершена");

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С