Имя: Пароль:
1C
1C 7.7
v7: Помогите с запросом
0 tesei
 
07.10.12
21:03
Давно я не брал в руки клюшки, мозги под снеговика заточены, не могу сообразить. Конфа комплексная. В запросе по контрагентам есть сумма долга, сумма кредита, нужно посчитать СуммаПревышения = Макс(СуммаДолга - СуммаКредита, 0) для каждого клиента и получить итоги по всей иерархии. Ниже текст запрос:

   ТекстЗапроса =
   |Период с  ВыбКонПериода по ВыбКонПериода;
   |Контрагент    = Регистр.Покупатели.Договор.Владелец, Регистр.Поставщики.Договор.Владелец;
   |СуммаКредита    = Регистр.Поставщики.Договор.СуммаКредита, Регистр.Покупатели.Договор.СуммаКредита;
   |СуммаУпр        = Регистр.Покупатели.СуммаУпр, Регистр.Поставщики.СуммаУпр;
   |Функция        СуммаКредита1 = Среднее(СуммаКредита);
   |Функция        СуммаДолга        = КонОст(СуммаУпр);
   |Группировка Контрагент;
   |";

Поможите, коллеги-клюшечники!
1 DenLaDen
 
07.10.12
21:18
Функция Разница( Перем1, Перем2 )
Возврат Перем1 - Перем2;
КонецФункции



в запросе
|Функция СуммаПревышения = Макс( Разница( СуммаДолга, СуммаКредита ), 0 );
2 tesei
 
07.10.12
21:22
(1) спасибо, щас проверю...
3 DenLaDen
 
07.10.12
21:22
+(1) прогнал
|Функция СуммаПревышения = Сумма( Разница( СуммаДолга, СуммаКредита ) );
4 tesei
 
07.10.12
21:52
(3) не вышло:

Функция Разница(Перем1, Перем2)
   Возврат Макс(Перем1 - Перем2, 0);
КонецФункции


   |Функция        Превышение        = Сумма(Разница(СуммаУпр, СуммаКредита));

- результат пустой

   |Функция        Превышение        = Сумма(Разница(СуммаДолга, СуммаКредита1));

- синтаксическая ошибка
5 tesei
 
07.10.12
22:35
В качестве апа предлагаю отредактированный запрос (без синтаксических ошибок, пустой результат в "Превышение"):

   |Период с  ВыбКонПериода по ВыбКонПериода;
   |Контрагент     = Регистр.Покупатели.Договор.Владелец, Регистр.Поставщики.Договор.Владелец;
   |СуммаКредита    = Регистр.Поставщики.Договор.СуммаКредита, Регистр.Покупатели.Договор.СуммаКредита;
   |СуммаУпр         = Регистр.Покупатели.СуммаУпр, Регистр.Поставщики.СуммаУпр;
   |Функция        СуммаКредита1 = Среднее(СуммаКредита);
   |Функция         СуммаДолга         = КонОст(СуммаУпр);
   |Функция        Превышение        = Сумма(Разница(СуммаУпр, СуммаКредита));
|Группировка Контрагент;
   |";
6 tesei
 
08.10.12
08:44
добрый ап
7 Voronve
 
08.10.12
08:49
(6) Свои функции в запросе работают в конструкциях "условие" и "когда". Сюда и копай:
|Функция Превышение = Сумма(СуммаДолга) Когда (Разница(СуммаУпр, СуммаКредита) > 0);
Как то так...
8 tesei
 
08.10.12
09:22
Сорри, в (5) все работает, спасибо! :)
9 tesei
 
08.10.12
09:28
... правда считает неправильно, врет. Может из-за того, что один параметр - сумма, а другой - конечный остаток.
10 Patrio_
O_Muerte
 
08.10.12
09:42
Есть мнение, что дополнительно определенные функции в запросе 77 сильно замедляют выполнение оного.
Предлагаю не ебсти себе мозг, а считать следующим образом:
|Функция Превышение = Сумма(СуммаУпр - СуммаКредита);
Либо в постобработке на основании готовых переменных долга и кредита.
Еще совет - не помнишь язык запросов - построй конструктором и определяй все поля по единому порядку, а не в разнобой:

|Контрагент     = Регистр.Покупатели.Договор.Владелец, Регистр.Поставщики.Договор.Владелец;
   |СуммаКредита    = Регистр.Поставщики.Договор.СуммаКредита, Регистр.Покупатели.Договор.СуммаКредита;
НЕ ВЕРНО!

|Контрагент     = Регистр.Поставщики.Договор.Владелец, Регистр.Покупатели.Договор.Владелец;
   |СуммаКредита    = Регистр.Поставщики.Договор.СуммаКредита, Регистр.Покупатели.Договор.СуммаКредита;
ВЕРНО!
11 tesei
 
08.10.12
13:10
(10) не подходит, тут не просто разница, а неотрицательная разница с итогами по иерархии.
В общем, надоело мне убивать время, решал я задачу через }|{опу экскаватором: посчитал итоги последовательно по всем нисходящим уровням в цикле. В снеговике все делается на раз в одном запросе, клюшки отстой. Пора уже брать за работы по 7ке по двойному тарифу.
Ошибка? Это не ошибка, это системная функция.