Имя: Пароль:
1C
1С v8
Пишу код (параноик стайл)
0 Вуглускр1991
 
23.07.16
00:29
СвойствоНеЗагружатьОбъект = Неопределено;
Если Не ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект", СвойствоНеЗагружатьОбъект) Тогда
    СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
Хочу иметь гарантированно логическую переменную, в одном из двух состояний.
Избыточно?
1 Alexor
 
23.07.16
00:34
Если условие не отработает, в коде переменная как отрабатывается? Ошибки не будет?
2 Garykom
 
гуру
23.07.16
00:39
(0) Это скорее индусо-китай стайл.

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

А в конце просто "флаг" проверяешь и все.
3 Вуглускр1991
 
23.07.16
00:42
Я как раз далее в коде проверяю
СвойствоНеЗагружатьОбъект
4 Garykom
 
гуру
23.07.16
00:43
Примерно так:

СвойствоНеЗагружатьОбъект = Неопределено;
СвойствоПолучено = ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект", СвойствоНеЗагружатьОбъект);

Если СвойствоПолучено Тогда
Если СвойствоНеЗагружатьОбъект = Истина Тогда
  // уже истина поэтому ничего
Иначе
  СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
Иначе
СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
5 Вуглускр1991
 
23.07.16
00:45
(4) При всех вариантах входящих данных и твой и мой коды дадут одинаковые выходы.
Я итак по максимуму сократил количество строк
КМК
6 Вуглускр1991
 
23.07.16
00:49
Писать, кстати, вот такое
"Если СвойствоНеЗагружатьОбъект = Истина Тогда"
и есть индусо-китай,
проверка булевой переменной на равенство значению Истина может быть по праву использована лишь в запросах, когда их пишут под СУБД.
Во всех остальных случаях
"Если СвойствоНеЗагружатьОбъект Тогда"
7 Garykom
 
гуру
23.07.16
00:51
(6) Я в курсе специально написал чтобы понятнее было, можно же в одно условие свернуть с И.

Если СвойствоПолучено И СвойствоНеЗагружатьОбъект Тогда
// все прекрасно
Иначе
СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
8 Garykom
 
гуру
23.07.16
00:52
(7)+ Ну или перевернуть по или

Если Не СвойствоПолучено ИЛИ Не СвойствоНеЗагружатьОбъект Тогда
СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
9 Вуглускр1991
 
23.07.16
00:55
Я на самом деле о том, что 1С дает метод "Свойство",
но приходится его в дополнительный код оборачивать, или доказывать, что данное свойство в данной точке будет определено обязательно и через нужный тип.
10 Garykom
 
гуру
23.07.16
01:10
Думаем если приравнять Неопределено/NULL к Ложь будет лучше?
11 Garykom
 
гуру
23.07.16
01:12
СвойствоНеЗагружатьОбъект = Неопределено;
ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект", СвойствоНеЗагружатьОбъект);
Если Не СвойствоНеЗагружатьОбъект Тогда
СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
12 Вуглускр1991
 
23.07.16
01:14
(10) Неявно привести в операциях сравнения ...
но может и не лучше.
Я полюбил 8-ку за строгую типизацию
Ссылка, Объект, Выборка
СписокЗначений, ЭлементСпискаЗначений
Так делается много меньше ошибок, из-за которых в 7.7 бывало по часу в отладчике высиживаешь.
13 Вуглускр1991
 
23.07.16
01:16
(11) Если в каком-либо правиле свойство установлено не было, то ругнется после "Не"
14 Лефмихалыч
 
23.07.16
02:10
(0) если Свойство() вернет истину, то при таком коде у тебя ни каких гарантий вообще, т.к. в структуре может быть и не булево. Чтобы было с гарантией, надо проверять тип свойство и принимать какое-то решение, если он - не булево.
15 youalex
 
23.07.16
02:37
(0) ЗаполнитьЗначенияСвойств() можно пользовать
16 Вуглускр1991
 
23.07.16
02:44
(14) С таким ключом я буду совать туда только булево. Если же структуру формирую не я, а чей-то ещё код - то да, надо проверять и тип тоже.
17 youalex
 
23.07.16
02:48
(15) +
ВремСтруктура = Новый Структура("СвойствоНеЗагружатьОбъект ")
ЗаполнитьЗначенияСвойств(ВремСтруктура, ОбъектОписаниеСвойства)

СвойствоНеЗагружатьОбъект = ВремСтруктура.СвойствоНеЗагружатьОбъект
18 youalex
 
23.07.16
02:49
(17) + без этих сгганых гесли.
19 aurora909
 
23.07.16
03:31
(18) почему "г"если ? к чему ?
20 youalex
 
23.07.16
03:46
(19) вам не понягть. поживите с мгоё
21 aurora909
 
23.07.16
04:17
(20) ну хорошо
22 hhhh
 
23.07.16
06:33
(16) поэтому и пишут

Если СвойствоНеЗагружатьОбъект = Истина Тогда

потому что это одновременно и проверка типа, и проверка значения. И всё в одной строчке. ноу хау такое.
23 wertyu
 
23.07.16
06:36
(22) с такой проверкой на тип, если там не булево и не число, выдаст ошибку )
24 wertyu
 
23.07.16
06:44
+(23)  для полного утрирования в коде не хватает Попытки
25 hhhh
 
23.07.16
07:13
(23) нет, ошибку не выдаст. Там именно варианты НЕОПРЕДЕЛЕНО и NULL. В этих вариантах

Если СвойствоНеЗагружатьОбъект = Истина Тогда

сработает нормально. А без проверки типа


Если СвойствоНеЗагружатьОбъект Тогда

выдаст ошибку. В этом принципиальная разница между двумя этими проверками.
26 Рэйв
 
23.07.16
07:56
(25)ссылку тоже не логику неявно не проверит. Все равно придется
Если ссылка<>истина
27 mehfk
 
23.07.16
08:04
СвойствоНеЗагружатьОбъект = Неопределено;
ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект", СвойствоНеЗагружатьОбъект);
СвойствоНеЗагружатьОбъект = (СвойствоНеЗагружатьОбъект = Истина);
28 DES
 
23.07.16
09:01
(27) масломаслянное = (масломаслянное=точномасломаслянное);
29 romix
 
23.07.16
09:26
(0) Вот где троичная логика-то понадобилась...

А в запросах той же 1С троичная логика уже есть - можно попробовать запросами делать то, что вы там хотите сделать. Запросы есть и по таблице значений, если что.
30 Mort
 
23.07.16
09:30
Плохо использовать НЕ в названии переменной, если простым языком.
31 mehfk
 
23.07.16
09:40
(28) Поясни.
32 vvp91
 
23.07.16
09:54
Мда, писатели.

Следующий код упадет, если переменная содержит Неопределено или Null

Если Переменная Тогда
КонецЕсли;


(0) Сделай так:

СвойствоНеЗагружатьОбъект = ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект") И ОбъектОписаниеСвойства.НеЗагружатьОбъект = Истина;
33 vvp91
 
23.07.16
09:58
(0) Еще один момент - очень плохо, когда используют частицу Не в названиях переменных, процедур, функций, имен объектов и реквизитов метаданных.
Двойное отрицание при проверках или чтении таких названий взрывает мозг.

Поэтому (32) можно переписать как:

СвойствоПропуститьОбъект = ОбъектОписаниеСвойства.Свойство("ПропуститьОбъект") И ОбъектОписаниеСвойства.ПропуститьОбъект = Истина;
34 Лефмихалыч
 
23.07.16
12:18
(16) с такой логикой тебе и эта проверка не нужна
35 В тылу врага
 
23.07.16
12:49
СвойствоНеЗагружатьОбъект = ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект", СвойствоНеЗагружатьОбъект) И СвойствоНеЗагружатьОбъект;
36 тарам пам пам
 
23.07.16
12:57
(0) Код нормальный. В типовых 1с пишут как в (35) для булевых свойств. Хотя я бы вообще сделал примерно так:

Функция ОписаниеСвойства(ОткудаОниТамПолучаются)
    Описание = Новый Структура("НеЗагружатьОбъект, ЕщеКакиеТоСвойства", Ложь, Ложь);
    ЗаполнитьЗначенияСвойств(Описание, ОткудаОниТамПолучаются);
    Возврат Описание;
КонецФункции

Так проще потом поменять будет значение по умолчанию + сразу видно, что вообще может быть в структуре. Ну и можно проверку типов сюда же запихать, если уж быть совсем параноиком.
37 В тылу врага
 
23.07.16
12:59
+(35) если там не булево:

СвойствоНеЗагружатьОбъект = ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект", СвойствоНеЗагружатьОбъект) И (СвойствоНеЗагружатьОбъект=Истина);
38 NoNameYet
 
23.07.16
15:44
Немного шокирован предложенными вариантами. Я бы так написал:

Если ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект") Тогда
    СвойствоНеЗагружатьОбъект = ОбъектОписаниеСвойства.НеЗагружатьОбъект;
Иначе
    СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
39 Злопчинский
 
23.07.16
15:58
(38) как ламер - я бы так не писал. не люблю длинные выражения в условиях.
40 NoNameYet
 
23.07.16
16:14
(39) Во-первых, в коде пиписьками не меряюсь, считаю, что чем понятнее код, тем лучше. Во-вторых, где здесь длинное выражение в условии?
41 novichok79
 
23.07.16
16:22
мой индусогод:

Если ОбъектОписаниеСвойства.Свойство("НеЗагружатьОбъект") Тогда
    СвойствоНеЗагружатьОбъект = ОбъектОписаниеСвойства.НеЗагружатьОбъект;
КонецЕсли;

Если ТипЗнч(СвойствоНеЗагружатьОбъект) <> Тип("Булево") Тогда СвойствоНеЗагружатьОбъект = Ложь;
КонецЕсли;
42 novichok79
 
23.07.16
16:24
(42) *т. е. индусокод

перед условием еще надо явно задать значение переменной
СвойствоНеЗагружатьОбъект = Неопределено;
43 Злопчинский
 
23.07.16
16:40
а еще некоторые любят вложенные если по 5-7 уровней, хотя в большинстве случаев такой код спокойно транстформируетя в одно или двухуровневый если
44 NoNameYet
 
23.07.16
16:43
(43) Предложи свой вариант, покажи класс))