Добрый день, уважаемые гуру!
Считал себя не новичком в 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].Цена));
КонецПроцедуры
TohaMonster, это скорее всего баг платформы. Можно написать в 1С об этом и когда-нибудь, возможно, это исправят. Если надо сейчас, то как вариант, если вам нужна точность 18 знаков после запятой, то умножьте значение в таблице на (10*18), а при обработке результата запроса поделите значение на (10*18).
А зачем вам такая точность?
Vofka @ Сегодня, 13:49
,
Н-да, видимо, придется та и сделать. Вот такая штука тоже, прокатила
Запрос1.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(тбЗначений.Цена*1000000000 КАК ЧИСЛО(31, 18)) КАК Цена
|ПОМЕСТИТЬ ВТТаблица
|ИЗ
| &тбЗначений КАК тбЗначений
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЫРАЗИТЬ(ВТТаблица.Цена КАК ЧИСЛО(31, 18))/1000000000 КАК Цена
|ИЗ
| ВТТаблица КАК ВТТаблица";
TohaMonster @ Сегодня, 14:04
,
Цитата:
"...Числовым у нас может быть реквизит объекта конфигурации или переменные в модулях.
Максимально допустимая разрядность числа составляет 38 знаков, длина целой части не может превышать 32 символа, точность — 10 символов. Хотя в переменных можно оперировать числами превышающих разрядность в 38 символов, но в ИБ (информационную базу) можем записывать значения с длинной целой части не больше 32‑х знаков...." (с)
вероятнее всего, когда помещает в ТЗ для последующего запроса приводит к максимальному возможному или непосредственно выполняя запрос, приводит значение к максимальному количеству знаков после запятой = 10.
Н-да, всё оказалось даже не совсем так. В приведенном примере нормуль работает даже такой запрос, без ВЫРАЗИТЬ:
Запрос1.Текст =
"ВЫБРАТЬ
| тбЗначений.Цена КАК Цена
|ПОМЕСТИТЬ ВТТаблица
|ИЗ
| &тбЗначений КАК тбЗначений
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТТаблица.Цена КАК Цена
|ИЗ
| ВТТаблица КАК ВТТаблица";
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua