Имя: Пароль:
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ке по двойному тарифу.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn