Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 4, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Потеря точности во временных таблицах () , Потеря точности при помещении таблицы значений во временную таблицу          
TohaMonster Подменю пользователя
сообщение 28.01.20, 13:21
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 34
Спасибо сказали: 17 раз
Рейтинг: 17

Добрый день, уважаемые гуру!
Считал себя не новичком в 1С, но тут столкнулся с бедой, прошу помощи
Суть проблемы такова: имеем таблицу значений. Помещаем её во временную таблицу запроса. Оператор ВЫРАЗИТЬ, естественно, при этом используем. Но если в исходной таблице значений у нас содержится число с точностью до 18 знаков, то во временной оно уже имеет точность 9 знаков (и не спрашивайте, зачем мне столько)
Код для тестирования примерно такой:
Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    тб1 = Новый ТаблицаЗначений;
    
    Массив = Новый Массив;
    КЧ = Новый КвалификаторыЧисла(31, 18);
    Массив.Добавить(Тип("Число"));
    ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
    тб1.Колонки.Добавить("Цена", ОписаниеТиповЧ);
    
    НоваяСтрока = тб1.Добавить();
    НоваяСтрока.Цена = 1/3;                            //    0.333333333333333333
    
    Сообщить("Цена в строке 1 = "+Строка(тб1[0].Цена));
    
    Запрос1 = Новый Запрос;
    Запрос1.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос1.Текст =
    "ВЫБРАТЬ
    |    ВЫРАЗИТЬ(тбЗначений.Цена КАК ЧИСЛО(31, 18)) КАК Цена
    |ПОМЕСТИТЬ ВТТаблица
    |ИЗ
    |    &тбЗначений КАК тбЗначений
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВЫРАЗИТЬ(ВТТаблица.Цена КАК ЧИСЛО(31, 18)) КАК Цена
    |ИЗ
    |    ВТТаблица КАК ВТТаблица";
    
    Запрос1.УстановитьПараметр("тбЗначений", тб1);
    
    тб2 = Запрос1.Выполнить().Выгрузить();
    
    Сообщить("Цена в строке 1 = "+Строка(тб2[0].Цена));
    
КонецПроцедуры


При выполнении получаем результат:
Цена в строке 1 = 0,333333333333333333
Цена в строке 1 = 0,333333333

Использовал релизы платформы 8.2.19.76 (файловая и sql) и 8.3.6.2041 (файловая)

Подскажите пожалуйста, где тут собака порылась? Как запихнуть в ВТ требуемую точность? Или где почитать. Я уже и ВЫРАЗИТЬ(*1000000000...)/1000000000 пробовал
Заранее благодарен

Vofka Подменю пользователя
сообщение 28.01.20, 13:49
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13372
Из: Киев
Спасибо сказали: 4123 раз
Рейтинг: 3265.6

TohaMonster, это скорее всего баг платформы. Можно написать в 1С об этом и когда-нибудь, возможно, это исправят. Если надо сейчас, то как вариант, если вам нужна точность 18 знаков после запятой, то умножьте значение в таблице на (10*18), а при обработке результата запроса поделите значение на (10*18).

А зачем вам такая точность? smile.gif

Спасибо сказали: TohaMonster,

TohaMonster Подменю пользователя
сообщение 28.01.20, 14:04
Сообщение #3

Общительный
**
Группа: Пользователи
Сообщений: 34
Спасибо сказали: 17 раз
Рейтинг: 17

Vofka @ Сегодня, 13:49 * ,
Н-да, видимо, придется та и сделать. Вот такая штука тоже, прокатила
    Запрос1.Текст =
    "ВЫБРАТЬ
    |    ВЫРАЗИТЬ(тбЗначений.Цена*1000000000 КАК ЧИСЛО(31, 18)) КАК Цена
    |ПОМЕСТИТЬ ВТТаблица
    |ИЗ
    |    &тбЗначений КАК тбЗначений
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВЫРАЗИТЬ(ВТТаблица.Цена КАК ЧИСЛО(31, 18))/1000000000 КАК Цена
    |ИЗ
    |    ВТТаблица КАК ВТТаблица";


Цитата(Vofka @ 28.01.20, 13:49) *
А зачем вам такая точность?

РАУЗ ковыряю. Ужа с ежом, так сказать

Спасибо за быструю реакцию, можно закрывать

fly Подменю пользователя
сообщение 28.01.20, 14:36
Сообщение #4

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 215
Спасибо сказали: 44 раз
Рейтинг: 43

TohaMonster @ Сегодня, 14:04 * ,
Цитата:

"...Числовым у нас может быть реквизит объекта конфигурации или переменные в модулях.
Максимально допустимая разрядность числа составляет 38 знаков, длина целой части не может превышать 32 символа, точность — 10 символов. Хотя в переменных можно оперировать числами превышающих разрядность в 38 символов, но в ИБ (информационную базу) можем записывать значения с длинной целой части не больше 32‑х знаков...." (с)

вероятнее всего, когда помещает в ТЗ для последующего запроса приводит к максимальному возможному или непосредственно выполняя запрос, приводит значение к максимальному количеству знаков после запятой = 10.

Сообщение отредактировал fly - 28.01.20, 14:40

Спасибо сказали: TohaMonster,

TohaMonster Подменю пользователя
сообщение 28.01.20, 14:47
Сообщение #5

Общительный
**
Группа: Пользователи
Сообщений: 34
Спасибо сказали: 17 раз
Рейтинг: 17

Н-да, всё оказалось даже не совсем так. В приведенном примере нормуль работает даже такой запрос, без ВЫРАЗИТЬ:
    
    Запрос1.Текст =
    "ВЫБРАТЬ
    |    тбЗначений.Цена КАК Цена
    |ПОМЕСТИТЬ ВТТаблица
    |ИЗ
    |    &тбЗначений КАК тбЗначений
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТТаблица.Цена КАК Цена
    |ИЗ
    |    ВТТаблица КАК ВТТаблица";


А корень зла кроется в том, что тб1 я тоже выгружал из запроса. тб1 = ЕщеЗапрос.Выполнить().Выгрузить(). И он колонки создает с типом значения (NULL, Число(31, 18)) и вот как это значение ты не типизируй, ничего не получится sad.gif

А вот идея с умножением, видимо, не совсем корректна: там можем нарваться на переполнение мантиссы. А запрос "ВЫРАЗИТЬ(тбЗначений.Цена КАК ЧИСЛО(41,18))" вообще дает ошибку. Короче, надо будет что-то с этими числами повнимательнее почитать

PS. fly уже подтолкнул, спасибо за инфу

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 30.10.20, 1:58
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!