Имя: Пароль:
1C
1C 7.7
v7: Не получается сделать умножение в запросе 7.7
0 Prog111
 
31.03.16
08:01
В ТиС 9.2 есть типовой отчет "ОтчетПоПродажамТМЦ". Информация по продажам берется из регистров накопления.

Хочу сделать следующее - у каждого родителя номенклатуры есть реквизит "процент". Этот процент я хочу умножить на величину продаж и получить эти цифры в группировках. Привожу весь запрос:

ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ДатаНачала по ДатаКонца;
    |Фирма            = Регистр.ПартииНаличие.Фирма,
    |                  Регистр.ПартииОтданные.Фирма;
    |УпрАналитика    = Регистр.ПартииНаличие.Фирма.УпрАналитика,
    |                  Регистр.ПартииОтданные.Фирма.УпрАналитика;
    |ЮрЛицо         = Регистр.ПартииНаличие.Фирма.ЮрЛицо,
    |                  Регистр.ПартииОтданные.Фирма.ЮрЛицо;
    |СтатусПартии     = Регистр.ПартииНаличие.СтатусПартии,
    |                  Регистр.ПартииОтданные.СтатусПартии;
    |Номенклатура    = Регистр.ПартииНаличие.Номенклатура,
    |                  Регистр.ПартииОтданные.Номенклатура;
    |ТипНоменклатуры= Регистр.ПартииНаличие.Номенклатура.Родитель.ТипНоменклатуры,
    |                  Регистр.ПартииОтданные.Номенклатура.Родитель.ТипНоменклатуры;
    |ПроцентТипаНоменклатуры = Регистр.ПартииНаличие.Номенклатура.Родитель.ТипНоменклатуры.Процент,
    |                  Регистр.ПартииОтданные.Номенклатура.Родитель.ТипНоменклатуры.Процент;  
    |СвойствоТМЦ    = Регистр.ПартииНаличие.Номенклатура.ОсновноеСвойство.ЗначениеСвойства,
    |                  Регистр.ПартииОтданные.Номенклатура.ОсновноеСвойство.ЗначениеСвойства;
    |МОЛ_Комиссионер= Регистр.ПартииНаличие.МОЛ,
    |                  Регистр.ПартииОтданные.Договор.Владелец;
    |СвойствоПокупателя = Регистр.ПартииНаличие.ТекущийДокумент.Реализация.Контрагент.ОсновноеСвойство.ЗначениеСвойства,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.РеализацияРозница.Контрагент.ОсновноеСвойство.ЗначениеСвойства,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.ОтчетККМ.Контрагент.ОсновноеСвойство.ЗначениеСвойства,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.РеализацияПрочее.Контрагент.ОсновноеСвойство.ЗначениеСвойства,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.ВозвратОтПокупателя.Контрагент.ОсновноеСвойство.ЗначениеСвойства,
    |                  Регистр.ПартииОтданные.ТекущийДокумент.ОтчетКомиссионера.Контрагент.ОсновноеСвойство.ЗначениеСвойства;
    |Покупатель        = Регистр.ПартииНаличие.ТекущийДокумент.Реализация.Контрагент,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.РеализацияРозница.Контрагент,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.ОтчетККМ.Контрагент,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.РеализацияПрочее.Контрагент,
    |                  Регистр.ПартииНаличие.ТекущийДокумент.ВозвратОтПокупателя.Контрагент,
    |                  Регистр.ПартииОтданные.ТекущийДокумент.ОтчетКомиссионера.Контрагент;
    |Проект            = Регистр.ПартииНаличие.ТекущийДокумент.Проект,
    |                  Регистр.ПартииОтданные.ТекущийДокумент.Проект;
    |Автор            = Регистр.ПартииНаличие.ТекущийДокумент.Автор,
    |                  Регистр.ПартииОтданные.ТекущийДокумент.Автор;
    |Поставка        = Регистр.ПартииНаличие.Партия,
    |                  Регистр.ПартииОтданные.Партия;
    |СвойствоПартии    = Регистр.ПартииНаличие.Партия.Свойство,
    |                  Регистр.ПартииОтданные.Партия.Свойство;
    |Поставщик        = Регистр.ПартииНаличие.Партия.Поставщик,
    |                  Регистр.ПартииОтданные.Партия.Поставщик;
    |ДокПоставки    = Регистр.ПартииНаличие.Партия.ПриходныйДокумент,
    |                  Регистр.ПартииОтданные.Партия.ПриходныйДокумент;
    |КодОперации    = Регистр.ПартииНаличие.КодОперации,
    |                  Регистр.ПартииОтданные.КодОперации;
    |НомерСтроки    = Регистр.ПартииНаличие.НомерСтроки,
    |                  Регистр.ПартииОтданные.НомерСтроки;
    |Договор        = Регистр.ПартииОтданные.Договор;
    |ВалВзаим        = Регистр.ПартииОтданные.Договор.ВалютаВзаиморасчетов;
    |Док            = Регистр.ПартииНаличие.ТекущийДокумент,
    |                  Регистр.ПартииОтданные.ТекущийДокумент;
    |Сумма1            = Регистр.ПартииНаличие.СуммаРуб,
    |                  Регистр.ПартииОтданные.СуммаРуб;
    |Сумма2            = Регистр.ПартииНаличие.СуммаБезНДС,
    |                  Регистр.ПартииОтданные.СуммаБезНДС;
    |Сумма3            = Регистр.ПартииНаличие.СуммаУпр,      
    |                  Регистр.ПартииОтданные.СуммаУпр;      
    |Оборот            = Регистр.ПартииНаличие.ПродСтоимость;
    |ОборотКом        = Регистр.ПартииОтданные.ПродСтоимость;";
    
    ТекстЗапроса = ТекстЗапроса + "Количество = Регистр.ПартииНаличие.Количество, Регистр.ПартииОтданные.Количество;";
    
    Если ВидСуммы = 1 Тогда // бух с НДС
        ТекстЗапроса = ТекстЗапроса + "Сумма = Регистр.ПартииНаличие.СуммаРуб, Регистр.ПартииОтданные.СуммаРуб;";
        
    ИначеЕсли ВидСуммы = 2 Тогда // бух без НДС
        ТекстЗапроса = ТекстЗапроса + "Сумма = Регистр.ПартииНаличие.СуммаУпр, Регистр.ПартииОтданные.СуммаУпр;";
    КонецЕсли;
    
    ТекстЗапроса = ТекстЗапроса +
    "Функция ПриходС = Приход(Сумма);
    |Функция РасходС = Расход(Сумма);
    |Функция ПриходК = Приход(Количество);
    |Функция РасходК = Расход(Количество);
    |Функция ВозвратК = Приход(Количество)Когда(КодОперации в КодыВозвратов);
    |Функция ВозвратС = Приход(Сумма)Когда(КодОперации в КодыВозвратов);
    |Функция РасходБезНДС = Расход(Сумма2);
    |Функция РасходСНДС = Расход(Сумма1);
    |Функция ВозвратБезНДС = Приход(Сумма2)Когда(КодОперации в КодыВозвратов);
    |Функция ВозвратСНДС = Приход(Сумма1)Когда(КодОперации в КодыВозвратов);
    |Функция ОборотСумма = Сумма(Оборот)Когда(КодОперации в КодыОборота);
    |Функция ОборотУпр = Сумма(ПересчетВалюты(Оборот, Док))Когда(КодОперации в КодыОборота);
    |Функция ОборотКомРасход = Сумма(ПересчетВалюты(ОборотКом, Док, ВалВзаим, глРубли))Когда(КодОперации = глКО.ОтчетРеализатора);
    |Функция ОборотКомРасходУпр = Сумма(ПересчетВалюты(ОборотКом, Док, ВалВзаим, глДоллары))Когда(КодОперации = глКО.ОтчетРеализатора);
    |Функция ОборотВ = Сумма(Оборот)Когда(КодОперации в КодыВозвратов);
    |Функция ОборотУпрВ = Сумма(ПересчетВалюты(Оборот, Док))Когда(КодОперации в КодыВозвратов);
    |Функция ПриходПроцент = Приход(Оборот * ПроцентТипаНоменклатуры);
    |Условие (НЕ(КодОперации в КодыПеремещений));";      

    Возврат ТекстЗапроса;
1 Prog111
 
31.03.16
08:02
(0) И вот это выражение не срабатывает, выходит ошибка.

|Функция ПриходПроцент = Приход(Оборот * ПроцентТипаНоменклатуры);


Причем не работает и такие выражения:

|Функция ПриходПроцент = Приход(Запрос.Оборот * ПроцентТипаНоменклатуры);

|Функция ПриходПроцент = Приход(ОборотСумма * ПроцентТипаНоменклатуры);
2 Mikeware
 
31.03.16
08:04
И не будут
3 ЧеловекДуши
 
31.03.16
08:06
(0) Не страдайте, делайте все в циклах, при выводе на печатную форму :)
4 Prog111
 
31.03.16
08:07
(3) В похожих темах примерно такие же выражения - и, говорят, всё работало)
5 mgk2
 
31.03.16
08:08
(1) такие фокусы возможны только в функции сумма()
6 Prog111
 
31.03.16
08:10
(3) Этот отчет весьма универсален, там много фильтров, группировки могут меняться местами, под каждую настройку придется писать километр своего кода...

К тому же там итоги по группировкам выводятся прежде детальных записей, в которых можно произвести это умножение вне запроса. Соответственно - как тогда посчитать умножение и итоги, если верхние группировки уже выведены, а в детальных записях я ещё ничего не умножил и не просчитал?
7 Prog111
 
31.03.16
08:12
(5) 1С почему-то вылетает, когда ставлю "Сумма" вместо "Приход".
8 Ёпрст
 
31.03.16
08:12
(0)

|Функция Вася = Сумма(Запрос.Оборот * ПроцентТипаНоменклатуры);
9 Ёпрст
 
31.03.16
08:13
но, в данном случае, работать будет некорректно
10 Prog111
 
31.03.16
08:16
(9) Из-за округления? Или по сути неправильно?
11 Mikeware
 
31.03.16
08:18
(6) Делайте прямыми запросами. там можно все. Ну, или почти все.
12 Mikeware
 
31.03.16
08:18
(10) разрядность теряется.
13 VladZ
 
31.03.16
08:19
(0)  Запрос в 7.7 ущербный. Не нужно его насиловать. Либо делать пересчет в цикле, либо использовать другие механизмы. Прямые запросы, например.
14 Prog111
 
31.03.16
08:21
(13) Хотелось бы всё сделать на основе типового отчета, ибо иначе придется много чего писать...
15 Mikeware
 
31.03.16
08:22
(14) выгружай в индексированную таблицу, умножай, группируй как в запросе и выводи группировки ИТЗ вместо группировок запроса
16 Ёпрст
 
31.03.16
08:22
(10) округление, это детский сад, которое обходится в самом запросе.
Сам принцип, как и что считает сумма в запросе - из-за остальных функций, расчет будет не верным.
17 Mikeware
 
31.03.16
08:23
(14) а ты думал, что в сказку попал?
18 Mikeware
 
31.03.16
08:23
(16) я так и не знаю язык черных запросов :-)
19 Ёпрст
 
31.03.16
08:24
(18) да че там знать то ? Написал че нить, посмотрел в профайлер, понял, что шляпа - переписал на прямой и забыл :)
20 Ёпрст
 
31.03.16
08:24
Хотя некоторые вещи, в чорном, мне нравятся - иерархия всего и вся, к примеру.
21 Ёпрст
 
31.03.16
08:25
ну и всяческие извраты, в виде функций сумма и т.д..
22 Mikeware
 
31.03.16
08:28
(19)я первые два пункта пропускал обычно :-)
(20) Ну да. Если вручную в запросах, то иерархию делать  геморно - приходится в ИТЗ, и там уже...
23 Ёпрст
 
31.03.16
08:30
Ну, иерархию в запросе тоже можно, если как ADirks делает - отдельная табличка с группами, и триггер на её заполнение, при изменении основной таблички
24 Mikeware
 
31.03.16
08:32
(23) мне вот сейчас файловая база досталась на перевод на Упыпырище® - там триггеров не налепишь.:-(
вообще, без прямых запросов как без прямых рук.
25 Ёпрст
 
31.03.16
08:34
(24) ну, на sqlite пиши, там проще, чем на оледб..+ можно ТЗ сразу в запрос пихать во временную табличку.
26 Mikeware
 
31.03.16
08:36
(25)Ну вот поэтому до тебя и докапывался...
сейчас пробую как раз.
а вот вандаловский класс запустить не могу из-за контролов :-(
впрочем, мне нужно еще и запись, поэтому  sqlite не ограничусь....
27 Ёпрст
 
31.03.16
08:44
(26) аа..
на вот, залипуха, мот пригодится, сравнение по скорости фокса и скульлайта на простом запросе к регистру в типовой.

https://cloud.mail.ru/public/AeJK/71o1vuzd1
28 Mikeware
 
31.03.16
09:12
(27) примеры я люблю :-) Спасибо.
вопросик: а виртуальные значения видов документов и справочников в 1sqlite есть?
ну, в смысле
where Журнал.iddocdef=$ВидДокумента.Реализация

(в chm'е не нашел ответа, и в запросе не работает)
29 Ёпрст
 
31.03.16
09:27
(28) есть
30 Ёпрст
 
31.03.16
09:31
смотри в chm
объекты компоненты - Объект sqlliteQuery - Подставлять - предопределнные текстовые параметры
31 Ёпрст
 
31.03.16
09:31
ВидДокумента / DocumentKind
Подстановка идентификатора указанного вида документа:

:ВидДокумента|DocumentKind.ИмяДокумента[~]

При нулевом модификаторе подставляется строка длиной 4 символа - идентификатор вида документа в 36ричной записи

При модификаторе 1 подставляется целое число - идентификатор вида документа.
32 Ёпрст
 
31.03.16
09:32
ну, и для sqllite пиши лучше через :, заместо $
33 Mikeware
 
31.03.16
09:33
(32) понял, спрасибо. получилось
34 Mikeware
 
31.03.16
09:33
ну все, понеслась *она* по кочкам...