| 
    
            
         
         | 
    
    
  | 
OFF. В выражении "Если" отсутствует ветка "Иначе". Нафига собственно? | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:15 
 | 
         
        https://docs.checkbsl.org/checks/overall/IfWithoutElse/
 
        Допустим А может быть простым числом в промежутке от 1 до 10. Если А = 1 Тогда В = В + 2; ИначеЕсли А = 2 Тогда В = В + 10; Иначе // По логике правила, что тут должно быть? КонецЕсли;  | 
|||
| 
    1
    
        СеменовСемен    
     30.08.22 
            ✎
    11:15 
 | 
         
        исключение кидай - кривой параметр     
         | 
|||
| 
    2
    
        Ненавижу 1С    
     гуру 
    30.08.22 
            ✎
    11:21 
 | 
         
        (0) должны быть действия для остальных возможных значений А     
         | 
|||
| 
    3
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:21 
 | 
         
        (1) Почему кривой? Просто в других случаях "В" менять не нужно.     
         | 
|||
| 
    4
    
        Kassern    
     30.08.22 
            ✎
    11:21 
 | 
         
        (0) Иначе В=Б+А; К примеру, или любое другое выражение.     
         | 
|||
| 
    5
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:22 
 | 
         
        (2) Если А = 1 Тогда
 
        В = В + 2; ИначеЕсли А = 2 Тогда В = В + 10; Иначе В = В; // ? )) КонецЕсли;  | 
|||
| 
    6
    
        RomaH    
     naïve 
    30.08.22 
            ✎
    11:23 
 | 
         
        (0) ИМХО, читабельнее иногда выносить действия в отдельные блоки Если Тогда КонецЕсли
 
        т.е. только при выполнении конкретного условия выполняется конкретное действие В = 0; Если А = 1 Тогда В = В + 1; КонецЕсли; Если А = 1 Тогда В = В + 10; КонецЕсли;  | 
|||
| 
    7
    
        Kassern    
     30.08.22 
            ✎
    11:24 
 | 
         
        По теме говорится, что накладывая условия, нужно заложить логику для всех возможных результатов.     
         | 
|||
| 
    8
    
        Ненавижу 1С    
     гуру 
    30.08.22 
            ✎
    11:24 
 | 
         
        во-первых правило спорное
 
        во-вторых можно так: Если А = 1 Тогда Прирост = 2; ИначеЕсли А = 2 Тогда Прирост = 10; Иначе Прирост = 0; КонецЕсли; Б = Б + Прирост;  | 
|||
| 
    9
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:24 
 | 
         
        (6) В этом случае проверка будет два раза если даже выполниться первое условие.     
         | 
|||
| 
    10
    
        RomaH    
     naïve 
    30.08.22 
            ✎
    11:25 
 | 
         
        (6) я в курсе - но читабельнее     
         | 
|||
| 
    11
    
        RomaH    
     naïve 
    30.08.22 
            ✎
    11:25 
 | 
         
        Если А = 1 Тогда
 
        В = В + 1; КонецЕсли; Если А = 2 Тогда В = В + 10; КонецЕсли; вот так конечно  | 
|||
| 
    12
    
        Kassern    
     30.08.22 
            ✎
    11:26 
 | 
         
        Часто бывает, новички косячат в запросах, например в условии указывают:
 
        Выбор когда &ИспользоватьОтборПоСегменту Тогда СегментыКлиентов.Сегмент=&Сегмент Конец А потом удивляются, пожему же при передачи ИспользоватьОтборПоСегменту=Ложь ничего не выводится)  | 
|||
| 
    13
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:28 
 | 
         
        (8) Хорошо. Допустим:
 
        Если А = Истина Тогда СиняяЛиния; ИначеЕсли А = Ложь Тогда КраснаяЛиния; Иначе // Ненада линий КонецЕсли; (где А не булево)  | 
|||
| 
    14
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:29 
 | 
         
        (11) Хм. А если таких проверок больше двух. Допустим 10.     
         | 
|||
| 
    15
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:30 
 | 
         
        (12) Не понял как это связанно с правилом в (0)?     
         | 
|||
| 
    16
    
        mikecool    
     30.08.22 
            ✎
    11:32 
 | 
         
        (0) это правило в BSL, не нравится - отключи или следуй ему скрипя зубами )     
         | 
|||
| 
    17
    
        Kassern    
     30.08.22 
            ✎
    11:32 
 | 
         
        (15) Как раз напрямую и связано. Человек не предусмотрел Иначе в условии, в итоге получил корявые данные на выходе. Если бы он написал:
 
        Выбор когда &ИспользоватьОтборПоСегменту Тогда СегментыКлиентов.Сегмент=&Сегмент Иначе Истина Конец - то это бы дело отработало корректно.  | 
|||
| 
    18
    
        СеменовСемен    
     30.08.22 
            ✎
    11:33 
 | 
         
        (17) то функция, а то процедура     
         | 
|||
| 
    19
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:36 
 | 
         
        (16) Надеюсь осознать и не поскрипывать. ))
 
        (17) Если внимательно посмотреть, то просто Если без ИначеЕсли не обязательно должно иметь Иначе.  | 
|||
| 
    20
    
        Kassern    
     30.08.22 
            ✎
    11:36 
 | 
         
        (18) Причем тут функция/процедура? Обычное условие в запросе. И в зависимости от того как оно описано, будут выбираться данные из БД. Если же не предусмотреть все варианты параметра ИспользоватьОтборПоСегменту, то на выходе можно получить не корректные данные.     
         | 
|||
| 
    21
    
        Kassern    
     30.08.22 
            ✎
    11:39 
 | 
         
        (19) имхо, лучше иметь иначе. Простой пример
 
        Выборка=Запрос.Выполнить.Выбрать(); Если Выборка.Следующий() Тогда Результат=Выборка.Данные; КонецЕсли; Возврат Результат; Надо вам рассказывать, что будет, если выборка окажется пустой?)  | 
|||
| 
    22
    
        alarm2020    
     30.08.22 
            ✎
    11:41 
 | 
         
        (0) Блэкджек, конечно же     
         | 
|||
| 
    23
    
        Kassern    
     30.08.22 
            ✎
    11:42 
 | 
         
        Вы конечно можете заранее объявить переменную Результат и присвоить ей какое нибудь значение, а можете это сделать в Иначе. Но в любом случе, оба этих действий описывают все возможные результаты. О чем и речь в статье. Только там пишут, что правильнее это указывать в Иначе.     
         | 
|||
| 
    24
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:43 
 | 
         
        (21) Немного не ясно выразился. Правило в (0) работает только если есть конструкция "ИначеЕсли".
 
        Для простых случаев Если КонецЕсли, правило в (0) не употребляется. А по примеру, ИМХО проще так: Результат = Неопределено; ... Возврат Результат;  | 
|||
| 
    25
    
        СеменовСемен    
     30.08.22 
            ✎
    11:43 
 | 
         
        (21) Такое удобнее писать 
             | 
|||
| 
    26
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:45 
 | 
         
        (23) Окай. Есть XML файл. Меня в нем интересуют пяток атрибутов, а их много. Как я должен построить проверку?     
         | 
|||
| 
    27
    
        Kassern    
     30.08.22 
            ✎
    11:46 
 | 
         
        (24) Ну так, что мешает расширить логику данного примера?
 
        Если ТипЗнч(Выборка.Данные)=Тип("Строка") Тогда Результат=Выборка.Данные; ИначеЕсли ТипЗнч(Выборка.Данные)=Тип("Справочник....") Тогда Результат=Представление(Выборка.Данные); КонецЕсли  | 
|||
| 
    28
    
        Aleksey    
     30.08.22 
            ✎
    11:46 
 | 
         
        (24) Из правила это не следует
 
        (еобходимо всегда реализовывать ветку "Иначе" для каждого оператора "Если")  | 
|||
| 
    29
    
        СеменовСемен    
     30.08.22 
            ✎
    11:46 
 | 
         
        (26) пиши затычку 
        Иначе //ничего  | 
|||
| 
    30
    
        Ненавижу 1С    
     гуру 
    30.08.22 
            ✎
    11:47 
 | 
         
        (13) я же написал, что правило спорное     
         | 
|||
| 
    31
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:50 
 | 
         
        (27) Не понял.
 
        (28) Тем не менее. (29) Тот же Сонар скажет, что условие пустое. )) (30) Ну вот я о том...  | 
|||
| 
    32
    
        СеменовСемен    
     30.08.22 
            ✎
    11:51 
 | 
         
        (31) пиши затычку для сонара  
        правильный синтаксис не знаю // это условие не проверять  | 
|||
| 
    33
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    11:53 
 | 
         
        (32) Классно, конечно. :-) Но возможно есть какое-то более методологически верное решение...     
         | 
|||
| 
    34
    
        Aleksey    
     30.08.22 
            ✎
    11:53 
 | 
         
        (31) Ну так и напиши типа 
 
        сообщить("ХЗ как мы сюда попали"); или Состояние("Пропускаем ненужные параметры")  | 
|||
| 
    35
    
        СеменовСемен    
     30.08.22 
            ✎
    11:54 
 | 
         
        (33) а как ты видишь себе это решение?     
         | 
|||
| 
    36
    
        Kassern    
     30.08.22 
            ✎
    11:54 
 | 
         
        (31) Что не понятного? Это правило лишь говорит о том, чтобы логика обходила все результаты. Вот есть у вас числа от 1 до 10.
 
        Если Число<5 Тогда Трампампам ИначеЕсли Число>5 И Число<10 тогда тампампам2 КонецЕсли Вот так в статье говорят, что не нужно писать. Вы не учли число 10 к примеру. Что будет если попадет именно оно. Это правило обязывает, чтобы была какая либо логика для числа 10 в этом частном случае. Достаточно было написать Иначе в которое оно попадет.  | 
|||
| 
    37
    
        Ненавижу 1С    
     гуру 
    30.08.22 
            ✎
    11:56 
 | 
         
        (36) и даже значение 5 не попадает никуда )))     
         | 
|||
| 
    38
    
        eklmn    
     гуру 
    30.08.22 
            ✎
    11:56 
 | 
         
        (0) всё просто, 1с этож как табуретка, нет ничего и не надо
 
        если ... иначе конецесли; всё, чё ты тут ищешь? ))  | 
|||
| 
    39
    
        Kassern    
     30.08.22 
            ✎
    11:57 
 | 
         
        (37) Я это еще один частный случай который требует логики.     
         | 
|||
| 
    40
    
        Kassern    
     30.08.22 
            ✎
    11:58 
 | 
         
        (37) Это еще один частный случай, который требует логики.     
         | 
|||
| 
    41
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    12:03 
 | 
         
        (34) А если это код для фонового задания? ))
 
        (35) Для этого я и задал вопрос на форуме. (36) Еще раз: Если Число<5 Тогда Трампампам ИначеЕсли Число>5 И Число<10 тогда тампампам2 Иначе // тут никакого тампампама не надо. и что сюда написать? КонецЕсли  | 
|||
| 
    42
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    12:04 
 | 
         
        (38) Ну нет. Пустое условие это тоже неправильно. ))     
         | 
|||
| 
    43
    
        Aleksey    
     30.08.22 
            ✎
    12:07 
 | 
         
        (41) ну я вообще не понимаю во втором условии (Число>5)
 
        А так я бы написал что то типа неверный параметр или труляля, в зависимости от контекста  | 
|||
| 
    44
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    12:16 
 | 
         
        (43) Ну допустим описываем действия человека.
 
        Делать он может, что угодно, но в двух случаях что-то определенное. Если ПошелНаКухню Тогда ЗахватиПеченьку; ИначеЕсли ЛегНаДиван Тогда ВозьмиВРукиКнижку; Иначе // что тут? исключение не выкинешь, т.к. все действия валидны. сообщение тоже. КонецЕсли;  | 
|||
| 
    45
    
        СеменовСемен    
     30.08.22 
            ✎
    12:22 
 | 
         
        (44) что ты хочешь доказать? 
        Да у правила есть реальные исключения. Все исключения прописываются руками  | 
|||
| 
    46
    
        Kassern    
     30.08.22 
            ✎
    12:23 
 | 
         
        (44) Как раз в Иначе вы должны и описать "Делать он может, что угодно" А сейчас у вас в коде он может лишь ЗахватиПеченьку и ВозьмиВРукиКнижку.     
         | 
|||
| 
    47
    
        Kassern    
     30.08.22 
            ✎
    12:24 
 | 
         
        Получается так:
 
        Если ПошелНаКухню Тогда ЗахватиПеченьку; ИначеЕсли ЛегНаДиван Тогда ВозьмиВРукиКнижку; Иначе ДелайЧтоУгодно; КонецЕсли;  | 
|||
| 
    48
    
        Serg_1960    
     30.08.22 
            ✎
    12:25 
 | 
         
        (0) Эээ... простые числа с 1 до 10 - это 2,3,5,7. "Если А = 1" - исключение
 
        (44) Так, как Вы не все условия описали, то в "Иначе" должно быть действие "по умолчанию" и ни в коем случае не исключение. "Иначе" в качестве обработки исключительной ситуации, может быть только в том случае, если выше по алгоритму были описаны все условия для всех допустимых значений. PS: о чём эта ветка, о какой проблеме автора - я таки не понял :)  | 
|||
| 
    49
    
        Serg_1960    
     30.08.22 
            ✎
    12:32 
 | 
         
        "Делать он может, что угодно, но..."
 
        Если ПошелНаКухню Тогда ЗахватиПеченьку(); ИначеЕсли ЛегНаДиван Тогда ВозьмиВРукиКнижку(); ИначеЕсли СделалЧтоМожет Тогда ВозьмиСПолкиПирожок(); Иначе НичегоНеДелатьОнТожеМожет(); КонецЕсли;  | 
|||
| 
    50
    
        Галахад    
     гуру 
    30.08.22 
            ✎
    12:49 
 | 
         
        (47) (49) Окай. Приведите пример:
 
        ДелайЧтоУгодно НичегоНеДелатьОнТожеМожет(); (48) Косяк. Натуральные же. ))  | 
|||
| 
    51
    
        VladZ    
     30.08.22 
            ✎
    12:54 
 | 
         
        (0) Тут явная коллизия требований:
 
        1. С одной стороны в выражении "Если" желательно иметь "Иначе". 2. С другой стороны, согласно заданному алгоритму вариант "Иначе" не предусмотрен. По идее, получается, что данный кусок алгоритма "Иначе" будет ошибочным и тут нужно либо обработать ошибку, либо вывести пользователю сообщение и закрыть программу.  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |