Имя: Пароль:
IT
 
Приключения булева типа в 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) окуенный ответ