Имя: Пароль:
LIFE
1С v8
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. С другой стороны, согласно заданному алгоритму вариант "Иначе" не предусмотрен.

По идее, получается, что данный кусок алгоритма "Иначе" будет ошибочным и тут нужно либо обработать ошибку, либо вывести пользователю сообщение и закрыть программу.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.