Всем привет.
Есть приходные накладные (ПН). Нужно выбрать ТМЦ, количество, розничную и закупочную цены.
Все есть в ПН, кроме розничной цены.
Пишем запрос:
где глВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок) - функция, возвращающая розничную цену товара.
Дык вот в запросе возвращает она непонятное значение.
Сама глВернутьЦену(...) работает правильно, вне запроса цену возвращает верно.
Что не так?
(1) неудачная идея - использовать в запросе внешние функции. Использование запроса теряет всякий смысл. Лучше запросом выбрать все, что можно выбрать запросом, а потом пройтись по результату и заполнить недостающие поля. Будет намного быстрее и вообще правильнее со всех точек зрения.
whtblck пишет:
(5) не понимаю, почему не удачная, и где теряется смысл запроса. имхо, так наоборот правильнее и быстрее. если запрос вернет стопицот строк, перебрать их потом - еще полбеды (хотя все равно, потерянное время заметно). а если их несколько тысяч? время на запрос, на перебор, на вывод в печатную форму...
когда ты в запросе вызываешь внешнюю функцию, то запрос не возвращает сразу весь массив данных - он по каждой своей строке вызывает эту функцию. Если у тебя файловая система, то разница может и не очень большая, а на сиквеле это означает, что вместо формирования всего массива разом на сервере ты будешь каждую строку пересылать на клиент и там считать свою функцию. Особенно это существенно как раз если запрос возвращает много строк.
(15) сказать по-чести, я не совсем понимаю, как работает запрос в 1с-ке. могу привести факт:
база у меня (точнее - у клиента) скульная, объем - 25гиг. запрос возвращает больше тысячи строк. отрабатывает быстрее, чем если потом перебором в ТЗ запихивать цену.
как и почему - понятия не имею, но факт налицо
(16) Объяснение факта довольно простое. 1С обрабатывает данные с SQL-сервера тупо. Сваливает их во временный файл формата DBF, к которому уже считает функции и делает группировки. А скорость перебора строк DBF с выполнением функции делается быстрее вшитым в ядро методом, чем на встроенном языке 1С.
(17) эм-м... я и до этого-то довольно приблизительно понимал, теперь еще меньше.
ты мне, мил человек, проще скажи: правильнее выбрать все запросом, или потом перебором что-то дозаполнять?
(18) Зависит от Количества обрабатываемой информации и получаемой информации. Если результатом запросу будет от 20 до 100% всех записей - тогда запрос не сильно нужен, если же запрос отсеивает большую часть данных (выбирается от 0.000 до 1-5%) тогда лучше в полученном результате добавить недостающее.
(19) примерно понял.
сейчас могу сказать: запрос работает, работает правильно и быстро, с итогами по группировкам. меня устраивает.
так что еще раз всем спасибо.
извините, слегка отсутствовал, всем спасибо, постараюсь всем ответить\прокомментировать
(4)ЖКК есть. хрень полнейшая, отличается от синтаксис-помощника только тем, что выполнена на бумаге. и, как верно подметил в (7) - там много, очень много всего не дописано.
(5) не понимаю, почему не удачная, и где теряется смысл запроса. имхо, так наоборот правильнее и быстрее. если запрос вернет стопицот строк, перебрать их потом - еще полбеды (хотя все равно, потерянное время заметно). а если их несколько тысяч? время на запрос, на перебор, на вывод в печатную форму...
(6) интересная мысль, но нет. тогда бы запрос верну цену ТМЦ*к-во строк документа(ов), но возвращаемая цена этому произведению не равна. еще интересный факт - она, почему-то, целая. все цены - с тремя знаками после запятой
(7) скан не нужно, книженция имеется. и я бы тебе, MagTux, поверил, если бы сам несколько раз не пользовался подобными функциями.
(10) То, что целая, это недокументированная (кажется недокументированная) фича 1С. Тип результата вызываемых из запроса функций зависит от параметров функций. Передавай в функцию фиктивный параметр число с нужной точностью.
Например так:
Не нужно в запросе выбирать цены таким образом.
Если нужно группировка по ценам, объяви переменную в запросе
Цена = Документ."+ВидДокументов+".Цена;
и группируй по ней.
А если в отчете нужно показывать свёрнуто по группировках со средней ценой,
тогда в запросе
СуммаДок = Документ."+ВидДокументов+".СуммаДок;
СУммаСуммаДок = Функция Сумма(СуммаДок);
а цену будешь считать при выводе отчета, деля сумму на количество.
(3) Честно говоря, сам не использовал функции в функциях запросов, но могу предоставить скан из ЖКК, где русским по белому написано, что
В функциях: Сумма, Среднее, Максимум, Минимум в качестве данного параметра возможно использование арифметического выражения в терминах встроенного языка 1С:Предприятие.
стр. 812 "Описание встроенного языка. Часть 2"
Хотя в документации много чего недописано.
Думаю, дело в том, что в запросе есть обращение к табличной части и функция считается для каждой строки документа, попавшего в запрос. И запрос возвращает не цену, а цену, умноженную на количество строк в которых встречается конкретная номенклатура.
Какой смысл суммировать цену, может просуммировать сумму по розничной цене, а при выборке разделить эту сумму на количество:
|Функция РознСуммаВПН = Сумма(Количество*глВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок));