Имя: Пароль:
1C
1С v8
Странное поведение числа
0 Бюро пиявок
 
13.10.13
11:25
Что у нас происходит с числом?

Завел константу КК1.
Сделал обработку, кинул в нее константу как реквизит BOK1.

В модуле формы:

&НаКлиенте
Процедура Сформировать(Команда)
    Сообщать();
КонецПроцедуры

&НаСервере
Процедура Сообщать()
    
    А = 123456789012345678901234567890;
    Объект.ВОК1 = А;
    Константы.КК1.Установить(Объект.ВОК1);
    Сообщить("КК1 = " + Константы.КК1.Получить());
    Сообщить("Объект.ВОК1 = "+ Объект.ВОК1);
КонецПроцедуры

Меняю точность КК1 и ВОК1, а также само число.

Результаты здесь:
http://yadi.sk/d/X1KVdSrJAqETZ

Что творится на 7-ё строке - для меня загадка. И дальше одни сплошные загадки.

Не могли бы помочь разобраться.

По документации у нас число ограничено 38 разрядами.
В свойствах объекта можно задать длину 32 и точность 32. Это как бы максимум.
При этом переменной можно присвоить число, кажется, любой длины. Т.е. вот переменной А можно присвоить число длиной, скажем, 50 цифр. И оно будет болтаться в этой переменной прекрасно и без искажения.

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

Кстати, что такое число? Вот у меня на 15-й строке файла число или нет? Как бы работает, дк? А почему это число у меня начинается с нуля?

В общем, число меня совсем погубило. Прошу помощи.
1 Rie
 
13.10.13
11:35
(0) Так и в чём проблема-то?
Насчёт переменной - это тебе лишь кажется, что любой длины.
2 Бюро пиявок
 
13.10.13
11:36
(1) Почему кажется. Ну, гигантских чисел я туду не помещал. Но 50 вмещается. И в отладчике видно все 50 будет.
3 Бюро пиявок
 
13.10.13
11:37
(1) Проблема в том, что не могу для себя ничего понять вообще. Откуда взялось 38, например, и как его можно практически применять?
4 Rie
 
13.10.13
11:40
(3) Из внутреннего представления чисел взялось. В SQL:
"p (точность)
Максимальное количество десятичных разрядов числа (как слева, так и справа от десятичной запятой), которые будут храниться. Точность должна быть значением в диапазоне от 1 до максимум 38. Точность по умолчанию составляет 18" - http://msdn.microsoft.com/ru-ru/library/ms187746.aspx
5 Rie
 
13.10.13
11:41
+(4) Просто прими как факт - это в теории числа идут аж до бесконечности. А на практике - всегда есть ограничения. Они могут быть большими, могут быть меньшими - но они будут. Их надо просто знать и учитывать.
6 vde69
 
модератор
13.10.13
11:42
база файловая???
7 vde69
 
модератор
13.10.13
11:43
(6)+ web клиент?
8 Бюро пиявок
 
13.10.13
11:44
(6) Файловый вариант, тонкий клиент.
9 Бюро пиявок
 
13.10.13
11:45
Так. А что такое 30? Почему при 30 начинает искажать значение?
10 Бюро пиявок
 
13.10.13
11:49
(4) Я вот про 38 все-таки понять не могу. Это общая длина числа? Т.е. если условно прикрыть десятичный разделитель, то максимально можно сохранить 38 цифр. Так? Или все-таки по 38 с каждой стороны от разделителя?
11 vde69
 
модератор
13.10.13
11:53
(8) в файловом варианте все вычисления идут на клиенте....

дальше возможны варианты типа v8: v8: получаю разное число (1коп) в web и тонком клиенте
12 Rie
 
13.10.13
11:56
(10) Да. Общая. Написано ведь "как слева, так и справа от десятичной запятой".
13 Бюро пиявок
 
13.10.13
11:56
(11) Спасибо. Это важно. Но я пока не дорос до такого.
Все-таки хотел бы чуть-чуть разобраться хотя бы с файловым фвариантом.
14 Бюро пиявок
 
13.10.13
11:58
(12) Так. Что это для нас значит? Что потом начнутся глюки? Нельзя ли привести пример? Вот у меня в строке 14 всего два разряда, и глюки прут.
15 Зойч
 
13.10.13
11:59
храни такие числа в виде строк да и все
16 Бюро пиявок
 
13.10.13
12:04
(15) Не все. Разобраться хочу.
17 Rie
 
13.10.13
12:06
(14) Честно говоря, из картинки из (0) совершенно непонятно - что в строке 14 (как в других строках) выведено.
18 Бюро пиявок
 
13.10.13
12:11
(17) Не понял вопрос. В реквизите внешней обработки стояла длина 32 и точность 32. При помещении туда числа произошел сбой, и мы видим 0,99 в периоде. А при записи в базу точность была 30, ну, округлила до 1. Т.е. эту строчку как ключевую я бы не выделял.
19 Rie
 
13.10.13
12:22
(18) Если длина = 32 и точность = 32, значит, целой части - не предусмотрено. Вот и.
20 Бюро пиявок
 
13.10.13
12:28
(19) Что-то я не пойму ничего.
Что такое длина? Это все количество цифр справа и слева от запятой? И, как бы задавая точность, мы увеличиваем дробную часть, но крадем пространство у целой части?

Ок. Тогда опять же длина не может быть больше 32. Иначе она просто не запишется в базу.
21 Бюро пиявок
 
13.10.13
12:29
(19) Подождите, не понятно ничего. Я же могу написать: длина 2, точность 15. Имея в виду , что целая часть будет два знака, а дробная - 15. Не так?
22 rphosts
 
13.10.13
12:29
(20) >Что такое длина? Это все количество цифр справа и слева от запятой?
да

>И, как бы задавая точность, мы увеличиваем дробную часть, но крадем пространство у целой части?

да
23 rphosts
 
13.10.13
12:30
(21) конфигуратор позволит?  точно проверяли?
24 Rie
 
13.10.13
12:31
(21) Нет, не так. Так - не можешь.
25 Бюро пиявок
 
13.10.13
12:35
(23) (24) Действительно, нельзя, конфигуратор не позволит.

Так, что у нас тогда в строке 14 происходит?
Получается, что он берет максимально возможное число меньше нуля. Так, вроде.
26 Rie
 
13.10.13
12:40
(25) Он (вернее "оно" - поскольку "1С:Предприятие"; или "она" - поскольку "платформа") пытается выполнить инструкцию в рамках дозволенного. А раз дозволили ей не больше 1 - вот она и изродила такой перл.
27 Бюро пиявок
 
13.10.13
12:43
Вроде бы, разобрался. Спасибо.
28 Бюро пиявок
 
13.10.13
12:49
Послушайте, так 38-то вообще не применяется, получается? Ведь в конфигураторе только 32 можно задать.
29 Зойч
 
13.10.13
13:02
(21) запятая тоже входит в длину и занимает 1 знак
30 Бюро пиявок
 
13.10.13
13:29
(29) Я поэкспериментировал - кажет, не занимает.
У константы задал длину 6, точность - 3.

А = 123.123;
    Константы.КК1.Установить(А);
    Сообщить("А = " + А);
    Сообщить("Константы.КК1 = "+ Константы.КК1.Получить());

Выдает прекрасно 123,123.
Кстати, что за бесячьи игры с запятой. У меня стояла точка в качестве разделителя. Причем, если туда поставить запятую в программном коде, то получаешь ошибку. А вот - надо же - в процессе выполнения вдруг система вспомнила, что запятую надо вкатить. Чудеса, да и только. Меняю в языке и региональных стандартах винды разделитель на точку. Запускаю - все равно запятая в 1С подставляется.
31 Rie
 
модератор
13.10.13
13:50
(30) Ну почитал бы ты чего-нибудь по программированию, что ли...
Есть синтаксис программы.
Есть вывод данных пользователю. Настраиваемый, кстати.
Есть "локали" ("культуры")...
32 Мимохожий Однако
 
13.10.13
14:08
(30)Метод СтрДлина() что показывает?
33 Бюро пиявок
 
13.10.13
19:09
(32) Мы говорим о числе. Не понял вашу мысль - причем здесь СтрДлина()?
34 EvgeniuXP
 
13.10.13
19:19
(0) смотри курсы Гилева, там рассказывали...
35 Бюро пиявок
 
13.10.13
19:36
(34) Я их смотрю как раз сейчас. Либо пропустил, либо не дошел еще.