|
Приключения булева типа в 1С | ☑ | ||
---|---|---|---|---|
0
romix
19.11.14
✎
22:15
|
Пример проверялся в 1С:Предприятие 8.3 (8.3.5.1186).
&НаСервере Функция Команда1_(к) Если к=1 Тогда Возврат Ложь и Неопределено; // Нет ИначеЕсли к=2 Тогда Возврат Истина Или Неопределено; //Да ИначеЕсли к=3 Тогда Возврат Ложь / Истина; // 0 ИначеЕсли к=4 Тогда Возврат Ложь % Истина; // 0 ИначеЕсли к=5 Тогда Возврат Ложь * Истина; // 0 ИначеЕсли к=6 Тогда Возврат Ложь - Истина; // -1 ИначеЕсли к=7 Тогда Возврат Истина - Ложь; // 1 ИначеЕсли к=8 Тогда Возврат Истина * Истина; // 1 ИначеЕсли к=9 Тогда Возврат Истина + 1; // 2 ИначеЕсли к=10 Тогда Возврат Истина * 5; // 5 ИначеЕсли к=11 Тогда Возврат Истина * Истина; // 1 ИначеЕсли к=12 Тогда Возврат Истина - Истина; // 0 ИначеЕсли к=13 Тогда Возврат Истина + Истина; // 2 ИначеЕсли к=14 Тогда Возврат Истина / Истина; // 1 ИначеЕсли к=15 Тогда Возврат Истина % Истина; // 0 ИначеЕсли к=16 Тогда Возврат 1 Или 1; // Да ИначеЕсли к=17 Тогда Возврат 1 Или 2; // Да ИначеЕсли к=18 Тогда Возврат 2 Или 1; // Да ИначеЕсли к=19 Тогда Возврат 2 Или 3; // Да ИначеЕсли к=20 Тогда Возврат 2 И 3; // Да ИначеЕсли к=21 Тогда Возврат -Истина; // -1 ИначеЕсли к=22 Тогда Возврат Не 0; // Да ИначеЕсли к=23 Тогда Возврат Не 1; // Нет ИначеЕсли к=24 Тогда Возврат Истина - Истина * Ложь; // 1 ИначеЕсли к=25 Тогда Возврат 0 И '2014-01-01'; // Нет ИначеЕсли к=26 Тогда Возврат 555 Или '2014-01-01'; // Да КонецЕсли; КонецФункции &НаКлиенте Процедура Команда1(Команда) Для к=1 по 26 Цикл Попытка зн=Команда1_(к); Сообщить(""+к+": "+зн); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЦикла; КонецПроцедуры Во всех примерах, кроме 1 и 2, по хорошему, должно выдаваться исключение (надеюсь, что в 1С соберутся с мыслями и это поправят). Зачем нужны неявные преобразования числа и булева типа - понять, на самом деле, тяжело. Но есть одна замечательная система, где логика имеет 3 состояния: Да, Нет и Неопределенно (ЭВМ «Сетунь» 1950-х годов, выпускавшаяся в СССР). Трехзначная логика является более правильной и естественной и по Аристотелю http://blogs.pcmag.ru/node/913 , и в мире компьютерных систем http://www.computer-museum.ru/histussr/setun_b.htm . Если ввести «неопределенный» тип в булевы выражения, то это откроет новые горизонты логики, которая засияет новыми (или хорошо забытыми старыми) гранями. |
|||
1
tridog
19.11.14
✎
22:18
|
(0) Если ввести «неопределенный» тип в булевы выражения, то это откроет новые горизонты логики, которая засияет новыми (или хорошо забытыми старыми) гранями.
Хочешь, чтобы УТ11 была написана еще большей опой?) |
|||
2
Волшебник
модератор
19.11.14
✎
22:19
|
чувствуются веяния информационного эфира...
простите, не сдержался... |
|||
3
Ёпрст
19.11.14
✎
22:21
|
(0) Давно хотел спросить - где вещества берешь ? И на чем сейчас сидишь ?
А на счет третичной логики.. дык она в полный рост в tsql |
|||
4
romix
19.11.14
✎
22:26
|
(1) Наоборот - более естественное поведение, когда внутри условия затешется ошибка. При нынешней логике просто с грохотом упадет перед лицом клиента, а так система попытается обработать - причем, со 100% (пожалуй что) попаданием «угадает» то, что и нужно было сделать.
|
|||
5
vvp91
19.11.14
✎
22:30
|
Исключений для всех данных определенных типов выдаваться как раз не должно, а должна происходить конвертация типов. И это поведение честно описано в справке по встроенному языку.
Что касается твоего примера, то к=1 и к=2 будут давать исключения, если поменять операнды местами. Это как раз будет происходить, поскольку Неопределено (ну и Null) не конвертируется. Но исключения у тебя не выдаются, поскольку в 1С сокращенное вычисление булевых выражений. И единственная модификация, которая нужна (по моему скромному мнению) - это вычисление Null и Неопределено в Ложь во встроенном языке. |
|||
6
romix
19.11.14
✎
22:30
|
(3) Взаимоисключающий параграф: если в tsql (и в старых ЭВМ) это хорошо, то почему должно быть плохо в 1С.
|
|||
7
romix
19.11.14
✎
22:33
|
(5) Для преобразования БулевоВЧисло и ЧислоВБулево было бы достаточно явных преобразований. Из-за неявных преобразований компилятор не ловит лишний раз ошибок/мышей.
|
|||
8
romix
19.11.14
✎
22:35
|
(5) Я тоже обратил внимание, что примеры 1 и 2 выдают ошибку, если переставить операнды местами - 1С просто не вычисляет второе выражение, и туда можно подсунуть что угодно (например, строку или дату), с тем же результатом.
|
|||
9
H A D G E H O G s
19.11.14
✎
22:36
|
(8) "1С просто не вычисляет второе выражение"
И это прекрасно. |
|||
11
H A D G E H O G s
19.11.14
✎
22:39
|
"вычислениями по короткой схеме" - так вроде перевели это надмозги.
|
|||
12
Ёпрст
19.11.14
✎
22:42
|
по мне, "короткая" логика в условиях - это хорошо
|
|||
13
Ёпрст
19.11.14
✎
22:42
|
в клюшках такое было только в запросах (в чорных).. а вот в коде - болт, проверялось усё
|
|||
14
romix
19.11.14
✎
22:43
|
(5) Неопределенно просто так конвертировать в Ложь может быть не совсем верно (это не тождественные понятия). Подозреваю, что по алгебре «Сетуни» вычисление условий (И ИЛИ НЕ) с участием неопределенного значения даст более естественные результаты.
|
|||
15
tridog
19.11.14
✎
22:47
|
(7) Если всерьез переживать о том, что компилятор не ловит ошибок, которые мог бы - то нужно бегать по Селезневке с транспортатом и требовать строгой типизации.
|
|||
16
Ненавижу 1С
гуру
19.11.14
✎
22:56
|
Опять всё пропустил
|
|||
17
Ненавижу 1С
гуру
19.11.14
✎
22:58
|
(0) в 1С нет строгой типизации, нет ссылочной целостности, зато есть мерзкие пустые сслыки и неопределено
Смирись или напишу своё, все никак не осилю последнее |
|||
18
фобка
19.11.14
✎
23:07
|
(12) "ленивая"
(0) смотрим 1 случай Ложь<>Истина и Неопределено<>Истина - то есть Ложь 2 случай Если Истина Или.. - Дальше не смотрим ибо Истина |
|||
19
Ненавижу 1С
гуру
19.11.14
✎
23:10
|
Норм язык должен поддерживать и то и то (да я знаю как это тупо обойти в 1С)
|
|||
20
фобка
19.11.14
✎
23:12
|
(5) Булево(Неопределено) = Ложь
|
|||
21
Ненавижу 1С
гуру
19.11.14
✎
23:18
|
Почему ЗначениеЗаполнено(Ложь)=Истина вот это вопрос
|
|||
22
Вуглускр1991
19.11.14
✎
23:45
|
Истина / Истина = Истина в последней инстанции
|
|||
23
France
19.11.14
✎
23:58
|
Автор гад - в отпуску головка не варит..
|
|||
24
France
19.11.14
✎
23:59
|
Ромикс, сорри, ничо личного))
|
|||
25
Asmody
20.11.14
✎
00:03
|
(0) это цветочки по сравнению с приведением типов в ECMAScript
|
|||
26
tridog
20.11.14
✎
01:13
|
(21) Переменная с типом Булево не может быть не завполнена)
|
|||
27
DrZombi
гуру
20.11.14
✎
06:53
|
(0) Вспомни 7-ку, все нормально :)
|
|||
28
Chai Nic
20.11.14
✎
07:24
|
||||
29
Ненавижу 1С
гуру
20.11.14
✎
08:03
|
(26) окуенный ответ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |