|
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. С другой стороны, согласно заданному алгоритму вариант "Иначе" не предусмотрен. По идее, получается, что данный кусок алгоритма "Иначе" будет ошибочным и тут нужно либо обработать ошибку, либо вывести пользователю сообщение и закрыть программу. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |