Проблема с заросом

1. whtblck 96 15.12.11 18:23 Сейчас в теме
Всем привет.
Есть приходные накладные (ПН). Нужно выбрать ТМЦ, количество, розничную и закупочную цены.
Все есть в ПН, кроме розничной цены.
Пишем запрос:
	
	ВидДокументов = ?(чекВидДок = 1, "Т_ПриходнаяНакладная", "Т_РасходнаяНакладная");
	
	Запрос = СоздатьОбъект("Запрос");
	ТекстЗапроса = 
	"//{{ЗАПРОС(Сформировать)
	|Период с ВыбНачПериода по ВыбКонПериода;
	|ТекДок 	= Документ."+ВидДокументов+".ТекущийДокумент;
	|ДатаДок 	= Документ."+ВидДокументов+".ТекущийДокумент.ДатаДок;
	|Товар 		= Документ."+ВидДокументов+".Товар;
	|...
	|Функция РознЦенаВПН 	= Сумма(глВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок));
	|...
	|"//}}ЗАПРОС
	;
Показать

где глВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок) - функция, возвращающая розничную цену товара.
Дык вот в запросе возвращает она непонятное значение.
Сама глВернутьЦену(...) работает правильно, вне запроса цену возвращает верно.
Что не так?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. starjevschik 15.12.11 21:19 Сейчас в теме
(1) неудачная идея - использовать в запросе внешние функции. Использование запроса теряет всякий смысл. Лучше запросом выбрать все, что можно выбрать запросом, а потом пройтись по результату и заполнить недостающие поля. Будет намного быстрее и вообще правильнее со всех точек зрения.
15. starjevschik 16.12.11 13:44 Сейчас в теме
whtblck пишет:
(5) не понимаю, почему не удачная, и где теряется смысл запроса. имхо, так наоборот правильнее и быстрее. если запрос вернет стопицот строк, перебрать их потом - еще полбеды (хотя все равно, потерянное время заметно). а если их несколько тысяч? время на запрос, на перебор, на вывод в печатную форму...

когда ты в запросе вызываешь внешнюю функцию, то запрос не возвращает сразу весь массив данных - он по каждой своей строке вызывает эту функцию. Если у тебя файловая система, то разница может и не очень большая, а на сиквеле это означает, что вместо формирования всего массива разом на сервере ты будешь каждую строку пересылать на клиент и там считать свою функцию. Особенно это существенно как раз если запрос возвращает много строк.
16. whtblck 96 16.12.11 14:03 Сейчас в теме
(15) сказать по-чести, я не совсем понимаю, как работает запрос в 1с-ке. могу привести факт:
база у меня (точнее - у клиента) скульная, объем - 25гиг. запрос возвращает больше тысячи строк. отрабатывает быстрее, чем если потом перебором в ТЗ запихивать цену.
как и почему - понятия не имею, но факт налицо
17. vcv 89 16.12.11 15:44 Сейчас в теме
(16) Объяснение факта довольно простое. 1С обрабатывает данные с SQL-сервера тупо. Сваливает их во временный файл формата DBF, к которому уже считает функции и делает группировки. А скорость перебора строк DBF с выполнением функции делается быстрее вшитым в ядро методом, чем на встроенном языке 1С.
18. whtblck 96 16.12.11 17:02 Сейчас в теме
(17) эм-м... я и до этого-то довольно приблизительно понимал, теперь еще меньше.
ты мне, мил человек, проще скажи: правильнее выбрать все запросом, или потом перебором что-то дозаполнять?
19. pvase 403 16.12.11 17:09 Сейчас в теме
(18) Зависит от Количества обрабатываемой информации и получаемой информации. Если результатом запросу будет от 20 до 100% всех записей - тогда запрос не сильно нужен, если же запрос отсеивает большую часть данных (выбирается от 0.000 до 1-5%) тогда лучше в полученном результате добавить недостающее.
20. whtblck 96 16.12.11 17:17 Сейчас в теме
(19) примерно понял.
сейчас могу сказать: запрос работает, работает правильно и быстро, с итогами по группировкам. меня устраивает.
так что еще раз всем спасибо.
2. MagTux 15.12.11 18:51 Сейчас в теме
Нельзя под суммой использовать функции. Допустима только арифметика. Читай ЖКК.
Выгружай запрос в ТЗ, а потом в цикле считай цену.
3. whtblck 96 15.12.11 18:58 Сейчас в теме
(2)Не знаю, что такое ЖКК, но пользоваться можно
4. Alav 13 15.12.11 19:03 Сейчас в теме
(3) ЖКК - желто красная книжка. Книжка которая идет с 1С "описание встроенного языка". названа так из-за своего цвета

http://webshop.ggb.lv/img/p/191-50-large.jpg
10. whtblck 96 16.12.11 02:03 Сейчас в теме
извините, слегка отсутствовал, всем спасибо, постараюсь всем ответить\прокомментировать

(4)ЖКК есть. хрень полнейшая, отличается от синтаксис-помощника только тем, что выполнена на бумаге. и, как верно подметил в (7) - там много, очень много всего не дописано.

(5) не понимаю, почему не удачная, и где теряется смысл запроса. имхо, так наоборот правильнее и быстрее. если запрос вернет стопицот строк, перебрать их потом - еще полбеды (хотя все равно, потерянное время заметно). а если их несколько тысяч? время на запрос, на перебор, на вывод в печатную форму...

(6) интересная мысль, но нет. тогда бы запрос верну цену ТМЦ*к-во строк документа(ов), но возвращаемая цена этому произведению не равна. еще интересный факт - она, почему-то, целая. все цены - с тремя знаками после запятой

(7) скан не нужно, книженция имеется. и я бы тебе, MagTux, поверил, если бы сам несколько раз не пользовался подобными функциями.

(8) см ответ на (5)

(9) во-от, спасибо за то, что вернул нас всех к сабжу. есть еще варианты?
12. vcv 89 16.12.11 08:17 Сейчас в теме
(10) То, что целая, это недокументированная (кажется недокументированная) фича 1С. Тип результата вызываемых из запроса функций зависит от параметров функций. Передавай в функцию фиктивный параметр число с нужной точностью.
Например так:

Функция ВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок, Количество)
  Возврат глВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок);
КонецФунции
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)
|...
|Количество       = Документ."+ВидДокументов+".Количество;
|...
|Функция РознЦенаВПН    = Сумма(ВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок, Количество));
|...";
Показать


и получишь нецелочисленное значение РознЦенаВПН.

Не нужно в запросе выбирать цены таким образом.
Если нужно группировка по ценам, объяви переменную в запросе
Цена = Документ."+ВидДокументов+".Цена;
и группируй по ней.
А если в отчете нужно показывать свёрнуто по группировках со средней ценой,
тогда в запросе
СуммаДок = Документ."+ВидДокументов+".СуммаДок;
СУммаСуммаДок = Функция Сумма(СуммаДок);
а цену будешь считать при выводе отчета, деля сумму на количество.
13. whtblck 96 16.12.11 09:47 Сейчас в теме
14. whtblck 96 16.12.11 10:37 Сейчас в теме
(12) vcv, спасибо, все отработало на "отлично". +1 однозначно :)
7. MagTux 15.12.11 21:34 Сейчас в теме
(3) Честно говоря, сам не использовал функции в функциях запросов, но могу предоставить скан из ЖКК, где русским по белому написано, что
В функциях: Сумма, Среднее, Максимум, Минимум в качестве данного параметра возможно использование арифметического выражения в терминах встроенного языка 1С:Предприятие.

стр. 812 "Описание встроенного языка. Часть 2"
Хотя в документации много чего недописано.
6. vcv 89 15.12.11 21:23 Сейчас в теме
Думаю, дело в том, что в запросе есть обращение к табличной части и функция считается для каждой строки документа, попавшего в запрос. И запрос возвращает не цену, а цену, умноженную на количество строк в которых встречается конкретная номенклатура.
8. MagTux 15.12.11 21:36 Сейчас в теме
Я бы всё таки оставил запрос "чистым", выгрузил результат в ТЗ, а потом посчитал бы цену для каждой строки ТЗ. так, ИМХО, правильнее.
9. slavok123 2 16.12.11 00:20 Сейчас в теме
подскажите челу а не посылайте его к книге)
11. YNik 16.12.11 03:22 Сейчас в теме
Какой смысл суммировать цену, может просуммировать сумму по розничной цене, а при выборке разделить эту сумму на количество:
|Функция РознСуммаВПН = Сумма(Количество*глВернутьЦену(Товар, РознКатЦен, ВыбСклад, ДатаДок));
yura-100; +1 Ответить
Оставьте свое сообщение

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