Оформление и рефакторинг сложных логических выражений

Публикация № 152801

Разработка - Практика программирования

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

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

Возьмем для примера фрагмент кода из типовой бухгалтерии

Если ((НомерИзменяемойКолонки = "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С, но и многим другим языкам.

Использую эту методику уже много лет.

Плюсы:

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

Минусы:

- не все сразу понимают чисто оформительское назначение "Истина И" и "Ложь Или"
- уходит больше времени на начальное написание выражения
- выражение занимает большее число строк
- часто не оправдывает себя в простых выражениях
- автоформатирование кода выравнивает все строки условия по одной границе

Шаблоны

Для удобства написания сложных логических выражений по этой методике рекомендую добавить себе шаблоны

Условие с корневой группой "И" -

Если Истина
    И <?> 
Тогда
КонецЕсли;

Условие с корневой группой "Или"

Если Ложь
    Или <?>
Тогда
КонецЕсли;

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. fixin 3976 21.09.12 10:36 Сейчас в теме
а не проще ли для этого примера по другому?

Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
Расчет(ГруппаРасчета);

Условие = НомерИзменяемойКолонки = "4";
Условие = Условие ИЛИ НомерИзменяемойКолонки = "4";
Условие2 = НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7;
Условие = Условие ИЛИ Условие2;

Дешево и сердито, я лично перешел на такой способ.
Вместо Условие2 лучше писать осмысленный текст, тогда еще и комментирование происходит, например УсловиеГруппыОсобыхРасчетов.
chembulatov76; Shmell; LordKim; Ovkay; cleaner_it; Atori-kun; VladC#; rpgshnik; unmensch; Jogeedae; Lancelot-2M; sulfur17; daho; nsasov; Gasilin; su_mai; Rustig; brr; +18 Ответить
2. tormozit 5821 21.09.12 11:14 Сейчас в теме
(1) В некоторых случаях такой подход действительно оправдан, но в большинстве случаев он излишне повышает "жесткость" логической конструкции.
kostas; inord777; +2 1 Ответить
3. fixin 3976 21.09.12 12:03 Сейчас в теме
(2) зато прозрачно и наглядно.
chembulatov76; premierex; +2 Ответить
39. su_mai 88 13.12.14 09:50 Сейчас в теме
(1) А я думал, что он это ты :), ошибся :)))
66. inf012 07.07.17 06:43 Сейчас в теме
(1)
Условие = НомерИзменяемойКолонки = "4";
Условие = Условие ИЛИ НомерИзменяемойКолонки = "4";
Условие2 = НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7;
Условие = Условие ИЛИ Условие2;

А что это за конструкция такая с несколькими равно в строке, не встречал ее в типовых конфах?
Как ее правильно читать, где написано?
75. SiAl 73 18.08.17 12:10 Сейчас в теме
(66) Переменная в 1С версии 8 может быть булевой переменной. А потому самый левый знак равно - это знак присваивания, а все дальнейшие знаки равно - это знаки сравнения.
Waanneek; +1 Ответить
4. Steelvan 24.09.12 21:55 Сейчас в теме
В языке Дракон удобно визуализировать такие выражения.
Serg_1C(M); +1 Ответить
5. vlad.frost 187 26.09.12 00:56 Сейчас в теме
Цель рефакторинга - сделать код более читаемым. А вот это вот "ЕСЛИ Ложь ИЛИ НомерИзменяемойКолонки = "4"" у меня уже выворачивает мозги наизнанку.

Я бы написал так:

ВыполнитьРасчетПоНомеруКолонки(ГруппаРасчета, НомерИзменяемойКолонки, мИдГруппы7); // Выделили метод

Процедура ВыполнитьРасчетПоНомеруКолонки(ГруппаРасчета, НомерИзменяемойКолонки, мИдГруппы7)

  Если НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Тогда
    Расчет(ГруппаРасчета);
    Возврат;
  КонецЕсли;

  Если ГруппаРасчета <> мИдГруппы7 Тогда // Инвертируем условие
    Возврат;
  КонецЕсли;

  Если НомерИзменяемойКолонки = "7" Или НомерИзменяемойКолонки = "8" Тогда
    Расчет(ГруппаРасчета);
  КонецЕсли;

КонецПроцедуры;
Показать


Согласитесь, так читается ещё легче.
oyti; Barbos; PSKMOL; LordKim; markw; kuzyara; wolfsoft; Fressten; NN2P; Lacrimosa0000; kharuz; sulfur17; rabota.v8.1c; SunShinne; корум; Chernik; asf-trade; bdvtdviking; Tolpinski; borda4ev; Rustig; +21 Ответить
6. tormozit 5821 26.09.12 01:19 Сейчас в теме
(5) Возможно проблема только в адаптации мышления к элементарным приемам из булевой алгебры для тех кто с ней не знаком. Истина не меняет результат конъюнкции (ИСТИНА И), и Ложь не меняет результат дизъюнкции (ЛОЖЬ ИЛИ).
Обрати внимание, я не предлагал их записывать в одну строку специально чтобы увеличить наглядность. Так что ты исказил мою методику.
zqzq; pbabincev; sulfur17; charushkin; dgolovanov; METAL; borodatii; AzagTot; NittenRenegade; e-sin; EmpireSer; vasiliy_b; aspirin4eg; +13 1 Ответить
8. vlad.frost 187 26.09.12 12:49 Сейчас в теме
(6) Вот представьте, инженер техподдержки, ему 35 лет. Он булеву алгебру учил двадцать лет назад в школе. У него ещё десять заявок в очереди и злой пользователь на линии. И вот он смотрит на ваш код и пытается понять, что же значит ваше семиэтажное выражение. Каковы шансы, что он легко поймёт, что вы имели ввиду, когда писали этот код?

Возможно, ваше выражение тождественно первоначальному, но легче читать его не стало.
oyti; kuzyara; wolfsoft; VladC#; Brawler; RailMen; unmensch; SkyHunter; sulfur17; alvabul; +10 1 Ответить
9. fixin 3976 26.09.12 13:13 Сейчас в теме
(8) полностью согласен. Тормоз, ты нарушаешь принцип KISS.
10. tormozit 5821 26.09.12 13:52 Сейчас в теме
(8), (9)
Это обычные споры для рефакторинга.
Выносить ли в отдельную функцию фрагмент кода, который с большой вероятностью будет вызван только в одном месте?
Оформлять ли в виде отдельной переменной выражение, которое с большой вероятностью будет использовано только в одном месте?
Выносить ли во временную таблицу пакета подзапрос, который с большой вероятностью будет использован только в одном месте?

Ответ на такие вопросы (абстаригуясь от специфики запросов к данным) обычно
- Да, если фрагмент настолько большой или сложный, что затрудняет восприятие/чтение/понимание логики программы.
- Нет - в остальных случаях, т.к. для человека последовательное с фиксацией промежуточных результатов в виде отдельных переменных чтение программы труднее.

Таким образом если есть возможность сохраняя приемлемую читаемость программы отказаться от лишних промежуточных переменных, то я рекомендую ее использовать. В случае сложных логических выражений этого помогает достичь предлагаемая методика.
for-elenak; Xershi; zqzq; sulfur17; CratosX; palsergeich; +6 1 Ответить
40. su_mai 88 13.12.14 09:53 Сейчас в теме
83. klinval 292 06.09.17 14:43 Сейчас в теме
Первоначальный вариант естественно плох.
Но я дольше буду вникать в выражение:
Если Ложь
    Или НомерИзменяемойКолонки = "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 секунд меньше вникать в код), то почему-бы это не использовать?
markw; rpgshnik; mvxyz; kraynev-navi; Артано; +5 Ответить
84. tormozit 5821 15.09.17 23:05 Сейчас в теме
(83) Если есть время, желание и условие пишется с нуля либо полностью понятно, то так писать конечно в целом лучше. Однако строк получится заметно больше и вероятность внести ошибку выше. Также для не с нуля написанного выражения придется досконально разобраться во всех деталях условия, чтобы не испортить его восприятие привнесенной семантикой новых переменных. Мой же способ позволяет рефакторить и оформлять даже вообще непонятные условия с минимальным риском повреждения их логической и без риска повреждения семантической структуры.
klinval; mvxyz; +2 Ответить
121. ger_kar 28.12.17 17:44 Сейчас в теме
(8) Мне 42 года, в процессе программирования (не только 1С) булеву алгебру использую постоянно. Конкретно для меня семиэтажное выражение более наглядно и понятно и проще для восприятия. Про других не знаю. И вообще вопрос восприятия он очень субъективен. Но странный должно быть инженер, который выучил алгебру 20 лет назад, потом 20 лет с ней не сталкивался и тут на тебе :)
7. StepanZaytsev 26.09.12 02:24 Сейчас в теме
я конечно не претендую на мнение авторитетное, но не проще ли все делать логическими схемами, еще с курса информтики так все делали, чем придумывать новые схемы?? это как на программировние
rpgshnik; +1 Ответить
11. Rustig 1478 26.09.12 22:29 Сейчас в теме
ТормозАйти, у тебя наверняка есть еще какие-нибудь трюки, способы, личные методики программирования (разработки). Мне интересно и полезно читать как саму идею публикации, так и шлейф комментариев. :) так что просим на бис :)
mvxyz; sulfur17; METAL; kuzyara; Созинов; +5 Ответить
12. software1c 3 26.09.12 23:27 Сейчас в теме
Плюс автору. За методику ФОРМАТИРОВАНИЯ кода. Однозначно, четко и понятно даже пятикласснику
ger_kar; sulfur17; METAL; NittenRenegade; +4 1 Ответить
13. new_user 179 05.10.12 16:16 Сейчас в теме
Че-т какие-то комментарии неоднозначные! Мне очень приемчик понравился, активно использую его в практике! Автору спасибо!..
122. ger_kar 28.12.17 18:00 Сейчас в теме
(13) Так и должно быть, ибо это вопрос восприятия, а он очень и очень субъективен.
14. aspirin4eg 08.10.12 15:54 Сейчас в теме
Применять булеву алгебру, на мой взгляд, следует именно для упрощения логических конструкций и исключения ненужных проверок в условиях. Иначе она несет только усложнение. Восприятие скобок облегчается если их записывать правильно. Тогда кстати и читаемость условий намного упрощается.
premierex; +1 Ответить
15. kalyaka 580 10.10.12 09:23 Сейчас в теме
Форматирование однозначно повышает читаемость! Убрать бы еще лишние слова "Истина" и "Ложь" и будет вообще отлично.
16. tormozit 5821 10.10.12 09:34 Сейчас в теме
(15) В таком случае ты не сможешь просто закомментировать первое условие в каждой группе и сохранить синтаксическую корректность.
ger_kar; Gluk_1C; sulfur17; Spec1c82; +4 Ответить
86. kalyaka 580 25.10.17 10:00 Сейчас в теме
(16)Перечитал еще раз, идея понравилась :)
87. tormozit 5821 25.10.17 10:35 Сейчас в теме
(86) Лучше поздно, чем никогда =)
17. Созинов 10.10.12 17:13 Сейчас в теме
За заметку +. Было бы неплохо почитать об улучшении читаемости кода, если есть еще методики, а то недавно свой код годовой давности правил - был в шоке. Да и сейчас зачастую пишу такое, что потом себе руки отрезать хочется :-)
amon_ra; Ворчун; +2 Ответить
18. vlad.frost 187 10.10.12 17:35 Сейчас в теме
19. logarifm 1074 11.10.12 12:24 Сейчас в теме
Мозговынос и не нахожу в таких условиях ничего кроме трудностей их отладки и восприятия. Мое ИМХО - обойтись гораздо проще и более эфективно написав несколько упрощенных условий чем одно но с сумасшедшшей структурой. Не оправдано это... Остаюсь при своем мнении и не ставлю ни плюса ни минуса.

ЗЫ. охота было влипить минус но остановило лишь то, что автор знает о чем пишет и это труд. А минус за сложность и не рациональное использование таких выражений. (Игра слов)
kuzyara; VladC#; rpgshnik; Anchoret; корум; aspirin4eg; mrXoxot; const000; Yashazz; dj_serega; zikonza; ffgnebel; klinval; Sashko773; Manticor; Tedman; DrAku1a; Craig; OVladius; Evil Beaver; igor-pn; Eillecho; vlad.frost; +23 2 Ответить
20. e.kogan 1853 29.08.13 12:17 Сейчас в теме
(19) logarifm, лично мне приятнее читать грамотный и структурированный текст, чем конструкции вроде "Мое ИМХО - обойтись гораздо проще и более эфективно написав несколько упрощенных условий чем одно но с сумасшедшшей структурой. Не оправдано это..."

//SARCAZM//
21. logarifm 1074 29.08.13 12:38 Сейчас в теме
(20) e.kogan, А в чем не граммотность опридиления условий в простом виде:

Если Тогда
Если Тогда
Если Тогда

и т.п.
КонецЕсли;

Причем здесь конструктивность языка вообще!? Тебе как минимум сюда или наподобие этого:
читать книги С.Макконнелла "Совершенный код". Вообще не путай статью автора из структурированным кодом!
VladC#; kharuz; +2 1 Ответить
22. e.kogan 1853 29.08.13 13:47 Сейчас в теме
(21) logarifm, спасибо, Стива Макконнелла читала. Я про чистоту и системность мышления, выражающуюся не только в программном коде, но и в естественном языке. А с этим у вас определённо проблемы.
24. DrAku1a 1314 21.11.13 04:03 Сейчас в теме
(21)
Если ТипЗнч(Объект)=Тип("СправочникСсылка.Номенклатура") Тогда
Если НЕ Объект.Пустая() Тогда
...
КонецЕсли
КонецЕсли;
43. CagoBHuK 32 29.05.15 09:27 Сейчас в теме
(21) logarifm, внутри каждого Если придется повторять один и тот же код.
23. logarifm 1074 29.08.13 13:55 Сейчас в теме
на просторы интернета.... ахахах смешно. Облегчу с поиском:
И́МХО или ИМХО́ (от англ. IMHO, In My Humble Opinion), также имхо или imho (строчными буквами) — русская транслитерация английского акронима, означающего «по моему́ скромному мнению» .

Область использования сокращения — эхоконференции, форумы, чаты, и другие (как публичные, так и частные) места для выражения своего отношения к какому-нибудь предмету. В разговорной речи встречается относительно редко.
25. YanTsys 12 21.11.13 13:18 Сейчас в теме
(23) logarifm, думаю проблема не в "ИМХО", а в формулировке "обойтись гораздо проще и эфективно", для того чтобы понять какой смысл вы заложили в предложение попробуйте составить обратное. Как оно будет звучать: "обойтись сложнее и неэффективно"?
Кроме того:
"влИпить",
"статью автора ИЗ структурированным кодом",
"сумасшедшШей",
"опрИдИления".

Ну и на вопрос:
"А в чем не граммотность опридиления условий в простом виде:
Если Тогда
Если Тогда
Если Тогда
и т.п.
КонецЕсли;
"

1С при проверке на такой код выдаст ошибку:
err: Ожидается ключевое слово 'КонецЕсли'

Граммотно писать:
Если Тогда
ИначеЕсли Тогда
ИначеЕсли Тогда
и т.п.
КонецЕсли;

И если девушка читала Стива Макконнелла то с вашей стороны будет "наивно" полагать, что она не понимает значение вашего "ИМХО", и проверьте на приборах скромность вашего мнения, лично мне кажется вы его недооцениваете :)
for-elenak; teploukhov; +2 Ответить
26. logarifm 1074 21.11.13 13:29 Сейчас в теме
Ой, а я просто и не знал, что там ошибка, а еще ошибка в том что в условиях нет логических выражений и что?
27. borda4ev 25.11.13 17:17 Сейчас в теме
А как же ?(Условие, истина, Ложь), на наглядно?
Так же для простоты и наглядности можно использовать соответствие, то есть заводить несколько вариантов, а потом небольшим условием его обходить.
28. ЧИА 163 04.02.14 13:35 Сейчас в теме
не буду придираться к коду
придерусь к идее

как приверженец написания кода через отладчик, считаю, что
1. условия должны быть простыми
2. везде должно быть место точке останова

таким образом, надо писать не одну дикую проверку
и не структуру типа

Если Тогда
ИначеЕсли Тогда
ИначеЕсли Тогда
КонецЕсли;

а структуру типа

Если Тогда

Если Тогда
Иначе
КонецЕсли;

Иначе

Если Тогда
Иначе
КонецЕсли;

КонецЕсли;
29. tormozit 5821 04.02.14 13:48 Сейчас в теме
(28) Чтобы было более наглядно, приведи свой вариант кода для примера из статьи.
30. ЧИА 163 04.02.14 15:12 Сейчас в теме
НадоСчитать = Ложь;

Если ГруппаРасчета = мИдГруппы7 Тогда

Если (НомерИзменяемойКолонки = "8") Тогда
    НадоСчитать = Истина;
Иначе
    //
КонецЕсли;

Иначе

Если 
    (НомерИзменяемойКолонки = "7") 
    Или 
    (НомерИзменяемойКолонки = "4")
    Или 
    (НомерИзменяемойКолонки = "5")
    Тогда
    НадоСчитать = Истина;
Иначе
    //
КонецЕсли;

КонецЕсли;

Если НадоСчитать  Тогда
    Расчет(ГруппаРасчета);
КонецЕсли;

Показать
32. tormozit 5821 04.02.14 16:19 Сейчас в теме
(30) Сразу видно дублирование кода "Расчет(ГруппаРасчета);". Подумай что будет, если там не одна строка будет, а 30 например =)
33. ЧИА 163 04.02.14 16:23 Сейчас в теме
(32)
что будет, если там не одна строка будет, а 30 например

если в блоке больше 8 строк (требования моих наставников), ну или 16 (один экран, мои), это или процедура, или функция

переделал с одним запуском
38. xFoG 09.07.14 10:43 Сейчас в теме
(30) ЧИА,
таким образом, надо писать не одну дикую проверку
и не структуру типа

Если Тогда
ИначеЕсли Тогда
ИначеЕсли Тогда
КонецЕсли;

а структуру типа

Если Тогда

Если Тогда
Иначе
КонецЕсли;
Показать

В первом случае после получения истины мы остальные проверки не проводим, во втором - проверяем все, что увеличивает время выполнения участка кода.
(31) ЧИА,
запросы рекомендую писать не через вложенные
а через временные таблицы

и отлаживать проще
и нагляднее

Простота отладки сомнительна. Скопировать текст вложенного запроса в консоль проще.
(33) ЧИА
если в блоке больше 8 строк (требования моих наставников), ну или 16 (один экран, мои), это или процедура, или функция

Всегда считал, что единственным условием является множественность использования блока, а не размер. Каким же шрифтом вы пишите, что у вас 16 строк на экран умещается?
31. ЧИА 163 04.02.14 15:39 Сейчас в теме
по тем же причинам

запросы рекомендую писать не через вложенные
а через временные таблицы

и отлаживать проще
и нагляднее

и быстрее обычно выполняется
34. -fox- 05.02.14 09:07 Сейчас в теме
По мне, если условие сложное, его всегда можно разбить на более простые + сделать грамотные комментарии.
sergey484; +1 Ответить
35. lesenoklenok 23 07.02.14 09:54 Сейчас в теме
Спасибо за идею, но мне кажется что итоговый вариант как то смотрится сложнее. Ну это только лишь мое мнение.
36. poyson 24.03.14 14:40 Сейчас в теме
Чтоб понять надо вникнуть :). В целом интересный подход. Спасибо.
37. Пан 7 24.05.14 12:51 Сейчас в теме
любая структуризация полезна, спасибо
41. YouName 13.12.14 23:24 Сейчас в теме
Мне этот метод понравился! Возьму на вооружение.
По мне любой метод найдёт своего "пользователя".
42. palsergeich 19.02.15 15:42 Сейчас в теме
Это как стенография, овладевшим все понятно, но конкретно меня количество скобочек еще никогда не смущало, а вот такая запись нормально прочиталась с 5го раза и не факт что другое выражение я прочитаю с 1ой попытки.
Метод интересный, но увы, мне за такое оторвут пальцы.
Просто показал товарищу конечное выражение, он мне в ответ скинул картинку, как он это видит.

Таки код должен быстро читаться не только Вами но и другими. А стандартное написание подразумевает запись в исходном виде.
44. Kiber_ 11 02.06.15 17:19 Сейчас в теме
По поводу группировки логических выражений в блоки на основе "одинаковых логических операций" - целиком согласен с автором.
Но как-то показался очень сложным процесс раскрытия скобок.
Также не понравились "Ложь" и "Истина" в качестве первого операнда блока.
Сам-бы написал так:
Если НомерИзменяемойКолонки = "4"
	Или НомерИзменяемойКолонки = "5"
	Или НомерИзменяемойКолонки = "7"
	Или (НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7) Тогда
	Расчет(ГруппаРасчета);
КонецЕсли;
for-elenak; inf012; drjc; sulfur17; +4 Ответить
45. tormozit 5821 02.06.15 19:40 Сейчас в теме
(44) Так плохо отличим конец условия от начала кода под условием.
46. dyuha 19 30.08.15 04:17 Сейчас в теме
У этого метода два офигенных плюса:
Можно быстро закомментировать любое условие;
При отладке и точку останова можно поставить в любом месте, и шагать по F10/F11 удобней.
mvxyz; sulfur17; Spec1c82; +3 Ответить
47. Spec1c82 04.09.15 13:07 Сейчас в теме
Сначала глянул только исходное условие и конечный результат. Сразу не понял зачем нужны "Если Ложь ИЛИ" и "Если Истина И". Пришлось прочитать полностью и после осмысления понял всю красоту предлагаемого решения.
Очень наглядно было сравнение с отбором настроек компоновки данных.
Удобно что легко можно закомментировать любое из условий, в том числе и первое. Соответственно отладка тоже упрощается.
Впрочем порой красоту структуры в целях оптимизации придется нарушить и в первую очередь проверять наиболее вероятные условия (если есть такое понимание или статистика).
dgolovanov; +1 Ответить
48. vvirus 19 18.09.15 07:45 Сейчас в теме
Красивый подход ,
использую такой вариант записи

(+) при переходе на динамические условия "открытый" ИЛИ не блокирует дополнительные условия
(+) сохраняеться история введения ограничений
(-) читаеться возможно сложнее чем вариант топик стартера

Если (
(НомерИзменяемойКолонки = "4")
Или (НомерИзменяемойКолонки = "5")
)
Или (
(
(НомерИзменяемойКолонки = "7")
Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7)
)
)
Тогда
Расчет(ГруппаРасчета);
КонецЕсли;



но и это у меня не оптимизация, а лёгкое упрощение чтения

если за оптимизацию то необходимость расчёта ожидается в свойствах колонки и(или) в свойствах группы

то есть ...


Если ( ТекИзменяемаяКолонка.Рассчет ИЛИ ТекГруппаРасчета.Рассчет )
Тогда Расчет(ТекГруппаРасчета);
КонецЕсли;

Разумеется группа условий содержащая ИЛИ всегда в скобках
49. Yashazz 3249 01.10.15 14:00 Сейчас в теме
Уникально редкий случай, когда я склонен согласиться с fixin'ом. Сложную логику надо не переписывать так, этак и разэдак, а упрощать. Реальным упрощением является грамотное использование промежуточных переменных, это и отлаживать легче.
50. tormozit 5821 01.10.15 14:21 Сейчас в теме
(49) Ну это тот же холивар "алгоритмическое или декларативное", "пакет из 10 запросов или один сложный запрос". Я показал для тех, кто предпочитает декларативный стиль, как на мой взгляд оптимальнее оформлять такие выражения. Любители алгоритмического стиля могут конечно результат каждой логической операции помещать в отдельную переменную и давать ей семантически качественное имя =), но это тоже крайность. Так что хороший разработчик должен уметь грамотно сочетать эти подходы и не "холиварить".
hydro2588_2015; charushkin; NittenRenegade; dgolovanov; Гриффин; +5 Ответить
51. NittenRenegade 87 30.10.15 16:08 Сейчас в теме
В начале мне запись не понравилась, т.к. и исходную я прочитал совершенно без труда. В отличие от вариантов людей, предлагавших разбивать на какие-то вызываемые части.
Однако после комментария software1c вернулся к получившейся записи и понял её. Действительно, для сложных условий запись отличная.
52. Гость 16.11.15 15:15
Интересная статья + нашел для себя несколько интересных способов оформления в комментариях.
Вывод:
+ Не приветствуются собственные велосипеды (Если Ложь Или...)
+ Условие 1го уровня - 1 таб, 2го уровня 2 таб и т.д. для читабельности
+ Одно условие = одна строка, для возможности быстро закомментировать

Если
	НомерИзменяемойКолонки = "4" Или
	НомерИзменяемойКолонки = "5" Или
	НомерИзменяемойКолонки = "7" Или
	( НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7 )
Тогда
	// ...
КонецЕсли;
Показать
53. xFoG 18.11.15 11:02 Сейчас в теме
(52) HardCoder,
Только "ИЛИ" в твоем примере хорошо бы писать перед тем выражением, к которому оно относится. Как и запятые и т.д.
Тогда, удалив или закомментив строку, ты не пролучишь ругань на лишнее "ИЛИ".
54. grumagargler 661 31.12.15 01:59 Сейчас в теме
а почему просто не убрать лишние скобки?

	Если (НомерИзменяемойКолонки = "4"
		Или НомерИзменяемойКолонки = "5"
		Или НомерИзменяемойКолонки = "7")
		Или (НомерИзменяемойКолонки = "8"
			И ГруппаРасчета = мИдГруппы7) Тогда
		//...
	КонецЕсли;


плюс, если уж заботится о качестве кода, допускать трехсловные идентификаторы нельзя.
А если нужен идентификатор из трех слов, то значит сам контекст уже кандидат на рефактор и разбиение на более мелкие функции.
rpgshnik; klinval; e-sin; +3 Ответить
58. e-sin 4 10.02.16 21:08 Сейчас в теме
(54) grumagargler,
Лучше совсем убрать.

Если НомерИзменяемойКолонки = "4"
	Или НомерИзменяемойКолонки = "5"
	Или НомерИзменяемойКолонки = "7"
	Или НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7 Тогда
		//...
КонецЕсли;
CSiER; rpgshnik; klinval; dg15000; +4 Ответить
55. Nykyanen 281 13.01.16 09:24 Сейчас в теме
За часть про оформление (+) за часть про Рефакторинг (-).
Ведь даже школьник знает что выражения типа: А или Б или В = не (не А и не Б и не В)
Решать такой пример легче и человеку и машине, так как при использовании только И без ИЛИ и получении первой ложь все выражение в скобках будет ложь.
Особенно это важно в запросах. Так как ИЛИ в секции ГДЕ запроса при выполнении выполнит два запроса с каждым из условий и сделает их объединение.

Вывод идем учить преобразования логических выражений, кто ещё не в курсе что это такое.
SunShinne; +1 Ответить
56. tormozit 5821 13.01.16 09:52 Сейчас в теме
(55) Nykyanen,
Ведь даже школьник знает что выражения типа: А или Б или В = не (не А и не Б и не В)

Судя по комментам здесь, это ошибочное утверждение. Не уверен, что мысль твою про рефакторинг я понял. Ты предлагаешь вообще не использовать оператор ИЛИ что ли? Если так то почему он есть во всех языках, раз он такой вредный и избыточный?
57. Nykyanen 281 13.01.16 14:31 Сейчас в теме
(56) Цель рефакторинга — сделать код программы легче для понимания. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований.

Я хотел добавить, что выполнив логические преобразования выражений можно упростить понимание и так же часто получается повысить скорость работы. Согласен, что не всегда замена всех ИЛИ на И упростит запись и понимание, но на моей практике в 80% случаев замена ИЛИ на И упрощает понимание. Так же в процессе логические преобразования оказывается, что некоторые из выражений не влияют на результат всего выражения и/или можно сократить повторяющиеся выражения.

Конечно ИЛИ имеет право на жизнь как и много чего другого. Тут как с сортировкой можно в лоб сортировать, а можно пузырьком или еще каким то более хитрым методом.

Вот пример преобразования выражения из статьи.
((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) | {замена на буквы по порядку на АБВГД} |
(А ИЛИ Б) ИЛИ (В ИЛИ (Г И Д)) =
А ИЛИ Б ИЛИ В ИЛИ (Г И Д) =
НЕ(НЕ А И НЕ Б И НЕ В И НЕ(Г И Д)) =
НЕ(НЕ(НомерИзменяемойКолонки = "4") И НЕ(НомерИзменяемойКолонки = "5") И НЕ(НомерИзменяемойКолонки = "7") И НЕ((НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7))) =
НЕ(НомерИзменяемойКолонки <> "4"
И НомерИзменяемойКолонки <> "5"
И НомерИзменяемойКолонки <> "7"
И НЕ((НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7)))

Так как в скобках все через И а за скобками НЕ, тогда если хотя бы одно выражение равно ЛОЖЬ в скобках, тогда и все выражение в скобках равно ЛОЖЬ, а все выражение равно ИСТИНА. Пример, НомерИзменяемойКолонки = 5, тогда все выражение в скобках равно ложь, а все выражение равно истина.
59. maks_20 70 01.03.16 11:03 Сейчас в теме
Пользуюсь такой методикой. Солидарен с автором - удобно, наглядно, читабельно. Стоит один раз понять всю логику и потом уже проблем не будет.
rpgshnik; dgolovanov; +2 Ответить
60. lunjio 63 28.08.16 23:17 Сейчас в теме
книга "Совершенный код", совет автора - объединять такие условия в логически понятные группы, вместо НомерИзменяемойКолонки = "4" вынести предварительно в отдельную переменную и писать ПользовательМеняетКолонкуЦена = НомерИзменяемойКолонки = "4", а в условиях уже будет Если ПользовательМеняетКолонкуЦена ИЛИ ПользовательМеняетКолонкуСумма и т.д, сейчас такие процессоры, что нужно идти в сторону удобночитаемости кода, и не заморачиваться на том, что выполнится пару лишних условий в жертву удобночитаемости и логического смысла кода.
invertercant; klinval; корум; +3 Ответить
61. Юрий-К 86 12.01.17 08:08 Сейчас в теме
Давно делаю как Сергей, еще с Дельфи осталась такая традиция,

также "привил" себе привычку скобки подряд не ставить - "((", или разреживать скобки пробелами " ( ( " или разносить на разные строки, читаемость повышается.

пример
было  Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))

Стало Если (
                        (НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5")
                    )
62. spacecraft 12.01.17 08:34 Сейчас в теме
(61) для меня более читабелен первый вариант.
Второй размазанный по странице получается. А если учитывать, что в нем блок кода еще, то на страницу может не поместиться. Тогда совсем не читабельно получается.
63. romasna 254 11.04.17 15:25 Сейчас в теме
Мне нравятся такие штучки, улучшающие обзор кода. Всегда отдавал предпочтение структуре логического выражения
Если <Начало условия >
     <Продолжение условия>
Тогда
    <Блок операторов>
КонецЕсли

А из этой статьи узнал еще о некоторых простых приемах, улучшающих понимание сложных выражений. Спасибо автору.
Вот только одна незадача: фирма 1С не приветствует такое структурирование логического выражения и после авто-форматирования блока программного кода вся наша красотища превращается в (на примере автора статьи)
Если Ложь
    Или НомерИзменяемойКолонки = "4"
    Или НомерИзменяемойКолонки = "5"
    Или НомерИзменяемойКолонки = "7"
    Или (Истина
    И НомерИзменяемойКолонки = "8"
    И ГруппаРасчета = мИдГруппы7)
    Тогда
    Расчет(ГруппаРасчета);
КонецЕсли;
Показать

Меня всегда раздражало это маленькое недоразумение... :)
64. www2000 57 25.04.17 13:23 Сейчас в теме
Еще можно добавить, что такой стиль оформления позволяет безболезненно закомментировать один из элементов условия. Но для этого надо последнию скобку таже переносить на отдельную строку.
65. tormozit 5821 28.05.17 23:56 Сейчас в теме
Конструктор запроса из подсистемы "Инструменты разработчика" теперь по умолчанию использует описанный в статье иерархический стиль (и-или дерево) сборки условий отбора и соединений.
67. Release 07.07.17 07:12 Сейчас в теме
Левой переменной присваивается результат сравнения: Результат = (ПервоеЗначение = ВтороеЗначение), подобно: Результат = ПервоеЗначение <> ВтороеЗначение или Условие2 = НомерИзменяемойКолонки <> "8".
68. binx 90 11.07.17 07:31 Сейчас в теме
На мой взгляд если много условий,то это не очень хорошо и плохо читаемо в любом случае как не форматируй.
69. slawa 26 26.07.17 10:26 Сейчас в теме
Чем больше пользуюсь - тем больше позитива от этого метода.
Попробуйте.

Например:
Для каждого эл Из Объект.Товары Цикл
	Если Ложь
		ИЛИ (Истина
			И ИспользуетсяОСНО 
			И эл.СчетУчета = ПланыСчетов.Хозрасчетный.ИнвентарьИХозяйственныеПринадлежностиВЭксплуатации)  // МЦ.04
		ИЛИ (Истина
			И ИспользуетсяОСНО 
			И эл.СчетУчета.Родитель = ПланыСчетов.Хозрасчетный.Материалы // 10
			И эл.СчетУчета.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады) <> Неопределено)
	Тогда
		НужноСоздатьПоступлениеМЦ = Истина;
	Иначе
		НужноСоздатьПоступлениеМЦ = Ложь;
		Прервать;
	КонецЕсли; 
КонецЦикла;
Показать
70. Devi 29 03.08.17 06:17 Сейчас в теме
Народ - я один что-ли это заметил?

Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
    Расчет(ГруппаРасчета);
КонецЕсли;


Ну ни как не однозначно
Если Ложь
    Или НомерИзменяемойКолонки = "4"
    Или НомерИзменяемойКолонки = "5"
    Или НомерИзменяемойКолонки = "7"
    Или (Истина
        И НомерИзменяемойКолонки = "8"
        И ГруппаРасчета = мИдГруппы7)
Тогда


Всеми этими оптимизациями угробили логику работы

Аналог карявками автора это будет:

Если Ложь
    Или НомерИзменяемойКолонки = "4"
    Или НомерИзменяемойКолонки = "5"
    Или (Истина
        И   НомерИзменяемойКолонки = "7"
        И ГруппаРасчета = мИдГруппы7)
    Или (Истина
        И НомерИзменяемойКолонки = "8"
        И ГруппаРасчета = мИдГруппы7)
Тогда
Показать


Так что РАЗ НИ КТО ЭТОГО ДАЖЕ НЕ УВИДЕЛ эта "оптимизация" и "наглядность" под БОЛЬШИМ сомнением!
71. tormozit 5821 03.08.17 07:02 Сейчас в теме
(70) Да, ты один смог так ошибиться. Проверь что выдаст оригинал и что выдаст твой вариант при НомерИзменяемойКолонки = "7" и ГруппаРасчета <> мИдГруппы7 . Их поведение будет различным. Обрати внимание на приоритеты логических операций. А ИЛИ Б И В эквивалентно А ИЛИ (Б И В), а не (А ИЛИ Б) И В.
sasha777666; +1 Ответить
72. Devi 29 03.08.17 07:15 Сейчас в теме
(71) Раскрой скобки ещё раз ВНИМАТЕЛЬНЕЕ как раз логику работы ты сломал... Скобочки во второй и третьей строчке верхнего примера говорят что эти строчки возможны только при равенстве нижнему условию в третьей строчке...

Метод по началу мне показался интересным, но судя по твоему минусу ты даже не понял в чём суть - ребёночка то в мутной водичке ты выплеснул не глядя - заблуждайся дальше...
73. tormozit 5821 03.08.17 09:23 Сейчас в теме
(72) Научиться признавать ошибки - непростая задача. Я помогу тебе.
Прикрепленные файлы:
тест.t1c
spetzpozh; mvxyz; teploukhov; sasha777666; unichkin; Sashares; +6 Ответить
74. slawa 26 11.08.17 14:07 Сейчас в теме
А так сдвинуть лидирующий Истина или Ложь
Тоже вроде ничего и в глаза не бросается

	Если									Ложь
		ИЛИ СС_ТемаЗадание.СоздатьСчетНаОплату
		ИЛИ СС_ТемаЗадание.СоздатьКП
		ИЛИ СС_ТемаЗадание.СоздатьДоговор
	Тогда
	....
76. KlesAlex 4 28.08.17 17:03 Сейчас в теме
С таким количеством скобок и сравнений не часто сталкиваюсь.
Но из похожего - различные заполнения свойств через равенство оформляю по принципу чтобы знак равенства был в одном месте.
Например

НоваяЗапись_____ =_____ПеременнаяТаблицы.Добавить();
НоваяЗапись.а1___=_____ПолучитьА1();
НоваяЗапись.Упр__=_____ПолучитьУпр();
78. tormozit 5821 28.08.17 20:45 Сейчас в теме
(76) Такое оформление кода я лично не использую и считаю его больше вредным чем полезным, т.к. редактированию оно сильно мешает. А вот читать такой код конечно приятнее. В идеале конечно хочется 2 режима просмотра кода - для чтения и для редактирования - с быстрым переключением между ними. Тогда такое оформление будет приносить больше пользы чем вреда.
77. herfis 365 28.08.17 18:04 Сейчас в теме
1) Выносить "Тогда" на отдельную строку в сложных условиях мне тоже казалось нагляднее и удобнее.
Но плюнул в итоге, т.к. противоречит стайл-гайдам 1С и автоформатирование конфигуратора тоже его не любит (корежит при рефакторинге)
2) заменять первое условие на Истина/Ложь для удобства рефакторинга тоже неоднозначный вариант. Тасовать при рефакторинге чуть удобнее и быстрее, но опять-таки больше авторский стиль получается. А я стараюсь писать так, чтобы левому человеку код глаз не резал. И ценю такой же чужой код.
А в сухом остатке получается просто грамотное составление логических выражений и оформление их по одинэсовскому стайл-гайду.
rpgshnik; +1 Ответить
79. nvv1970 31.08.17 07:42 Сейчас в теме
За собой и за другими замечал в своё время - у новичков есть желание усложнить условия, объединить их в одно, написать их сложно. Это как бы показывает уровень.
Более опытные стараются дробить на отдельные конструкции, чтобы при отладке понимание причин того или иного результата условия не занимало больше 0 секунд. Есть 10 составляющих условия - в идеале столько же веток выполнения.
На практике конечно нужна золотая середина. Но мой посыл: УПРОЩЕНИЕ - наше все, но без фанатизма.
Пс: от паразитных ложь и истина однозначно коробит.
for-elenak; vlad.frost; +2 Ответить
80. vlad.frost 187 31.08.17 12:10 Сейчас в теме
81. tormozit 5821 31.08.17 13:58 Сейчас в теме
(80) Тоже просто процитирую это здесь
Объединение условных операторов
Проблема: У вас есть несколько условных операторов, ведущих к одинаковому результату или действию.
Решение: Объедините все условия в одном условном операторе.
82. tormozit 5821 03.09.17 16:43 Сейчас в теме
Добавил в статью по одному плюсу и минусу

+ сокращает левые отступы, вложенность условий, количество строк в коде по сравнению с другими удобочитаемыми стилями
- автоформатирование кода выравнивает все строки условия по одной границе
85. Vortigaunt 82 20.09.17 14:26 Сейчас в теме
Cам пришел к чему-то аналогичному.
Сначала длиннные условия у меня перестали влезать в одну строку на мониторе, поэтому разбил их переносами.
Плюс при сравнении / объединении сразу видно в какой части условия изменение.
А потом до меня дошло, что скобочки в сложных условиях это почти то же самое, что и фигурные скобки, например, в java. И если написание кода в 1 строчку - это плохо и рекомендуется форматировать код оступами, то почему нельзя также форматировать сложные вложенные условия?
89. ManyakRus 392 09.11.17 15:27 Сейчас в теме
вместо Истина надо писать 1=1
Ложь: 0=1
Я во всех запросах пишу:
ГДЕ 1=1
:)
90. VitaliyCeban 398 09.11.17 16:25 Сейчас в теме
Не в огорчение сказано, но на ум приходят только три слова: "адъ и израиль". Бедные мои глаза.

Код из шапки я бы написал следующим образом:
Если НомерИзменяемойКолонки = "4" 
 ИЛИ НомерИзменяемойКолонки = "5"
 ИЛИ НомерИзменяемойКолонки = "7" 
 ИЛИ НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7 Тогда
    Расчет(ГруппаРасчета);
КонецЕсли;


Минусы по сравнению с подходом автора: Нужно вручную выравнивать пробелами.
Плюсы: Отличная читаемость.

По аналогии с индексами в СУБД: наличие индекса увеличивает время записи, но последующие чтения выполняются существенно быстрее. Так и тут, лучше один раз "дольше" написать, но потом чтобы не было больно глазам и стыдно за свой код.
91. acsent 1149 09.11.17 18:48 Сейчас в теме
нужно бы и скобочку последнюю переносить
Если Ложь
    Или НомерИзменяемойКолонки = "4"
    Или НомерИзменяемойКолонки = "5"
    Или НомерИзменяемойКолонки = "7"
    Или ( Истина
        И НомерИзменяемойКолонки = "8"
        И ГруппаРасчета = мИдГруппы7
    ) // Эту скобочку тоже переносим если нужно будет закомментировать
Тогда
Показать
92. tormozit 5821 10.11.17 00:06 Сейчас в теме
(91) Пробовал так, но получается слишком много почти пустых строк (по количеству закрывающих скобок). Тут минусы для меня перевесили плюсы. Однако когда возникает потребность закомментировать последнее условие группы, я делаю именно так, но временно.
96. acsent 1149 10.11.17 18:10 Сейчас в теме
(92) Те первую истину писать не влом, а вот 2ю скобочку переносить влом.
А можно ведь и вторую истину писать ))

ИЛИ (ИСТИНА
И НомерИзменяемойКолонки = "8"
И ГруппаРасчета = мИдГруппы7
И ИСТИНА)
97. tormozit 5821 10.11.17 19:33 Сейчас в теме
(96) Где я писал что мне "в лом"? Я писал "слишком много почти пустых строк".
93. rpgshnik 2185 10.11.17 05:24 Сейчас в теме
(91)
	Если ЛОЖЬ 
		ИЛИ НомерИзменяемойКолонки = "4" 
		ИЛИ НомерИзменяемойКолонки = "5"		
		ИЛИ НомерИзменяемойКолонки = "7" 
		ИЛИ (ИСТИНА
		И НомерИзменяемойКолонки = "8" 
		И ГруппаРасчета = мИдГруппы7)  //нормально комментируется
		Тогда	
		Расчет(ГруппаРасчета);
	КонецЕсли;
Показать
94. rpgshnik 2185 10.11.17 05:26 Сейчас в теме
В результате форматирования будет выглядить всё так:

	Если ЛОЖЬ 
		ИЛИ НомерИзменяемойКолонки = "4" 
		ИЛИ НомерИзменяемойКолонки = "5"		
		ИЛИ НомерИзменяемойКолонки = "7" 
		ИЛИ (ИСТИНА
		И НомерИзменяемойКолонки = "8" 
		И ГруппаРасчета = мИдГруппы7)
		Тогда	
		Расчет(ГруппаРасчета);
	КонецЕсли;
Показать


Неоднозначный подход конечно, вроде бы интересно, но в то же время смущают эти ЛОЖЬ ИЛИ и ИСТИНА И, возможно попробую методику. Но в начальном примере реально было жутко много скобок, которые можно было просто убрать и облегчить читабельность)))
95. acsent 1149 10.11.17 18:07 Сейчас в теме
Вообще первичное удаление скобочек называется: приведение к дизъюнктивной нормальной форме
98. IntelInside 127 13.11.17 19:50 Сейчас в теме
Сложные и многоэтажные логические конструкции сложны для понимания. Это зло профессии и не нужно их дополнительно усложнять. Их надо нещадно рефакторить и сводить к простым. Правдо это долго.
Фактически Вы сводите логическую конструкцию к легко читаемому виду, где в начале каждой строки стоит условие.
Для И получается легко читаемое на одном дыхании ЕСЛИ ИСТИНА-И-Условие_а-И-Условие_б. Но для ИЛИ получается ересь читаемая как ЕСЛИ ЛОЖЬ-ИЛИ-Условие_а-ИЛИ-Условие_б.
По моему, если условие не очень многоэтажное, то оно и так может читаться при хорошем форматировании. А если условие строк эдак на 15-20, то его Ваша форма только дополнительно усложнит. Его надо рефакторить.

ПС. Спасибо за мысль. а) буду делать дополнительные оптимизации к своему компилятору. б) при расширении грамматики подумаю над возможностью опустить первый операнд И\ИЛИ: ЕСЛИ И Условие_а И Условие_б; ЕСЛИ ИЛИ Условие_а ИЛИ Условие_б.

ППС. Можно завести себе для красоты константы или пока функции:

(Фантазии, перспектива)
Конст ИстинаЛюбое = Ложь ЭКСПОРТ
Конст ИстинаКаждое = Истина ЭКСПОРТ
---
ЕСЛИ ИстинаЛюбое
ИЛИ Условие_а
ИЛИ Условие_б

ЕСЛИ ИстинаКаждое
И Условие_а
И Условие_б
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

Практика программирования v8 Бесплатно (free)

Пакет из 3-х курсов по 1С-программированию. Основная цель - сформировать у слушателей практические навыки, связанные с реализацией задач обмена для прикладных решений, работающих на платформе “1С:Предприятие”, а также с разработкой прикладных решений, предназначенных для автоматизации расчета заработной платы и задач бухгалтерского учета.

22.04.2020    4383    23    Infostart    2    

Есть ли жизнь после внедрения, или упрощаем работу в сопровождении

Управление проектом Бесплатно (free)

Из-за отсутствия грамотных правил разработки на этапе внедрения сильно усложняется работа по поддержке и развитию типовых доработанных конфигураций. О некоторых правилах и подходах в разработке, которые помогут специалистам сопровождать внедренное решение, на конференции Infostart Event 2019 Inception рассказал разработчик компании «Инвестиционная группа Абсолют» Алексей Степаненко.

08.06.2020    3569    0    stepan96    11    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    18386    0    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    17897    0    John_d    22    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    35278    0    unichkin    45    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    12971    0    kuzyara    33    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    14395    0    YPermitin    72    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    6442    0    Sibars    19    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    27671    0    tormozit    100    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    27701    0    Yashazz    45    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    38674    0    rpgshnik    62    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    40751    0    ids79    52    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    46075    0    tormozit    38    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    23979    0    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    22855    0    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    27761    0    ids79    16    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    42065    0    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    63257    0    ids79    40    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    28734    0    avalakh    21    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    19230    0    json    12    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

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

25.04.2019    15255    0    m-rv    2    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    47609    0    ids79    11    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    30962    0    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    23486    0    YPermitin    13    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    18925    0    m-rv    17    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    17508    0    SeiOkami    50    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.07.2019    37593    0    ids79    10    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    45260    0    ids79    20    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    28612    0    m-rv    21    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    22637    0    dmurk    144    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    37917    0    YPermitin    30    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    26126    0    Eret1k    23    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    26661    0    itriot11    34    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    31605    0    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    25082    0    ellavs    88    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    28474    0    YPermitin    53    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    73089    0    Serginio    108    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    19854    0    Vladimir Litvinenko    27    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    34008    0    ids79    9    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    32075    0    ids79    40    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    24414    0    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    37404    0    ids79    72    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    27306    0    grumagargler    26    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    33810    0    ids79    32    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    40637    0    Unk92    21    

Ускоряем 1С: модули с повторным использованием возвращаемых значений Промо

Практика программирования v8 Бесплатно (free)

По роду своей деятельности, мне часто приходится обсуждать с программистами детали реализации той или иной функциональности. Очень часто, разговаривая даже с квалифицированными специалистами я сталкиваюсь с незнанием сути платформенной функциональности Повторного использования возвращаемых значений общих модулей. В данной статье я постараюсь дать краткий обзор и основные особенности этой функциональности.

04.09.2017    50785    0    m-rv    61