Имя: Пароль:
1C
1С v8
Неоднозначная точность расчета поля в запросе
0 geek
 
30.01.12
10:44
Добрый день!

Я уже не знаю что мне делать, затуп жуткий. Существует такой сложный запрос из СКД:

ВЫБРАТЬ
ОстаткиПоДоговорамДляРаспределенияОстатки.Организация,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Владелец,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Дата,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаНачалаРабот КАК ДатаНачалаРабот,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаОкончанияРабот КАК ДатаОкончанияРабот,
ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток КАК СуммаОстаток,
ВЫБОР
КОГДА ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток <> 0
ТОГДА ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток / ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ КАК Коэффициент
ИЗ
РегистрНакопления.ОстаткиПоДоговорамДляРаспределения.Остатки(&ДатаПо, ) КАК ОстаткиПоДоговорамДляРаспределенияОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиПоДоговорамДляРаспределения.Остатки(&ДатаПо, ) КАК ОстаткиПоДоговорамДляРаспределенияОстатки1
ПО ОстаткиПоДоговорамДляРаспределенияОстатки.Организация = ОстаткиПоДоговорамДляРаспределенияОстатки1.Организация
СГРУППИРОВАТЬ ПО
ОстаткиПоДоговорамДляРаспределенияОстатки.Организация,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Владелец,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Дата,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаНачалаРабот,
ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаОкончанияРабот,
ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток,
ВЫБОР
КОГДА ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток <> 0
ТОГДА ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток / ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ



Вычисляемое поле Коэффициент расчитывается странно. К примеру, в ноябре оно считается с 10 знаками после запятой, а в декабре с 5-ю. Хотя числе везде выгружаются с одинаковой точностью.
Как в запросе принудительно выставить Формат()?
Менял в настройках СКД (как в Наборе данных, так и в Настройках), подставляет цифру с 5 знаками точности, остальное добивает 0-ми.
1 PR
 
30.01.12
10:45
ВЫРАЗИТЬ
2 geek
 
30.01.12
10:46
Во как вставилось:(
3 geek
 
30.01.12
10:46
(1) Пробовал, не помогает
4 PR
 
30.01.12
10:46
(3) Неудачник
5 geek
 
30.01.12
10:47
Хотя может не так как нужно писал ВЫРАЗИТЬ()

ВЫРАЗИТЬ(ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток/ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток, ЧИСЛО(15,9))
6 geek
 
30.01.12
10:47
(4) Да не говори:(
7 PR
 
30.01.12
10:50
(5) ВЫРАЗИТЬ для числа округляет, а не добивает нулями. Число — оно и есть число, его нельзя добить нулями, иначе получится строка.
8 geek
 
30.01.12
10:52
(7) В смысле, я правильно написал? =)
9 PR
 
30.01.12
10:53
(8) Если тебя нужно округлить до восьмого знака, то да.
Остальное делается условным оформлением.
10 Ненавижу 1С
 
гуру
30.01.12
10:53
ВЫРАЗИТЬ(ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток/ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток КАК ЧИСЛО(15,9))

но если значащих цифр нет, то это ничего не даст, форматируйте уже в СКД
11 geek
 
30.01.12
10:57
Там не запятая, а "КАК".
ВЫРАЗИТЬ(ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток/ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток КАК ЧИСЛО(15,9))

(9) Нет, у меня в декабре коэффициент рассчитывается с 6-ю знаками после запятой.
0,004818 - к примеру. Мне надо чтобы хотя бы не 6, а девять знаков. Очевидно, что
2 350 500 / 487 760 411,94 = 0,0048189642755208, а запрос мне выдает 0,004818
12 Serg_1960
 
30.01.12
10:58
(старая шутка) ЧЯДН?

   Сообщить(13.1/13); // в окне сообщений число 1,007692307692307692307692307692307692
   Запрос = Новый Запрос("ВЫБРАТЬ 13.1 / 13 КАК Результат");
   Выборка = Запрос.Выполнить().Выбрать();
   Выборка.Следующий();
   Сообщить(Выборка.Результат); // в окне сообщений число 1,007692307692307692307692307692307692
   Возврат;
13 geek
 
30.01.12
10:58
(10) В СКД есть механизм, где можно было бы рассчитать (поделить) два получившихся поля (результат запрос) и вывести форматированный результат в третье?
14 geek
 
30.01.12
11:01
(12) Простите, мне, вероятно, не понять юмор.
15 Ненавижу 1С
 
гуру
30.01.12
11:03
(13) формат есть у полей СКД
16 hhhh
 
30.01.12
11:05
(14) а зачем вам 9 знаков? Вы что ФобосГРунт запускаете? ВЫ знаете, что если налоговая у вас найдет в расчетах такой коэффициент, будете штраф платить?
17 geek
 
30.01.12
11:10
(15) Я же писал в первом посте, что менял Оформление в Наборе данных. Не помогает. Добивает число нулями. К примеру:
0,004818 = 0,004818000
18 Ненавижу 1С
 
гуру
30.01.12
11:16
(17) а в консоли сколько выдает?
19 geek
 
30.01.12
11:24
(18) Консоли запросов?
Выдает 0,004818. Хотя калькулятор показывает цифру 0,0048189642755208

Странно, но консоль за предыдущие месяцы выдает цифры с детализацией 6 чисел после запятой, а в отчет попадают цифры детальные. 1С, бл*дь надо мной издевается :( Или это первые признаки сумасшествия.
20 geek
 
30.01.12
11:33
Зайдем с другой стороны. Есть код в модуле ФормыОтчета СКД.

Процедура ДействияФормыДействие(Кнопка) ЭКСПОРТ
   
   ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   ПараметрРасчетнаяДатаКонецГраницы = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
   ПараметрРасчетнаяДатаКонецГраницы.Значение = Новый Граница(КонецДня(ЭлементыФормы.РасчетнаяДата.Значение), ВидГраницы.Включая);
   ПараметрРасчетнаяДатаКонецГраницы.Использование = Истина;
   ПараметрРасчетнаяДатаКонецГраницы = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
   ПараметрРасчетнаяДатаКонецГраницы.Значение = Новый Граница(НачалоМесяца(ЭлементыФормы.РасчетнаяДатаНачало.Значение), ВидГраницы.Включая);
   ПараметрРасчетнаяДатаКонецГраницы.Использование = Истина;
   ПараметрРасчетнаяДатаКонецГраницы = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
   ПараметрРасчетнаяДатаКонецГраницы.Значение = Новый Граница(КонецДня(ЭлементыФормы.РасчетнаяДата.Значение), ВидГраницы.Включая);
   ПараметрРасчетнаяДатаКонецГраницы.Использование = Истина;

   
   Настройки = КомпоновщикНастроек.Настройки;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки, );
   
   ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки,Истина);
   
   
   ЭлементыФормы.Результат.Очистить();
   ДокументРезультат = ЭлементыФормы.Результат;
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
   Сообщить(ТипЗнч(МакетКомпоновки));
   ДокументРезультат.Показать();
   ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
   
КонецПроцедуры



Можно ли обратиться каким-то образом к процессору компоновки данных или еще чему-то и откорректировать данные перед методом Вывести()?
21 Serg_1960
 
30.01.12
11:44
(14) Сорри. Вам, наверное, не до моих шуток сейчас :) "Округлением" в запросах можно и нужно "управлять". Третий запрос - пример для Вас:

   Запрос = Новый Запрос("ВЫБРАТЬ 13.1 / 13 КАК Результат"); // максимальная точность (как она есть на самом деле)
   Выборка = Запрос.Выполнить().Выбрать();
   Выборка.Следующий();
   Сообщить(Выборка.Результат); // в окне сообщений число 1,007692307692307692307692307692307692
   
   Запрос = Новый Запрос("ВЫБРАТЬ ВЫРАЗИТЬ(13.1 КАК ЧИСЛО(15,1)) / ВЫРАЗИТЬ(13 КАК ЧИСЛО(15,0)) КАК Результат"); // округление результата "по умолчанию"
   Выборка = Запрос.Выполнить().Выбрать();
   Выборка.Следующий();
   Сообщить(Выборка.Результат); // в окне сообщений число 1,00769231 (восемь знаков после запятой)
   
   Запрос = Новый Запрос("ВЫБРАТЬ ВЫРАЗИТЬ(13.1 КАК ЧИСЛО(15,9)) / ВЫРАЗИТЬ(13 КАК ЧИСЛО(15,9)) КАК Результат"); // Округляем так, как нам надо!
   Выборка = Запрос.Выполнить().Выбрать();
   Выборка.Следующий();
   Сообщить(Выборка.Результат); // в окне сообщений число 1,007692308 (девять знаков после запятой!)
22 geek
 
30.01.12
11:58
{Форма.Форма.Форма(759)}: Ошибка при вызове метода контекста (Выполнить): Ошибка выполнения запроса: Ошибка при выполнении операции над данными:
Microsoft OLE DB Provider for SQL Server: Arithmetic overflow error converting numeric to data type numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1

О_____О
23 PR
 
30.01.12
12:55
(21) Напиши в своем примере 13/13
24 Fragster
 
гуру
30.01.12
12:57
Выразить(0 как число 15,9)
25 Ненавижу 1С
 
гуру
30.01.12
12:58
SQL Server какой?
27 geek
 
30.01.12
13:34
(24) Выводит пустую колонку
(25) 2008 R2

Ссылка по теме: http://bit.ly/yFJRyB
28 geek
 
30.01.12
14:22
Проблему решил, всем огромное спасибо.

ВЫБОР
       КОГДА ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток <> 0
           ТОГДА  ВЫРАЗИТЬ (ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток КАК ЧИСЛО(23,6)) / ВЫРАЗИТЬ (ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток КАК ЧИСЛО(23,6))
       ИНАЧЕ 0
   КОНЕЦ КАК Коэффициент




Вот. Если оформить так, тогда на выходе мы число с, кажется, 15-ю знаками после запятой. Через формат в СКД я обрезал его до 10-ти знаков.