Имя: Пароль:
1C
 
Отлегло о сердца - в ТЗ можно хранить числа разных форматов....
,
0 Гений 1С
 
гуру
05.12.07
16:41
Известно, что в 1С числовые реквизиты могут принимать значения не более чем из 32 значащих цифр.
Но в таблице значений можно хранить числа с гораздо большим числом разрядов - я просто боялся, что если в тз в одну колонку попадут числа из реквизитов разной разрядности, они пропадут.
Интересно, а при создании колонки в ТЗ можно использовать квалификаторы большие, чем 32? Т.е. наверное в памяти можно использовать большую разрядность, чем в базе данных.

Информации о максимальном возможном в 1с числе не нашел. Эксперименты ставить лень.


А=1234567890123456789012345678901234567890;
Б=0.1234567890123456789012345678901234567890;
ТЗ=Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Значение");
Стр=ТЗ.Добавить();
Стр.Значение=А;
Стр=ТЗ.Добавить();
Стр.Значение=Б;

обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ));


Вывело таблицу:

Значение
1 234 567 890 123 456 789 012 345 678 901 234 567 890
0,123456789012345678901234567890123456789
1 Immortal
 
05.12.07
16:43
вот те вопросик ..почему Выполнить("" + Число1 + "" + Число2)
где Число1 = Число2 = 0,123456789012345678901234567890123456789
не работает, а работает только с Окр?
2 Immortal
 
05.12.07
16:43
НПП я там убираю
3 Гений 1С
 
гуру
05.12.07
16:44
Еще пример:

А=1234567890123456789012345678901234567890;
Б=0.1234567890123456789012345678901234567890;

ТЗ=Новый ТаблицаЗначений();
//ТЗ.Колонки.Добавить("Значение");
ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(20,10)));
Стр=ТЗ.Добавить();
Стр.Значение=А;
Стр=ТЗ.Добавить();
Стр.Значение=Б;

обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ));


Значение:
9 999 999 999,9999999999
0,123456789
4 Гений 1С
 
гуру
05.12.07
16:47
А вот еще код:

А=12345678901234567890123456789012345678901234567890123456789012345678901234567890;
Б=0.12345678901234567890123456789012345678901234567890123456789012345678901234567890;

ТЗ=Новый ТаблицаЗначений();
//ТЗ.Колонки.Добавить("Значение");
ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(120,60)));
Стр=ТЗ.Добавить();
Стр.Значение=А;
Стр=ТЗ.Добавить();
Стр.Значение=Б;

обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ));

Вывод:
9 999,999999999999999999999999999999999999999999999999999999999999
0,12345678901234567890123456789012345678901234567890123456789

Мораль - в памяти 1с можно хранить максимум 64 значащих числа, что ровно в 2 раза больше, чем в памяти и это здорово, потому что гарантированно можно в одной колонке взять из базы реквизит с 32 знаками до запятой и с 32 знаками после запятой.
5 Immortal
 
05.12.07
16:51
представляешь, это легко узнать когда делаешь этот самый реквизит..больше 32 тебе просто не даст ввести
6 Черт
 
модератор
05.12.07
16:54
"в памяти 1с можно хранить максимум 64 значащих числа, что ровно в 2 раза больше, чем в памяти" - 1с использует свою память?
7 Гений 1С
 
гуру
05.12.07
17:24
(6) чем в базе данных имелось ввиду. ;-)
8 Immortal
 
05.12.07
17:28
(7) гм..что я делаю не так : ввожу 32 знака в реквизите и указую точность 32?
9 Immortal
 
05.12.07
17:29
т.е. максимум и так понятно 64..
вот то что можно хранить 64 целое..хотя вопрос для каких задач.
10 Гений 1С
 
гуру
05.12.07
17:36
(8) 32/32 - значит 32 разряда максимум, т.е. 32 знаков после запятой и ноль в целой части, не тупи.
(9) аналогично...
11 Immortal
 
05.12.07
17:42
(10) ты сам тупишь.. 32,32 по твоему как храниццо?
12 AndreYAN
 
05.12.07
17:47
А что для 1С есть конфы для хранения данных по межгалактическим полетам? Зачем необходимо использовать реквизиты такого типа? Не догоняю :(
13 MrRustam
 
05.12.07
17:52
(12) ну например считать зарплату...
14 AndreYAN
 
05.12.07
17:53
(13) а ты оптимист :) Где ж такая бывает?!
15 Immortal
 
05.12.07
17:54
(13) сомневаюсь что там такие цифры.
16 Фауст
 
05.12.07
18:33
Собираетесь автоматизировать расчет  массы электрона ?
17 Hadgehogs
 
05.12.07
18:55
Иронизируете?
А Гений1С - молодец. Неугомонный, раскопал. Респект.
Похоже 1С может оперировать с числами (целыми) больше, чем 4(8) байта.
В принципе, размерность числа не ограничена.
Для этого ей приходится использовать свои алгоритмы сложения, вычитания, умножения и деления.
А в базе хранить больше 64 бита - нельзя, ибо в SQL - максимальное целое - bigint(64 бита).
18 Михаил Козлов
 
05.12.07
18:58
Любопытно, что и арифметические операции с такими числами делает (и, вроде, правильно). Надо будет попробовать решить какую-нибудь плохо обусловленную систему линейных уравнений. Помню, при вещественном типе из-за округлений численное решение было неверным при размерности = 18, а при двойном вещественном - при 23.
19 AndreYAN
 
05.12.07
19:06
Ладно, а чем не катит хранить в число в текстовом формате, и при необходимости преобразовывать его?
20 Hadgehogs
 
05.12.07
19:12
to (19) Избыточность
Лучше уж хранилище значений
Счаст попробкю сохранить
21 hhhh
 
05.12.07
19:12
(9) у меня 80 знаков получается, может имеется в виду 64 шестнадцатеричных?



   Таб = Новый ТаблицаЗначений;
   Таб.Колонки.Добавить("а");
   Таб.Колонки.Добавить("б");
   Таб.Колонки.Добавить("в");
   Стр = Таб.Добавить();
   
   Стр.а = "0.111111111100000000001111111111000000000011111111110000000000111111111100000000001";    
   Стр.б = Число(Стр.а);
   Стр.в = Стр.б + Стр.б;

Стр.в получается:

0.22222222220000000000222222222200000000002222222222000000000022222222220000000000222222222200000000002
22 Hadgehogs
 
05.12.07
19:16
О, работает...
23 Immortal
 
05.12.07
22:01
(21) нет, не 16 - ричные.
гм.. в таком случае получается что  у 1с под это дело свой тип
24 Immortal
 
05.12.07
22:02
я вот только не понимаю когда преобразование происходит. А оно происходит потому что иначе тормозульки при расчётах были бы дикие.
25 AeDen
 
05.12.07
23:27
Гений, вот если-б не твое отношение к женщинам и детям - уважал-бы...
26 Гений 1С
 
гуру
06.12.07
09:20
(11) дятел 32,32 - это 32 значащих цифры и позиция точки в начале т.е. ноль, точка и 32 разряда.
27 Гений 1С
 
гуру
06.12.07
09:24
(25) женщины - твари, дети - цветы.
28 Гений 1С
 
гуру
06.12.07
09:52
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("а");
Таб.Колонки.Добавить("б");
Таб.Колонки.Добавить("в");
Стр = Таб.Добавить();

Стр.а = "0.11111111110000000000111111111100000000001111111111000000000011111111110000000000134342423423423423423423423423423423423423423423423422342342342342";    
Стр.б = Число(Стр.а);
Стр.в = Стр.б + Стр.б;

Зн=Стр.в;
сообщить(Зн);
сообщить(СтрДлина(Формат(зн, "ЧГ="))-1);
Зн=Стр.а;
сообщить(СтрДлина(Формат(зн, "ЧГ="))-1);
Сообщить(обМассивВСтроку(Таб.Колонки.в.ТипЗначения.Типы()));
Сообщить(Таб.Колонки.в.ТипЗначения.КвалификаторыЧисла.Разрядность);
Сообщить(Таб.Колонки.в.ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти);

Выдает пустой массив типов и квалификаторы по нулям.

В общем, если тип не задан, т.е. квалификаторы числа равны нулю, то разрядность может быть любая!!!!
29 Гений 1С
 
гуру
06.12.07
09:54
В доказательство вот вам код:


А=12345678901234567890123456789012345678901234567890123456789012345678901234567890;
Б=0.12345678901234567890123456789012345678901234567890123456789012345678901234567890;

ТЗ=Новый ТаблицаЗначений();
//ТЗ.Колонки.Добавить("Значение");

ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(0,0)));
Стр=ТЗ.Добавить();
Стр.Значение=А;
Стр=ТЗ.Добавить();
Стр.Значение=Б;

обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ));


На выходе получаем:
12 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890
0,1234567890123456789012345678901234567890123456789012345678901234567890123456789

Т.е. недокументированная возможность - при использования квалификатора числа с нулем разрядов его длина не ограничена, но видимо это сказывается на быстродействии расчетов. ;-) Такой тип используется в таблицах значений по умолчанию, если не указать тип.

Однако в любом случае в базе нельзя хранить числа, более чем из 32 цифр...


Все, тема раскрыта, постите в базу знаний....
30 Гений 1С
 
гуру
06.12.07
10:01
Вот что прикольно:

А=1/3;

Сообщить(А);
Сообщить(СтрДлина(А));

0,333333333333333333333333333
29

Т.е. если политика хранения понятна, то политика арифметики еще требует исследований
31 Гений 1С
 
гуру
06.12.07
10:02
А=12345678901234567890123456789012345678901234567890123456789012345678901234567890;
Б=0.12345678901234567890123456789012345678901234567890123456789012345678901234567890;

ТЗ=Новый ТаблицаЗначений();
//ТЗ.Колонки.Добавить("Значение");


ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(0,0)));
Стр=ТЗ.Добавить();
Стр.Значение=А;
Стр=ТЗ.Добавить();
Стр.Значение=Б;
Стр=ТЗ.Добавить();
Стр.Значение=Б/3;

обВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ));


Значение:
12 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890 123 456 789 012 345 678 901 234 567 890
0,1234567890123456789012345678901234567890123456789012345678901234567890123456789
0,0411522630041152263004115226300411522630041152263004115226300411522630041152263


Т.е. если задан квалификатор, то разрядность соответствует разрядности числа...
32 Михаил Козлов
 
06.12.07
18:43
Дополнение к (18).
Попробовал решить систему Годунова (плохо обусловленная системы линейных уравнений) методом Жордана-Гаусса.
При размерности 64 дает 3 знака верных, 66 - уже 1. Но вообще-то впечатляет.
33 Гений 1С
 
гуру
07.12.07
09:43
(32) код в студию!
34 Скептик
 
07.12.07
09:51
А говрят -- пятница, пятница...
Однако ж -- понедельник начинается не в субботу, а таки в вечер пятницы.
Какие люди!..

(запасся патриотичными семечками и уютно уселся на патриотичном табурете)
35 Михаил Козлов
 
07.12.07
14:34
(33) Код чего: Жордана-Гаусса или обработку, которая решает систему Горбунова?
И как выкладывают, если это действительно нужно?
36 Гений 1С
 
гуру
07.12.07
14:44
(35) код обработки, выкладывают копи-пастом
37 Михаил Козлов
 
07.12.07
15:02
Изначально в паскалевском тексте индексы в массивах от 1. Неохота было переделывать на от 0, поэтому для матриц пришлось заводить массивы на 1 большего размера. Т.е. элементы массивов с индексом 0 не нужны. Переделать несложно, хотелось быстрее попробовать.

Перем MettErr; //ошибка метода. Не 0 - система несовместна

Функция abs(x)
      Если x<0 Тогда
       Возврат -x;
   Иначе
       Возврат x;
   КонецЕсли;
КонецФункции

Процедура СкопироватьМассив(источник, приемник, сколько)
 ДЛЯ инд = 0 ПО сколько-1 Цикл
   приемник[инд] = источник[инд];
 КонецЦикла;    
КонецПроцедуры    

Функция НовыйМассив(n)
 м = Новый Массив;
 ДЛЯ к=0 ПО n-1 Цикл
   м.Добавить(0.0);        
 КонецЦикла;    
 Возврат м;
КонецФункции    

//a - матрица уравнений n x n
//b - матрица правых n x m. При n = m и единичной b в результате получается обратная
//n - число столбцов и строк
//m - число правых частей
//MethErr = 1 - матрица вырождена
//MethErr = 2 - матрица вырождена
Процедура GaussJ(a, n, b, m)
 Перем indxc, indxr, ipiv, buf;
 MethErr=0;
 indxc = НовыйМассив(n+1);
 indxr = НовыйМассив(n+1);
 ipiv  = НовыйМассив(n+1);
 buf  = НовыйМассив(n+1);
 ДЛЯ i=1 ПО n Цикл
   big=0.0;
   ДЛЯ j=1 ПО n Цикл
     Если (ipiv[j]<>1) Тогда
       ДЛЯ k=1 ПО n Цикл
           Если (ipiv[k]=0) Тогда
           Если abs(a[j][k])>=big Тогда
             big=abs(a[j][k]); irow=j; icol=k;
           КонецЕсли;
         ИначеЕсли ipiv[k]>1 Тогда
            MethErr=1; Возврат;
         КонецЕсли;
       КонецЦикла;
     КонецЕсли;
   КонецЦикла;
   ipiv[icol]=ipiv[icol]+1;
   Если (irow<>icol) Тогда
     СкопироватьМассив(a[irow], buf, n+1);
     СкопироватьМассив(a[icol], a[irow], n+1);
     СкопироватьМассив(buf, a[icol], n+1);
     СкопироватьМассив(b[irow], buf, m+1);
     СкопироватьМассив(b[icol], b[irow], m+1);
     СкопироватьМассив(buf, b[icol], m+1);            
   КонецЕсли;
   indxr[i]=irow; indxc[i]=icol;
   Если a[icol][icol]=0.0 Тогда
     MethErr=2; Возврат;
   КонецЕсли;
   pivinv=1.0/a[icol][icol]; a[icol][icol]=1.0;
   ДЛЯ l=1 ПО n Цикл a[icol][l]=a[icol][l]*pivinv; КонецЦикла;
   ДЛЯ l=1 ПО m Цикл b[icol][l]=b[icol][l]*pivinv; КонецЦикла;
   ДЛЯ ll=1 ПО n Цикл
     Если (ll<>icol) Тогда
       dum=a[ll][icol]; a[ll][icol]=0.0;
       ДЛЯ l=1 ПО n Цикл a[ll][l]=a[ll][l]-a[icol][l]*dum; КонецЦикла;
       ДЛЯ l=1 to m Цикл b[ll][l]=b[ll][l]-b[icol][l]*dum; КонецЦикла;
     КонецЕсли;
   КонецЦикла;
 КонецЦикла;
 l=n;
 ПОКА l>0 Цикл
   Если (indxr[l]<>indxc[l]) Тогда
     ДЛЯ k=0 ПО n-1 Цикл
       dum=a[k][indxr[l]];
       a[k][indxr[l]]=a[k][indxc[l]];
       a[k][indxc[l]]=dum
     КонецЦикла;
   КонецЕсли;
   l=l-1;    
 КонецЦикла;
КонецПроцедуры

//формирует систему Горбунова (2-х полосная)
//Размер - размер системы
//А - матрица, б - вектор правых частей, как двумерный массив
Процедура СформироватьЗадачу(А, б)
 А = Новый Массив(Размер+1, Размер+1);
 б = Новый Массив(Размер+1, 2);
 ДЛЯ к = 1 ПО Размер Цикл
   ДЛЯ л=1 ПО Размер Цикл
     А[к][л] = 0.0;
   КонецЦикла;    
   А[к][к] = 7/5;        
   Если к<Размер Тогда
     А[к][к+1] = 11/3;
   КонецЕсли;    
   б[к][1] = (152*к+118)/15/(2*к+1)/(2*к+3);        
 КонецЦикла;
 б[Размер][1] = 7/5/(2*Размер+1);
КонецПроцедуры

Процедура СформироватьРешение(х) //для вывода результатов на форму
 Решение.Очистить(); //Решение - таб. часть обработки
 ДЛЯ к=1 ПО Размер Цикл
   стр = Решение.Добавить();
   стр.Вычислено = Число(х[к][1]);
   стр.Точно = 1.0/(2*к+1); //точное решение системы Горбунова
   стр.Невязка = стр.Точно-стр.Вычислено;
 КонецЦикла;    
КонецПроцедуры

Процедура РешитьЗадачу() ЭКСПОРТ
 Перем А,б,х;
 СформироватьЗадачуГ(А, б);
 GaussJ(А, Размер, б, 1);
 СформироватьРешение(б);
КонецПроцедуры
38 luns
 
07.12.07
15:14
Выдержка из описания встроенного языка: "Числовым типом может быть представлено любое десятичное число. Над данными числового типа определены основные арифметические операции: сложение, вычитание, умножение и деление. Максимально допустимая разрядность числа 38 знаков"
39 Гений 1С
 
гуру
10.12.07
10:55
(38) Трендят, в 8.1. как видишь больше знаков
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший