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

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