Доброго дня, коллеги!
В разделе “Общие приемы и механизмы решения задач” курса Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3 встречаются любопытные вопросы. Так, слушатель приводит пример двух фрагментов кода. На первый взгляд две равнозначные конструкции, дающие одинаковый результат, но суть вычислений при этом совершенно разная.
Вопрос
Пример 1 – условие:
Если Объект.Вид = Перечисления.ВидыРасчета.Метод1 Тогда Элементы.УчетнаяЗапись.Видимость = Истина; КонецЕсли
Пример 2 – без условия:
Элементы.УчетнаяЗапись.Видимость = Объект.Вид = ВидыРасчета.Метод1;
Вопрос следующий – как методологически писать более корректно?
Ответ
Здравствуйте! Можно использовать оба варианта. По эффективности они равноценны – условие будет проверено в любом случае, по одинаковым правилам. Второй вариант лаконичнее, но первый проще для восприятия.
Для улучшения восприятия я обычно во втором варианте заключаю условие в скобки, хотя это и необязательно:
Элементы.УчетнаяЗапись.Видимость = (Объект.Вид = ВидыРасчета.Метод1);
Важно также понимать, что в первом случае – оператор ветвления (Если), во втором – вычисление выражения (логического).
В первом варианте команда Элементы.УчетнаяЗапись.Видимость = Истина; будет выполнена только если истинно выражение
Объект.Вид = Перечисления.ВидыРасчета.Метод1
Во втором варианте присвоение значения объекту Элементы.УчетнаяЗапись.Видимость будет выполнено всегда.
Если какие-то действия нужно выполнить, только если условие истинно, следует использовать первый вариант – Сокращенный вариант оператора ЕСЛИ: ЕСЛИ … ТОГДА … КОНЕЦ.
Если нужно всегда присваивать объекту какое-то логическое значение (Истина или Ложь), следует использовать второй вариант (или полный вариант оператора ЕСЛИ: ЕСЛИ … ТОГДА … ИНАЧЕ … КОНЕЦ).
В Вашем примере изменение видимости для элемента формы УчетнаяЗапись во втором варианте произойдет всегда, а в первом – только при истинности условия
Объект.Вид = Перечисления.ВидыРасчета.Метод1
В приведенном примере с точки зрения логики выполнения команд эти два варианта не эквивалентны.
Выражение
Элементы.УчетнаяЗапись.Видимость = (Объект.Вид = ВидыРасчета.Метод1);
соответствует полной форме оператора ЕСЛИ:
Если Объект.Вид = Перечисления.ВидыРасчета.Метод1 Тогда Элементы.УчетнаяЗапись.Видимость = Истина; Иначе Элементы.УчетнаяЗапись.Видимость = Ложь; КонецЕсли
Нужно также учесть, что если переменная не объявлялась в секции Перем, то перед использованием она должна быть инициализирована. В противном случае возникнет исключение.
Если же переменная объявлена в секции Перем, но значение ей не присвоено, её значение – Неопределено.
Если используется второй вариант Переменная = (выражение), инициализация переменной производится всегда.
Если используется первый вариант ЕСЛИ условие ТОГДА Переменная = (выражение), инициализация переменной производится только если условие истинно. В этом случае нужно обеспечить, чтобы переменная перед использованием была инициализирована.
Это замечание относится к вычислению собственных переменных. При использовании встроенных объектов (как в данном примере: Элементы.УчетнаяЗапись.Видимость), они уже предварительно инициализированы.
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3.