Имя: Пароль:
1C
 
Как использовать внешниюю функцию в запросе?
0 los_hooliganos
 
12.11.09
17:06
Есть Функция Расход = Расход(Количество)
Нужно что-то вроде
Функция Расход = Когда (условие) тогда Расход(Количество) когда (условие) тогда внешняяфункция()
Реализуемо?
1 Cap_1977
 
12.11.09
17:09
Реализуемо в блоке Условие(ВнешняяФункция() = 1)
2 Ёпрст
 
гуру
12.11.09
17:09
(0)в принципе да, но не для всех функций..
3 Дядя Васька
 
12.11.09
17:09
если в нее надо передать параметр из того что запрос вытягивает, то нет, а если всегда одно и то же вертает, ну дык "+ТвояФункция()+"
5 also
 
12.11.09
17:12
(0) Мож лучше прямой?
6 los_hooliganos
 
12.11.09
17:12
(2) можно пример?)
вообщем при определенном условии мне надо не просто расход, а хитро посчитанный прямым запросом.
переписывать все на прямой лень))
7 los_hooliganos
 
12.11.09
17:13
(5) возможно и на прямой перепишу, но это дофига времени, а скорость пока не критична.
8 also
 
12.11.09
17:14
"вообщем при определенном условии"
(6) А условие озвучь
9 Дядя Васька
 
12.11.09
17:14
(7) Вопрос привычки. Вообще-то они быстрее одинэсовских пишутся, бо гораздо логичнее...
10 Ёпрст
 
гуру
12.11.09
17:15
(6)
|Функция Расход = Расход(Количество);
|Функция _Расход = Сумма(?(А=Б,Запрос.Расход,0));
11 Ёпрст
 
гуру
12.11.09
17:16
+10

|Функция Расход = Расход(Количество);
|Функция _Расход = Сумма(?(А=Б,Запрос.Расход,ВнешняяФункция()));
12 also
 
12.11.09
17:17
(+8) Я в том плане, что может можно тупо сделать:
Если Условие Тогда
Текст = Текст + |Функция Чето = Расход (КтоТо);
Иначе
Текст = Текст + |Условие (ВнешняяФункция() = ПочемуТО);
13 los_hooliganos
 
12.11.09
17:18
(8) а смысл?
когда одна из внутренних переменных запроса = 0 тогда просто расход, иначе хитрый запрос к левой базе.
14 los_hooliganos
 
12.11.09
17:21
(9) дело не в привычке, я просто перерабатываю отчет и там 2000 строк кода которые обрабатывают результаты запроса и лезьт туда мне совершенно не хочеться.
15 los_hooliganos
 
12.11.09
17:22
(12) не.. не канает
16 Ёпрст
 
гуру
12.11.09
17:22
(15) что именно?
17 los_hooliganos
 
12.11.09
17:22
(10) спс, попробую.
18 los_hooliganos
 
12.11.09
17:25
(16) а так можно:
|Функция Расход = Сумма(?(А=Б,Расход(Количество),мояфункция()));
19 Ёпрст
 
гуру
12.11.09
17:27
(18) неа..
Сумма тогда будет складывать столько раз - сколько считали другие функции в тексте запроса
20 Ёпрст
 
гуру
12.11.09
17:28
+19 блин.. не о том подумал - так не будет работать вообще :)
21 los_hooliganos
 
12.11.09
17:29
(20) а это как тогда должно работать:
|Функция _Расход = Сумма(?(А=Б,Запрос.Расход,0));
??
22 los_hooliganos
 
12.11.09
17:30
чую придеться ипошить прямой с ROLL UP`ом
ибо потом идет куча
Пока Запрос.Группировка(х)
23 Ёпрст
 
гуру
12.11.09
17:30
(21) а вот это будет работать норм.
24 Ёпрст
 
гуру
12.11.09
17:31
Ты проверь на малых данных, фильтрани по-условию и проверь.
25 los_hooliganos
 
12.11.09
17:31
(23) В самом запросе?
26 Ёпрст
 
гуру
12.11.09
17:32
(25) Да.. при условии, что Запрос = СоздатьОбъект("Запрос")..
27 los_hooliganos
 
12.11.09
17:33
(26)Даже и не знал про такое.
Спс... попробую.
28 Ёпрст
 
гуру
12.11.09
17:33
Ну вот еще пример - эммулирование функции НачОст и КонОст в тексте запроса:
Работает медленнно, но верно :)


Функция Ё(Док,Запрос)
  Если Док.ДатаДок<НачДата Тогда
     Возврат Запрос.Пр - Запрос.Рр;
  Иначе
     Возврат 0;
  КонецЕсли;
КонецФункции  
//*******************************************
Процедура Сформировать()
  ТекстЗапроса = "
  |Период с '01.01.80' По КонДата;
  |Док = Регистр.Покупатели.ТекущийДокумент,Регистр.Поставщики.ТекущийДокумент;
  |Сумма = Регистр.Покупатели.СуммаРуб,Регистр.Поставщики.СуммаРуб;
  |Контрагент = Регистр.Покупатели.Договор.Владелец,Регистр.Поставщики.Договор.Владелец;
   |Функция Пр = Приход(Сумма);
   |Функция Рр = Расход(Сумма);
  |Функция Приход = Приход(Сумма)Когда(Док.ДатаДок>=НачДата);
  |Функция Расход = Расход(Сумма)Когда(Док.ДатаДок>=НачДата);
  |Функция НачОст = Сумма(Сумма-Сумма+Ё(Док,Запрос));
  |Функция КонОст = Сумма(Сумма-Сумма+Запрос.Пр-Запрос.Рр);
  |Группировка Контрагент Без Групп;
  |Условие (Контрагент в ВыбКонтрагент);";
  Запрос = СоздатьОбъект("Запрос");
  Запрос.Выполнить(ТекстЗапроса);
  Запрос.Выгрузить(ТЗ,0,0);
КонецПроцедуры
29 los_hooliganos
 
12.11.09
17:34
(28) за пример тоже спасибо)
30 Ёпрст
 
гуру
12.11.09
17:35
+28 Да , еще:

Не удивляйся потом,что функция сумма якобы "округляет" копейки - на самом деле это не так..
31 Ёпрст
 
гуру
12.11.09
17:38
+31 Просто функция сумма берет точность из переменной запроса - а при использовании Сумма(МояФункция()) - нет переменной=> неоткуда брать точность => точность результата =0 ("округляет")

Но это тоже "лечится" - введением "ложной" переменной в аргумент функции:
>>>Функция НачОст = Сумма(Сумма-Сумма+Ё(Док,Запрос));
// тут ввели Сумма-Сумма - т.е нуль, зато из переменной Сумма = Регистр.Покупатели.СуммаРуб...

- точность соответственно будет такой же, как и у переменной Сумма в тексте запроса.
32 los_hooliganos
 
12.11.09
17:41
(31) ясно, ну завтра уже пробовать буду.
надеюсь все получиться и огромное спасибо))