Имя: Пароль:
1C
1C 7.7
v7: Функция в запросе в 1с 7.7
0 Лиза777
 
26.04.18
13:01
Функция ЛитрыНалИзСовместнойОплатыСБонусами = Сумма ((СуммаПокупки*100)/((ОплаченоБонусами/10+СуммаПокупки)*Литры/100))

вылетает программа на выполнении такого запроса. Пробовала упрощать до (Сумма+10) - так нормально, но как только ставлю (Сумма+10) * 100 вылетает 1с-ка. Никак такое не запихать в функцию?
1 Kigo_Kigo
 
26.04.18
13:04
А нолик там деление не втесался?
2 Лиза777
 
26.04.18
13:07
тоже думала про это, поэтому стала упрощать.
3 Лиза777
 
26.04.18
13:07
Функция Сумма((СуммаПокупки+10) * 100)
тоже вылетает
4 aka AMIGO
 
26.04.18
13:12
Переменные все известны?
5 Лиза777
 
26.04.18
13:16
вроде бы да... А вообще должна работать такая конструкция сложная в функции сумма? Я чёт засомневалась, что там деление и умножение и всё это в функции "сумма"
6 Kigo_Kigo
 
26.04.18
13:21
Что мешает это считать не в запросе?
7 Масянька
 
26.04.18
13:22
(6) Потому что нужно (в соседней ветке почему-то тебя это не заботило).
8 Масянька
 
26.04.18
13:23
(5) А если без этой строки вывести показатели, которые участвуют в запросе - точно ноля нет?
И вылетает молча?
9 Лиза777
 
26.04.18
13:23
(7)   ))))
ладно буду проверять данные. Значит в них всё таки дело.
10 Лиза777
 
26.04.18
13:23
молча вылетает
11 Масянька
 
26.04.18
13:24
(9) Не факт. Но понять стоит.
12 2S
 
26.04.18
13:26
(0) опиши свою функцию отдельно с расчетами и вызывай ее
13 Cool_Profi
 
26.04.18
13:27
(12) Опередил ((
14 Kigo_Kigo
 
26.04.18
13:27
(7) Не переваливайте со здоровой головы на больную(с) для любителей пословиц
15 Масянька
 
26.04.18
13:28
(12) Лучший вариант.
(14) Лечите голову.
16 Franchiser
 
гуру
26.04.18
13:29
Покажи сам запрос.
М.б. надо писать Запрос.Литры и тд.
17 Kigo_Kigo
 
26.04.18
13:29
(15) С моей все в порядке
18 Franchiser
 
гуру
26.04.18
13:33
СуммаПокупки - это функция уже просуммированная в запросе? зачем ее в Сумму() еще пихать?
ОплаченоБонусами И Литры - это что?
19 Franchiser
 
гуру
26.04.18
13:34
Попробуй так
ЛитрыНалИзСовместнойОплатыСБонусами = (запрос.СуммаПокупки*100)/((Сумма(ОплаченоБонусами)/10+Запрос.СуммаПокупки)*Сумма(Литры)/100)
20 Лиза777
 
26.04.18
13:36
(18) суммапокупки - это реквизит документа "сумма". и те тоже  реквизиты документа
21 Franchiser
 
гуру
26.04.18
13:39
Может быть у тебя переменные где то в коде встречаются с такими же названиями СуммаПокупки, ОплаченоБонусами, Литры
22 Franchiser
 
гуру
26.04.18
13:40
Покажи весь запрос, какие в запросе Функции есть кроме этой?
23 Lazy Stranger
 
26.04.18
13:45
хот и не совсем в тему:
а зачем в одном и том же выражении сначала умножать на 100, а потом делить на те же 100?
24 Franchiser
 
гуру
26.04.18
13:52
100/Что-то/100 =10000/что-то
25 aka AMIGO
 
26.04.18
14:20
Еще разочек.. (12) +100500 © миста..
Отдельная функция - милое дело, можно сколь угодно сложную написать..
26 aka AMIGO
 
26.04.18
14:21
+25 заодно и отладочку разлюбезную включить, да проследить по ней
27 Карст
 
26.04.18
14:42
Функция (блабла)

возврат ляля

угу типа
а в запросе например
Условие Функция(документиззапроса)=1
28 2S
 
26.04.18
15:03
(24) бред, канает только для целых чисел
29 Franchiser
 
гуру
26.04.18
23:12
(28) ты не согласен с математикой?
30 Zmich
 
27.04.18
05:48
(29). Неверно. Свойства ассоциативности у операции деления нет. Т.е. все зависит от того, как поставить скобки: 100/(Что-то/100) = 10000/Что-то, однако (100/Что-то)/100 = 1/Что-то. Поэтому такая запись, как у тебя, некорректна.
31 Franchiser
 
гуру
27.04.18
10:21
(30) да ладно, если скобок нет то первыми выполняются умножения и деления, а потом сложение и вычитание это первый класс.
1+2:3:5 =
32 Ёпрст
 
27.04.18
10:24
(0) формат базы какой ? SQL ? DBF ?
33 Franchiser
 
гуру
27.04.18
10:24
И скобки в операциях деления/умножения никакого смысла не имеют. Ты видимо пропустил уроки в школе по сокращению дробей.
34 Ёпрст
 
27.04.18
10:25
ну и покажи весь текст запроса целиком
35 Franchiser
 
гуру
27.04.18
10:26
(100/Что-то)/100 = 1/Что-то
Это чушь
36 Zmich
 
27.04.18
10:28
(35). Как чушь? например, "Что-то" возьмем равным 2. (100/2)/100 = 50/100 = 1/2.
37 Zmich
 
27.04.18
10:30
(36)+ А теперь скобки поставим иначе: 100/(2/100) = 100/0.02 = 5000 = 10000/2. Ну и кто пропустил уроки в школе по сокращению дробей?
38 Franchiser
 
гуру
27.04.18
10:31
Ладно, если скобок нет то операция выполняется в порядке следования
39 Ёпрст
 
27.04.18
10:35
100/0.02 =5
40 Franchiser
 
гуру
27.04.18
10:35
Деление на 100 происходит в знаменателе и он рассчитывается первым
41 Franchiser
 
гуру
27.04.18
10:36
Так что будет по варианту 10000 в числителе
42 Zmich
 
27.04.18
10:36
(38). Это кто сказал? И кстати, тем более: если в порядке следования, тогда в (24) у тебя ерунда написана. Вот еще пример: a^b^c - в каком порядке должно идти возведение в степень? Ассоциативности у этой операции также нету.
(39). Разделить, а не умножить
43 Ёпрст
 
27.04.18
10:38
(42) :)

так и знал, что щас достанут калькуляторы проверять :))))
44 Franchiser
 
гуру
27.04.18
10:40
Сначала выполняем по порядку (слева направо) умножение и деление, а затем сложение и вычитание.
https://interneturok.ru/matematika/3-klass/tema-umnozhenie-i-delenie/poryadok-vypolneniya-deystviy-v-vyrazheniyah-bez-skobok-i-so-skobkami-2
45 Zmich
 
27.04.18
10:48
(44). Если слева направо, то в таком случае 100/Что-то/100 = 1/Что-то, а не 10000/Что-то
46 Franchiser
 
гуру
27.04.18
10:58
Согласен
47 Franchiser
 
гуру
27.04.18
11:01
Но у ТС после случай когда выражение после  первого деления в скобках, для его примера  это 2-й случай т.е. 10000
48 1Сергей
 
27.04.18
11:05
Эта. А что, никто ещё не предложил отказаться от черных запросов в пользу прямых?
49 Franchiser
 
гуру
27.04.18
11:05
(40), (41) относилось к формуле ТС
50 Franchiser
 
гуру
27.04.18
11:06
(48) потому что Лиза вряд ли будет их писать
51 Franchiser
 
гуру
27.04.18
11:11
Скорее всего ТС ошибся Литры/100 нужно взять в скобки
52 Лиза777
 
11.05.18
05:45
Весь запрос
53 Лиза777
 
11.05.18
05:45
ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |ТекущийДокумент = Документ.Отчет.ТекущийДокумент;
    |ДатаДок =  Документ.Отчет.ДатаДок;
    |АЗС = Документ.Отчет.АЗС;    
    |ГСМ = Документ.Отчет.ГСМ.ТекущийЭлемент;    
    |КодПредприятия = Документ.Отчет.Предприятие.Код;
    |Бонусы = Документ.Отчет.ОплаченоБонусами;
    |Литры = Документ.Отчет.Литры;
    |Цена = Документ.Отчет.Цена;
    |СуммаПокупки = Документ.Отчет.Сумма;
    |без Итогов;        
    |Функция ЛитрыНалИзСовместнойОплатыСБонусами = Сумма ((((СуммаПокупки*100)/(Бонусы/10+СуммаПокупки))*Литры)/100) Когда (((СокрЛП(КодПредприятия)=""100"") ИЛИ (СокрЛП(КодПредприятия)=""101"")) И ((Бонусы > 0) И (СуммаПокупки>0)));
    |Функция ЛитрыБонусы        = Сумма(Литры) Когда ((СуммаПокупки = 0) И (Бонусы>0));
    |Группировка АЗС без групп;
    |";
54 Лиза777
 
11.05.18
07:08
(50) считаю при обработке результата запроса уже. Но долго считает, буду всё-таки на прямой запрос переделывать
55 GreyK
 
11.05.18
07:24
(53) Сделай так:
Функция МояФункцияПодсчета(СуммаПокупки,Бонусы,Литры,КодПредприятия)
   //Здесь высчитываешь результат
КонецФункции

....
|Функция ЛитрыНалИзСовместнойОплатыСБонусами = Сумма (Литры + МояФункцияПодсчета(СуммаПокупки,Бонусы,Литры,КодПредприятия) - Литры);
)
56 Лиза777
 
11.05.18
08:35
(55) так весь смысл функции в запросе, что мне нужна сумма результата функции. А так мне придётся при обработке результата запроса перебирать строки документа (добавить тогда надо группировку по документу в запрос и возможно группировку по строкам). И при таком переборе для каждой стоки вызывать эту функцию - как-то не очень.
57 GreyK
 
11.05.18
08:45
(56) Вот это функция в запросе:

|Функция ЛитрыНалИзСовместнойОплатыСБонусами = Сумма (Литры + МояФункцияПодсчета(СуммаПокупки,Бонусы,Литры,КодПредприятия) - Литры);

Просто она обращается к внешней функции.
58 Сияющий в темноте
 
11.05.18
10:35
Попробуйте условия и вычисления отделить от суммы
не забываем,что сумма вычисляется по всему запросу