Оформление и рефакторинг сложных логических выражений
Разработка - Практика программирования
Возьмем для примера фрагмент кода из типовой бухгалтерии
Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Не правда ли от количества скобок "рябит в глазах"? Конечно скобки иногда необходимы для расстановки последовательности вычисления, но записывая их линейно в таком количестве мы заметно усложняем восприятие (читаемость) выражения.
Приоритеты логических операций
Для начала вспомним приоритеты логических операций. Сначала выполняется Не, потом И и затем Или. Скобки традиционно имеют наивысший приоритет выполнения и гарантируют порядок выполнения вложенных в них операций. Однако их избыточное применение создает продемонстрированные в примере трудности. Зачастую скобки ставят лишь для того, чтобы перестраховаться в сложных и плохо читаемых логических выражениях.
Методика И-ИЛИ дерева
Я же предлагаю сложные логические выражения оформлять в виде И-ИЛИ дерева. Под И-ИЛИ деревом я подразумеваю дерево, нетерминальные узлы которого представляют собой группы (последовательности) одинаковых логических операций И или ИЛИ, а терминальные - остальные логические выражения. Хорошим примером такого дерева является отбор настроек компоновки данных, правда у него верхняя (корневая) группа всегда имеет тип "И". В случае встроенного языка мы этим не ограничены и можем использовать любой тип верхней группы. В рассмотренном примере как раз сверху расположена группа "ИЛИ".
1. Встаем на первую открывающую скобку и с помощью сочетания клавиш CTRL+] находим тело первого узла и переносим целиком в одну следующую строку с отступом относительно слова Если
Если
((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
2. Следующий логический оператор будет И или ИЛИ. Он и определяет тип группы этого уровня при условии что все группы обрамлены скобками. Для повышения наглядности вставляем в начало группы операцию с не нарушающим результат вычисления группы константным значением. Для И это будет ИСТИНА, а для ИЛИ это будет ЛОЖЬ. ИСТИНА не меняет результат конъюнкции (ИСТИНА И), и ЛОЖЬ не меняет результат дизъюнкции (ЛОЖЬ ИЛИ). Рассмотрим преобразование выражения примера к И-ИЛИ дереву.
Если Ложь
Или ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
3. Встаем на следующую открывающую скобку корневого уровня и повторяем шаг 1.
Если Ложь
Или ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7))) Тогда
4. Слово Тогда для наглядности я переношу на отдельную строку с тем же отступом, что и Если, а все внутренние строки условия имеют больший отступ. Таким образом мы четко обозначаем начало и конец условия.
Если Ложь
Или ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7)))
Тогда
5. Далее повторяем шаги 1-3 для всех вложенных узлов (условий в скобках). Следует заметить, автор оригинального выражения не все группы обрамил скобками и последние 2 оператора из числа образующих группы различны и не разделены скобками. В итоге получаем
Если Ложь
Или (Ложь
Или (НомерИзменяемойКолонки = "4")
Или (НомерИзменяемойКолонки = "5"))
Или (Ложь
Или (НомерИзменяемойКолонки = "7")
Или (Истина
И (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7)))
Тогда
6. Теперь нам становится понятно, что логическое выражение можно упростить. Все вложенные однотипные (И или ИЛИ) группы можно смело всегда поднимать в родительскую группу.
Если Ложь
Или (НомерИзменяемойКолонки = "4")
Или (НомерИзменяемойКолонки = "5")
Или (НомерИзменяемойКолонки = "7")
Или (Истина
И (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))
Тогда
7. В таком виде уже можно довольно безопасно убрать скобки вокруг условий внутри строк. В итоге получаем
Если Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или (Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7)
Тогда
Кажется, что в итоге получилось заметно более простое и наглядное выражение. В исходном выражении было 16 скобок, в преобразованном - всего 2.
По идее, как изначально оформлять логические выражение по этой методике уже должно быть понятно.
Хочу обратить ваше внимание на отсутствие унарной операции НЕ как типа группы. При желании конечно можно было бы ввести в методику и группу НЕ, но она слишком отличается от рассмотренных и я лично сторонник обходить ее стороной и опускать на самые нижние узлы.
Думаю, что эту методику можно успешно применять не только к встроенному языку 1С, но и многим другим языкам.
Использую эту методику уже много лет.
Плюсы:
- повышает наглядность выражения после некоторого привыкания
- облегчает рефакторинг, т.к. позволяет четко видеть пути упрощения (устранения избыточности) выражения
- облегчает отладку, т.к. позволяет быстро комментировать(выключать)/раскомментировать(включать) фрагменты выражения
- облегчает изменение порядка фрагментов выражения
- позволяет дописывать комментарии к каждому узлу дерева
- сокращает левые отступы, вложенность условий, количество строк в коде по сравнению с некоторыми другими подходами
Минусы:
- не все сразу понимают чисто оформительское назначение "Истина И" и "Ложь Или"
- уходит больше времени на начальное написание выражения
- выражение занимает большее число строк
- часто не оправдывает себя в простых выражениях
- автоформатирование кода выравнивает все строки условия по одной границе
Шаблоны
Для удобства написания сложных логических выражений по этой методике рекомендую добавить себе шаблоны
Условие с корневой группой "И" -
Если Истина И <?> Тогда КонецЕсли;
Условие с корневой группой "Или"
Если Ложь Или <?> Тогда КонецЕсли;
Специальные предложения
Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
Расчет(ГруппаРасчета);
Условие = НомерИзменяемойКолонки = "4";
Условие = Условие ИЛИ НомерИзменяемойКолонки = "4";
Условие2 = НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7;
Условие = Условие ИЛИ Условие2;
Дешево и сердито, я лично перешел на такой способ.
Вместо Условие2 лучше писать осмысленный текст, тогда еще и комментирование происходит, например УсловиеГруппыОсобыхРасчетов.
Условие = Условие ИЛИ НомерИзменяемойКолонки = "4";
Условие2 = НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7;
Условие = Условие ИЛИ Условие2;
А что это за конструкция такая с несколькими равно в строке, не встречал ее в типовых конфах?
Как ее правильно читать, где написано?
Я бы написал так:
ВыполнитьРасчетПоНомеруКолонки(ГруппаРасчета, НомерИзменяемойКолонки, мИдГруппы7); // Выделили метод
Процедура ВыполнитьРасчетПоНомеруКолонки(ГруппаРасчета, НомерИзменяемойКолонки, мИдГруппы7)
Если НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Тогда
Расчет(ГруппаРасчета);
Возврат;
КонецЕсли;
Если ГруппаРасчета <> мИдГруппы7 Тогда // Инвертируем условие
Возврат;
КонецЕсли;
Если НомерИзменяемойКолонки = "7" Или НомерИзменяемойКолонки = "8" Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
КонецПроцедуры;
ПоказатьСогласитесь, так читается ещё легче.
Обрати внимание, я не предлагал их записывать в одну строку специально чтобы увеличить наглядность. Так что ты исказил мою методику.
Возможно, ваше выражение тождественно первоначальному, но легче читать его не стало.
Это обычные споры для рефакторинга.
Выносить ли в отдельную функцию фрагмент кода, который с большой вероятностью будет вызван только в одном месте?
Оформлять ли в виде отдельной переменной выражение, которое с большой вероятностью будет использовано только в одном месте?
Выносить ли во временную таблицу пакета подзапрос, который с большой вероятностью будет использован только в одном месте?
Ответ на такие вопросы (абстаригуясь от специфики запросов к данным) обычно
- Да, если фрагмент настолько большой или сложный, что затрудняет восприятие/чтение/понимание логики программы.
- Нет - в остальных случаях, т.к. для человека последовательное с фиксацией промежуточных результатов в виде отдельных переменных чтение программы труднее.
Таким образом если есть возможность сохраняя приемлемую читаемость программы отказаться от лишних промежуточных переменных, то я рекомендую ее использовать. В случае сложных логических выражений этого помогает достичь предлагаемая методика.
Но я дольше буду вникать в выражение:
Если Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или (Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7)
Тогда
ПоказатьЧем в:
ИзменилиРасчетнуюКолонку = (НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Или НомерИзменяемойКолонки = "7");
ИзменилиКолонку8ИГруппаРасчетаВерная = (НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7);
НеобходимРасчет = ИзменилиРасчетнуюКолонку Или ИзменилиКолонку8ИГруппаРасчетаВерная;
Если НеобходимРасчет Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
//Можно заранее колонки 4,5,7 вывести в переменную МассивРасчетныхКолонок и искать по нему.
//ИзменилиРасчетнуюКолонку = МассивРасчетныхКолонок.Найти(НомерИзменяемойКолонки)<>Неопределено;
ПоказатьПросто прочитав название переменной всё становиться понятно и в правую часть (после знака =) можно не смотреть.
Дальше форматировать вариант с переменными можно под себя (под свой вкус или стиль). Допустим:
ИзменилиРасчетнуюКолонку =
(НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Или НомерИзменяемойКолонки = "7");
ИзменилиКолонку8ИГруппаРасчетаВерная =
(НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7);
НеобходимРасчет = ИзменилиРасчетнуюКолонку Или ИзменилиКолонку8ИГруппаРасчетаВерная;
Если НеобходимРасчет Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Или в Вашем стиле:
ИзменилиРасчетнуюКолонку = Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7";
ИзменилиКолонку8ИГруппаРасчетаВерная = Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7;
НеобходимРасчет = Ложь
Или ИзменилиРасчетнуюКолонку
Или ИзменилиКолонку8ИГруппаРасчетаВерная;
Если НеобходимРасчет Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Показать(10)
Если в конкретном случае использование промежуточных переменных улучшает читаемость (путь даже незначительно: на 2-10 секунд меньше вникать в код), то почему-бы это не использовать?
ЗЫ. охота было влипить минус но остановило лишь то, что автор знает о чем пишет и это труд. А минус за сложность и не рациональное использование таких выражений. (Игра слов)
//SARCAZM//
Если Тогда
Если Тогда
Если Тогда
и т.п.
КонецЕсли;
Причем здесь конструктивность языка вообще!? Тебе как минимум сюда или наподобие этого:
читать книги С.Макконнелла "Совершенный код". Вообще не путай статью автора из структурированным кодом!
И́МХО или ИМХО́ (от англ. IMHO, In My Humble Opinion), также имхо или imho (строчными буквами) — русская транслитерация английского акронима, означающего «по моему́ скромному мнению» .
Область использования сокращения — эхоконференции, форумы, чаты, и другие (как публичные, так и частные) места для выражения своего отношения к какому-нибудь предмету. В разговорной речи встречается относительно редко.
Кроме того:
"влИпить",
"статью автора ИЗ структурированным кодом",
"сумасшедшШей",
"опрИдИления".
Ну и на вопрос:
"А в чем не граммотность опридиления условий в простом виде:
Если Тогда
Если Тогда
Если Тогда
и т.п.
КонецЕсли; "
1С при проверке на такой код выдаст ошибку:
err: Ожидается ключевое слово 'КонецЕсли'
Граммотно писать:
Если Тогда
ИначеЕсли Тогда
ИначеЕсли Тогда
и т.п.
КонецЕсли;
И если девушка читала Стива Макконнелла то с вашей стороны будет "наивно" полагать, что она не понимает значение вашего "ИМХО", и проверьте на приборах скромность вашего мнения, лично мне кажется вы его недооцениваете :)
придерусь к идее
как приверженец написания кода через отладчик, считаю, что
1. условия должны быть простыми
2. везде должно быть место точке останова
таким образом, надо писать не одну дикую проверку
и не структуру типа
Если Тогда
ИначеЕсли Тогда
ИначеЕсли Тогда
КонецЕсли;
а структуру типа
Если Тогда
Если Тогда
Иначе
КонецЕсли;
Иначе
Если Тогда
Иначе
КонецЕсли;
КонецЕсли;
НадоСчитать = Ложь;
Если ГруппаРасчета = мИдГруппы7 Тогда
Если (НомерИзменяемойКолонки = "8") Тогда
НадоСчитать = Истина;
Иначе
//
КонецЕсли;
Иначе
Если
(НомерИзменяемойКолонки = "7")
Или
(НомерИзменяемойКолонки = "4")
Или
(НомерИзменяемойКолонки = "5")
Тогда
НадоСчитать = Истина;
Иначе
//
КонецЕсли;
КонецЕсли;
Если НадоСчитать Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Показатьи не структуру типа
Если Тогда
ИначеЕсли Тогда
ИначеЕсли Тогда
КонецЕсли;
а структуру типа
Если Тогда
Если Тогда
Иначе
КонецЕсли;
В первом случае после получения истины мы остальные проверки не проводим, во втором - проверяем все, что увеличивает время выполнения участка кода.
(31) ЧИА,
а через временные таблицы
и отлаживать проще
и нагляднее
Простота отладки сомнительна. Скопировать текст вложенного запроса в консоль проще.
(33) ЧИА
Всегда считал, что единственным условием является множественность использования блока, а не размер. Каким же шрифтом вы пишите, что у вас 16 строк на экран умещается?
Метод интересный, но увы, мне за такое оторвут пальцы.
Просто показал товарищу конечное выражение, он мне в ответ скинул картинку, как он это видит.

Таки код должен быстро читаться не только Вами но и другими. А стандартное написание подразумевает запись в исходном виде.
Но как-то показался очень сложным процесс раскрытия скобок.
Также не понравились "Ложь" и "Истина" в качестве первого операнда блока.
Сам-бы написал так:
Если НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или (НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7) Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Очень наглядно было сравнение с отбором настроек компоновки данных.
Удобно что легко можно закомментировать любое из условий, в том числе и первое. Соответственно отладка тоже упрощается.
Впрочем порой красоту структуры в целях оптимизации придется нарушить и в первую очередь проверять наиболее вероятные условия (если есть такое понимание или статистика).
использую такой вариант записи
(+) при переходе на динамические условия "открытый" ИЛИ не блокирует дополнительные условия
(+) сохраняеться история введения ограничений
(-) читаеться возможно сложнее чем вариант топик стартера
Если (
(НомерИзменяемойКолонки = "4")
Или (НомерИзменяемойКолонки = "5")
)
Или (
(
(НомерИзменяемойКолонки = "7")
Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7)
)
)
Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
но и это у меня не оптимизация, а лёгкое упрощение чтения
если за оптимизацию то необходимость расчёта ожидается в свойствах колонки и(или) в свойствах группы
то есть ...
Если ( ТекИзменяемаяКолонка.Рассчет ИЛИ ТекГруппаРасчета.Рассчет )
Тогда Расчет(ТекГруппаРасчета);
КонецЕсли;
Разумеется группа условий содержащая ИЛИ всегда в скобках
Однако после комментария software1c вернулся к получившейся записи и понял её. Действительно, для сложных условий запись отличная.
Вывод:
+ Не приветствуются собственные велосипеды (Если Ложь Или...)
+ Условие 1го уровня - 1 таб, 2го уровня 2 таб и т.д. для читабельности
+ Одно условие = одна строка, для возможности быстро закомментировать
Если
НомерИзменяемойКолонки = "4" Или
НомерИзменяемойКолонки = "5" Или
НомерИзменяемойКолонки = "7" Или
( НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7 )
Тогда
// ...
КонецЕсли;
Показать Если (НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7")
Или (НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7) Тогда
//...
КонецЕсли;
плюс, если уж заботится о качестве кода, допускать трехсловные идентификаторы нельзя.
А если нужен идентификатор из трех слов, то значит сам контекст уже кандидат на рефактор и разбиение на более мелкие функции.
Лучше совсем убрать.
Если НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7 Тогда
//...
КонецЕсли;
Ведь даже школьник знает что выражения типа: А или Б или В = не (не А и не Б и не В)
Решать такой пример легче и человеку и машине, так как при использовании только И без ИЛИ и получении первой ложь все выражение в скобках будет ложь.
Особенно это важно в запросах. Так как ИЛИ в секции ГДЕ запроса при выполнении выполнит два запроса с каждым из условий и сделает их объединение.
Вывод идем учить преобразования логических выражений, кто ещё не в курсе что это такое.
Судя по комментам здесь, это ошибочное утверждение. Не уверен, что мысль твою про рефакторинг я понял. Ты предлагаешь вообще не использовать оператор ИЛИ что ли? Если так то почему он есть во всех языках, раз он такой вредный и избыточный?
Я хотел добавить, что выполнив логические преобразования выражений можно упростить понимание и так же часто получается повысить скорость работы. Согласен, что не всегда замена всех ИЛИ на И упростит запись и понимание, но на моей практике в 80% случаев замена ИЛИ на И упрощает понимание. Так же в процессе логические преобразования оказывается, что некоторые из выражений не влияют на результат всего выражения и/или можно сократить повторяющиеся выражения.
Конечно ИЛИ имеет право на жизнь как и много чего другого. Тут как с сортировкой можно в лоб сортировать, а можно пузырьком или еще каким то более хитрым методом.
Вот пример преобразования выражения из статьи.
((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) | {замена на буквы по порядку на АБВГД} |
(А ИЛИ Б) ИЛИ (В ИЛИ (Г И Д)) =
А ИЛИ Б ИЛИ В ИЛИ (Г И Д) =
НЕ(НЕ А И НЕ Б И НЕ В И НЕ(Г И Д)) =
НЕ(НЕ(НомерИзменяемойКолонки = "4") И НЕ(НомерИзменяемойКолонки = "5") И НЕ(НомерИзменяемойКолонки = "7") И НЕ((НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7))) =
НЕ(НомерИзменяемойКолонки <> "4"
И НомерИзменяемойКолонки <> "5"
И НомерИзменяемойКолонки <> "7"
И НЕ((НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7)))
Так как в скобках все через И а за скобками НЕ, тогда если хотя бы одно выражение равно ЛОЖЬ в скобках, тогда и все выражение в скобках равно ЛОЖЬ, а все выражение равно ИСТИНА. Пример, НомерИзменяемойКолонки = 5, тогда все выражение в скобках равно ложь, а все выражение равно истина.
также "привил" себе привычку скобки подряд не ставить - "((", или разреживать скобки пробелами " ( ( " или разносить на разные строки, читаемость повышается.
пример
было Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Стало Если (
(НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5")
)
Если <Начало условия >
<Продолжение условия>
Тогда
<Блок операторов>
КонецЕсли
А из этой статьи узнал еще о некоторых простых приемах, улучшающих понимание сложных выражений. Спасибо автору.
Вот только одна незадача: фирма 1С не приветствует такое структурирование логического выражения и после авто-форматирования блока программного кода вся наша красотища превращается в (на примере автора статьи)
Если Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или (Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7)
Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
ПоказатьМеня всегда раздражало это маленькое недоразумение... :)
Попробуйте.
Например:
Для каждого эл Из Объект.Товары Цикл
Если Ложь
ИЛИ (Истина
И ИспользуетсяОСНО
И эл.СчетУчета = ПланыСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации) // МЦ.04
ИЛИ (Истина
И ИспользуетсяОСНО
И эл.СчетУчета.Родитель = ПланыСчетов.Хозрасчетный.Материалы // 10
И эл.СчетУчета.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады) <> Неопределено)
Тогда
НужноСоздатьПоступлениеМЦ = Истина;
Иначе
НужноСоздатьПоступлениеМЦ = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
ПоказатьЕсли ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Ну ни как не однозначно
Если Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или (Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7)
Тогда
Всеми этими оптимизациями угробили логику работы
Аналог карявками автора это будет:
Если Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или (Истина
И НомерИзменяемойКолонки = "7"
И ГруппаРасчета = мИдГруппы7)
Или (Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7)
Тогда
ПоказатьТак что РАЗ НИ КТО ЭТОГО ДАЖЕ НЕ УВИДЕЛ эта "оптимизация" и "наглядность" под БОЛЬШИМ сомнением!
Метод по началу мне показался интересным, но судя по твоему минусу ты даже не понял в чём суть - ребёночка то в мутной водичке ты выплеснул не глядя - заблуждайся дальше...
Но из похожего - различные заполнения свойств через равенство оформляю по принципу чтобы знак равенства был в одном месте.
Например
НоваяЗапись_____ =_____ПеременнаяТаблицы.Добавить();
НоваяЗапись.а1___=_____ПолучитьА1();
НоваяЗапись.Упр__=_____ПолучитьУпр();
Но плюнул в итоге, т.к. противоречит стайл-гайдам 1С и автоформатирование конфигуратора тоже его не любит (корежит при рефакторинге)
2) заменять первое условие на Истина/Ложь для удобства рефакторинга тоже неоднозначный вариант. Тасовать при рефакторинге чуть удобнее и быстрее, но опять-таки больше авторский стиль получается. А я стараюсь писать так, чтобы левому человеку код глаз не резал. И ценю такой же чужой код.
А в сухом остатке получается просто грамотное составление логических выражений и оформление их по одинэсовскому стайл-гайду.
Более опытные стараются дробить на отдельные конструкции, чтобы при отладке понимание причин того или иного результата условия не занимало больше 0 секунд. Есть 10 составляющих условия - в идеале столько же веток выполнения.
На практике конечно нужна золотая середина. Но мой посыл: УПРОЩЕНИЕ - наше все, но без фанатизма.
Пс: от паразитных ложь и истина однозначно коробит.
+ сокращает левые отступы, вложенность условий, количество строк в коде по сравнению с другими удобочитаемыми стилями
- автоформатирование кода выравнивает все строки условия по одной границе
Сначала длиннные условия у меня перестали влезать в одну строку на мониторе, поэтому разбил их переносами.
Плюс при сравнении / объединении сразу видно в какой части условия изменение.
А потом до меня дошло, что скобочки в сложных условиях это почти то же самое, что и фигурные скобки, например, в java. И если написание кода в 1 строчку - это плохо и рекомендуется форматировать код оступами, то почему нельзя также форматировать сложные вложенные условия?
Код из шапки я бы написал следующим образом:
Если НомерИзменяемойКолонки = "4"
ИЛИ НомерИзменяемойКолонки = "5"
ИЛИ НомерИзменяемойКолонки = "7"
ИЛИ НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7 Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Минусы по сравнению с подходом автора: Нужно вручную выравнивать пробелами.
Плюсы: Отличная читаемость.
По аналогии с индексами в СУБД: наличие индекса увеличивает время записи, но последующие чтения выполняются существенно быстрее. Так и тут, лучше один раз "дольше" написать, но потом чтобы не было больно глазам и стыдно за свой код.
Если Ложь
Или НомерИзменяемойКолонки = "4"
Или НомерИзменяемойКолонки = "5"
Или НомерИзменяемойКолонки = "7"
Или ( Истина
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7
) // Эту скобочку тоже переносим если нужно будет закомментировать
Тогда
Показать Если ЛОЖЬ
ИЛИ НомерИзменяемойКолонки = "4"
ИЛИ НомерИзменяемойКолонки = "5"
ИЛИ НомерИзменяемойКолонки = "7"
ИЛИ (ИСТИНА
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7) //нормально комментируется
Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
Показать Если ЛОЖЬ
ИЛИ НомерИзменяемойКолонки = "4"
ИЛИ НомерИзменяемойКолонки = "5"
ИЛИ НомерИзменяемойКолонки = "7"
ИЛИ (ИСТИНА
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7)
Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
ПоказатьНеоднозначный подход конечно, вроде бы интересно, но в то же время смущают эти ЛОЖЬ ИЛИ и ИСТИНА И, возможно попробую методику. Но в начальном примере реально было жутко много скобок, которые можно было просто убрать и облегчить читабельность)))
Фактически Вы сводите логическую конструкцию к легко читаемому виду, где в начале каждой строки стоит условие.
Для И получается легко читаемое на одном дыхании ЕСЛИ ИСТИНА-И-Условие_а-И-Условие_б. Но для ИЛИ получается ересь читаемая как ЕСЛИ ЛОЖЬ-ИЛИ-Условие_а-ИЛИ-Условие_б.
По моему, если условие не очень многоэтажное, то оно и так может читаться при хорошем форматировании. А если условие строк эдак на 15-20, то его Ваша форма только дополнительно усложнит. Его надо рефакторить.
ПС. Спасибо за мысль. а) буду делать дополнительные оптимизации к своему компилятору. б) при расширении грамматики подумаю над возможностью опустить первый операнд И\ИЛИ: ЕСЛИ И Условие_а И Условие_б; ЕСЛИ ИЛИ Условие_а ИЛИ Условие_б.
ППС. Можно завести себе для красоты константы или пока функции:
(Фантазии, перспектива)
Конст ИстинаЛюбое = Ложь ЭКСПОРТ
Конст ИстинаКаждое = Истина ЭКСПОРТ
---
ЕСЛИ ИстинаЛюбое
ИЛИ Условие_а
ИЛИ Условие_б
ЕСЛИ ИстинаКаждое
И Условие_а
И Условие_б
См. также
Полезные процедуры и функции для программиста 160
Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Практика программирования Универсальные функции
Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.
07.10.2019 11940 HostHost 23
Подборка решений для взаимодействия со ФГИС «Меркурий» Промо
С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.
Таблица значений. Нюансы 199
Статья Программист Нет файла v8 Windows Бесплатно (free) Инструментарий разработчика Практика программирования Прочие инструменты разработчика
Обзор некоторых аспектов использования общеизвестного инструмента 1С.
01.10.2019 10998 Yashazz 36
[Шпаргалка] Программное создание элементов формы 305
Статья Программист Стажер Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Работа с интерфейсом Разработка
Программное создание практически всех популярных элементов формы.
06.09.2019 12683 rpgshnik 41
Онлайн-интенсив "Бизнес-процессы для подготовки к экзамену 1С:Специалист по платформе" 12 декабря 2019 г. Промо
На интенсиве будут рассмотрены все теоретические вопросы, связанные с устройством механизма бизнес-процессов – это необходимо для успешной сдачи экзамена 1С:Специалист по платформе. Также, в качестве практического примера, будет решена задача, аналогичная экзаменационной.
777 рублей
Агрегатные функции СКД, о которых мало кто знает 356
Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования
Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.
05.09.2019 15852 ids79 44
Три костыля. Сказ про фокусы в коде 124
Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка
Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.
03.09.2019 10703 YPermitin 69
Новый раздел на Инфостарте - Electronic Software Distribution Промо
Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.
- Низкие цены, без скрытых платежей и наценок
- Оперативная отгрузка
- Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
- Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)
Отслеживание выполнения фонового задания 143
Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка
Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.
17.08.2019 13108 ids79 16
Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 262
Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования
Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.
08.08.2019 18369 ids79 31
Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо
Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.
29700 руб.
Фоновое выполнение кода в 1С - это просто 124
Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка
Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.
02.08.2019 12872 avalakh 21
Процедура ПриКомпоновкеРезультата 288
Статья Программист Нет файла v8 1cv8.cf Windows Бесплатно (free) Практика программирования
Коллекция кода
1 стартмани
26.07.2019 14850 4 vasilev2015 54
Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо
Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.
19700 руб.
СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 141
Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования
Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.
26.07.2019 16524 ids79 8
СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 156
Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования
Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.
17.07.2019 13731 ids79 27
1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо
СПАРК помогает предотвратить мошенничество со стороны компаний и предпринимателей, благодаря актуальным сведениям о компаниях и системе выявления факторов риска.Сервис позволяет управлять налоговыми рисками и комплексно оценивать благонадежность контрагентов.
Регистры сведений. За кулисами 129
Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка
Небольшие заметки по внутреннему устройству регистров сведений.
09.07.2019 10968 YPermitin 12
"Меньше копипаста!", или как Вася универсальную процедуру писал 183
Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка
Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.
04.07.2019 9819 SeiOkami 49
Онлайн-курс "Технология выполнения проектов ERP-класса – процессный подход". Третий поток. Курс проходит с 21 января по 18 марта 2020 года. Промо
Курс разработан Внедренческим центром «Раздолье». Курс предназначен для подготовки аналитиков, архитекторов и руководителей проектов автоматизации процессов управления с использованием комплексных ИТ-систем (1С:ERP, 1С:УХ, 1С:КА, 1С:УТ). В основе курса лежит методика применения процессного подхода.
9000 рублей
Создание отчетов с помощью СКД - основные понятия и элементы 217
Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы
Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.
25.06.2019 24005 ids79 17
Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179
Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка
Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.
11.06.2019 13675 dmurk 134
Готовые переносы данных из различных конфигураций 1C Промо
Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.
Регистры накопления. Структура хранения в базе данных 178
Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка
Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.
16.05.2019 21490 YPermitin 27
Выполнение внешней обработки в фоновом задании 149
Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка
Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).
11.05.2019 13409 Eret1k 23
Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо
Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.
29700 руб.
Выгрузка документа по условию 5
Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка
Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.
25.04.2019 7737 m-rv 2
Как прикрутить ГУИД к регистру сведений 23
Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка
... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.
16.04.2019 10227 m-rv 16
Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.10.х и УТ 11.4.10.х! Промо
Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!
29700 руб.
О расширениях замолвите слово... 195
Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка
О чём стоит задуматься при принятии решения о создании расширения конфигурации…
07.04.2019 18956 ellavs 125
Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202
Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка
Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...
28.03.2019 15465 ellavs 83
Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо
Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.
24700 руб.
Трюки с внешними источниками данных 167
Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка
Некоторые трюки для преодоления ограничений внешних источников данных.
14.03.2019 16365 YPermitin 53
Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев 121
Статья Программист Нет файла v8 Россия Бесплатно (free) Практика программирования Разработка
Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.
26.02.2019 11796 Vladimir Litvinenko 25
Подборка программ для взаимодействия с ЕГАИС Промо
ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.
Разработка и сценарное тестирование с Vanessa-ADD. Собственные шаги и библиотеки. Экспортные сценарии 114
Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка
Расширяем возможности фреймворка.
07.02.2019 10563 Vladimir Litvinenko 13
Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 173
Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права
Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный
03.02.2019 19384 ids79 9

Просмотры 70879
Загрузки 0
Комментарии 129
Создание 20.09.12 10:29
Обновление 23.11.19 08:54
№ Публикации 152801
Рубрики Практика программирования
Кому Программист
Тип файла Нет файла
Платформа Платформа 1С v8.x (все механизмы)
Конфигурация Не имеет значения
Операционная система Windows
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
Код открыт Да

