Требуется помощь - внешняя функция в Запросе

1. Dolly_EV 269 10.03.09 13:58 Сейчас в теме
Есть такая конструкция

Перем Запрос;
.................
.................

Функция ДляВозврата(лПоказатель)
	Если лПоказатель = "Кол" Тогда
		Возврат (Запрос.КолР - Запрос.КолП);
	ИначеЕсли лПоказатель = "СуммаСС" Тогда
		Возврат (Запрос.СуммаССР - Запрос.СуммаССП);
	КонецЕсли;
КонецФункции // ДляВозврата
..................
..................

Если БезВозвратов = 0 Тогда
	ТекстЗапроса =ТекстЗапроса+	"
	|Функция Кол	 = Расход(лКол);
	|Функция СуммаСС = Расход(лСуммаСС);
	|"//}}ЗАПРОС
	;
Иначе
	//**** "БЕЗ ВОЗВРАТОВ" ****
	ТекстЗапроса =ТекстЗапроса+	"
	|Функция КолР	 = Расход(лКол);
	|Функция КолП	 = Приход(лКол);
	|Функция Кол	 = Сумма(ДляВозврата(""Кол""));
	|Функция СуммаССР = Расход(лСуммаСС);
	|Функция СуммаССП = Приход(лСуммаСС);
	|Функция СуммаСС = Сумма(ДляВозврата(""СуммаСС""));
	|"//}}ЗАПРОС
	;
КонецЕсли;
Показать


и эта конструкция в случае БезВозвратов = 1 возвращает в "Кол" и "СуммаСС" ОКРУГЛЕННОЕ до целых число - фича вобщем известная: если во внешнюю функцию передать в качестве параметров не просто числовые переменные запроса, а их значения, предварительно обработанные другими функциями запроса, то результат, возвращаемый внешней функцией всегда будет целым числом (точность 0).

Может кто знает КАК ПОБЕДИТЬ ФИЧУ!?!?! очень надо в Запросе в одну функцию собрать и Расход и Приход.

Или предложите красивый способ это обойти (брать разность из разных функций далее при обходе группировок запроса - НЕ ПРЕДЛАГАТЬ!)
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. WiseSnake 1519 10.03.09 14:26 Сейчас в теме
Первый раз слышу о такой "фиче"...

Я бы сделал так:
Перем Запрос;
.................
.................

Функция ДляВозврата(Сумма1, Сумма2)
   Возврат Сумма1 - Сумма2;
КонецФункции // ДляВозврата
..................
..................

Если БезВозвратов = 0 Тогда
   ТекстЗапроса =ТекстЗапроса+   "
   |Функция Кол    = Расход(лКол);
   |Функция СуммаСС = Расход(лСуммаСС);
   |"//}}ЗАПРОС
   ;
Иначе
   //**** "БЕЗ ВОЗВРАТОВ" ****
   ТекстЗапроса =ТекстЗапроса+   "
   |Функция КолР    = Расход(лКол);
   |Функция КолП    = Приход(лКол);
   |Функция Кол    = Сумма(ДляВозврата(Запрос.КолР, Запрос.КолП));
   |Функция СуммаССР = Расход(лСуммаСС);
   |Функция СуммаССП = Приход(лСуммаСС);
   |Функция СуммаСС = Сумма(ДляВозврата(Запрос.СуммаССР, Запрос.СуммаССП));
   |"//}}ЗАПРОС
   ;
КонецЕсли; 
Показать
3. Dolly_EV 269 10.03.09 14:31 Сейчас в теме
(2)
Сумма(ДляВозврата(Запрос.КолР, Запрос.КолП));


или как у меня - это сути не меняет, проверь, кстати и убедись, что "фича" существует))

А у меня так сделано, т.к. в "ДляВозврата" не только разность двух переменных считается, я сюда написал покороче, для простоты восприятия
4. Dolly_EV 269 10.03.09 15:08 Сейчас в теме
Уточнение: это фича, видимо не внешней функции запроса, а функции "Сумма", т.к.
вариант "Функция Кол = Сумма(Запрос.КолР-Запрос.КолП);" также скотина округляет до целого (((
5. vcv 89 11.03.09 08:33 Сейчас в теме
Передай функции фиктивный параметр нужной точности
Функция СуммаСС = Сумма(ДляВозврата(""СуммаСС"",СуммаСС));

1С найдет с параметрах функции значение с двумя знаками после запятой и будет считать, что и результат функции имеет такую-же точность.
7. Ёпрст 1063 11.03.09 09:12 Сейчас в теме
9. Dolly_EV 269 11.03.09 09:18 Сейчас в теме
(7) не (5) брехня, а (6). Это (делить/умножать на 1000) я попробовал в первую очередь, когда столкнулся с подобной темой в прошлый раз.

Согласен с

Ёпрст пишет:
А фичи никакой тут нет. Функция берёт точность из переменной текста запроса переданной в качестве аргумента. У вас в качестве аргумента некоторое выражение (в данном случае, обращение к итогам запроса) - соответственно неоткуда взять точность, точность = 0.


а фича, да, как раз в том, чтобы отправить туда фиктивный параметр нужной точности
8. Dolly_EV 269 11.03.09 09:17 Сейчас в теме
(5) Урраааааа!!!! Заработалаааа!!!! Спасибо, добрый человек!!! Ай Лав ИС!!!

Век живи, век учись.

только еще замечание - параметром этим должны быть переменная запроса, внешняя переменная
(типа ТочностьСуммы = 1234567890123.123;) не канает.

Вот так канает:
|Функция СуммаССР = Расход(лСуммаСС);
|Функция СуммаССП = Приход(лСуммаСС);
|Функция СуммаСС = Сумма(ДляВозврата(Запрос.СуммаССР,Запрос.СуммаССП,лСуммаСС));
6. Ёпрст 1063 11.03.09 09:11 Сейчас в теме
(0) Помножай на 100 в тексте запроса, в результатах дели на 100, будет точность до 2-х знаков... или на бооольшее число, если нужна бооольшая точность.

А фичи никакой тут нет. Функция берёт точность из переменной текста запроса переданной в качестве аргумента. У вас в качестве аргумента некоторое выражение (в данном случае, обращение к итогам запроса) - соответственно неоткуда взять точность, точность = 0.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот