Имя: Пароль:
1C
1C 7.7
v7: Выполнение рачетов в запросе.
,
0 exec11
 
15.04.21
13:21
Сейчас у меня отчет выглядит не по человечески. Сначало идет детализация, потом итоговая строка для групп. В ней суммирование, оно делается в коде ручками.
Хочется привести к человеческому виду. То есть на оборот. Строка с сумирование по группе. Посути текущая стоимость товара в группе. Потом детализация.

И так. Есть регистр по партиям товаров. Он участвует в запрос. Код не привожу, там много лишнего. Вопрос пока узкий.
Нужно. Получить стоимость группы товаров по текущей (прайсовой) цене. Сделать это надо в запросе.

В коде сейчас я это делаю так:
        |Функция КонКол=КонОст(ЗапОстаток);

    СуммОбщий = СуммОбщий + Запрос.ЗапНоменклатура.Цена.Получить(РабочаяДата())  *  Запрос.КонКол

Была смелая мысль в запрос добавить:

    |Функция СумДок=Сумма(ЗапНоменклатура.Цена.Получить(РабочаяДата())  * КонКол);

но она провлилась. Не нравится КонКол, хотя он стоит чуть выше в запросе.

Может что почитать по функция подскажите.. в интернете пока что то не находится интересное ..
1 Builder
 
15.04.21
13:35
Получить() в запросе не надо, он возьмет значение на последнюю дату периода в запросе.
Ну и вот как то так работало вроде:

  |Функция СумДок=Сумма(ЗапНоменклатура.Цена  * Запрос.КонКол );
2 Mikeware
 
15.04.21
13:38
для реализации таких "смелых мыслей" лучше использовать прямые запросы.
3 Builder
 
15.04.21
13:40
+ к(1) Еще при такой записи был прикол с округлением.
4 2S
 
15.04.21
13:45
А свою функцию чего не описать?
5 GreyK
 
15.04.21
13:46
Можно и так:

//_____________________________________________________________________________
Функция ПолучитьКолКуплено(Товар,ТекущийДокумент)
    Перем ТСтрока;
    Себестоимость=0;
    Если ТаблДвижений.НайтиЗначение(Товар,ТСтрока,"Товар")=1 Тогда
        Расходы=ТаблДвижений.ПолучитьЗначение(ТСтрока,"Расходы");
        ТСтрока=0;
        Если Расходы.НайтиЗначение(ТекущийДокумент,ТСтрока,"Документ")=1 Тогда
            Себестоимость=Расходы.ПолучитьЗначение(ТСтрока,"СуммаКуплено");
            Расходы.УстановитьЗначение(ТСтрока,"СуммаКуплено",0);
            КолКуплено=Расходы.ПолучитьЗначение(ТСтрока,"КолКуплено");
            Расходы.УстановитьЗначение(ТСтрока,"КолКуплено",0);
            Возврат КолКуплено;
        КонецЕсли;
    КонецЕсли;
    Возврат 0;
КонецФункции //ПолучитьКолКуплено
//_____________________________________________________________________________
Функция ПолучитьСебестоимость()
    Возврат Себестоимость;
КонецФункции //ПолучитьСебестоимость


.....
    |Функция КолКуплено = Сумма(Количество-Количество+ПолучитьКолКуплено(Товар,ТекущийДокумент));
    |Функция СуммаКуплено = Сумма(Сумма-Сумма+ПолучитьСебестоимость());";
6 DimVad
 
15.04.21
13:46
"Строка с сумирование по группе. Посути текущая стоимость товара в группе. Потом детализация. "
Ну если суммирование делается в коде ручками то можно сделать в коде расчеты (первый проход), вывести заголовок а потом - расшифровку (второй проход).

Можно данные из запроса брать в таблицу значений тогда всё будет легко с группировками.
Ну а можно всё это "рукапашество" попробовать заменить на отчёт на СКД, там разные интересные функции есть...
7 DimVad
 
15.04.21
13:47
Тьфу, не посмотрел что это про клюшки. Простите пожалуйста...
8 Builder
 
15.04.21
13:48
(6) СКД на клюшках - это сильно :)
Такие отчеты проще делать на ИндексированнойТаблице
9 Mikeware
 
15.04.21
13:49
(7) первая часть как раз легко реализуется и на клюшках тоже.  
А индексированнаяТаблица заменить СКД во многих случаях.
10 Mikeware
 
15.04.21
13:50
(8) ну пытался же кто-то сделать нечто подобное...
году в 2007-2008.
11 DimVad
 
15.04.21
13:52
(9) Да, в первой части я имел в виду таблицу с индексами (это в терминах снеговика). Выгрузил все данные из запроса, добавил нужные индексы, и поехало - вот такие группы, вот отбор по группам...
12 Mikeware
 
15.04.21
13:55
(11) с индексированнойТаблицей  примерно так же - Сгруппировать, выражения группировки ему, и выражения суммирования - на выходе получаешь по сути дерево готовое, его и выводишь - хоть рекурсивно, хоть вручную. для ускорения можно и индексов накинуть
13 exec11
 
15.04.21
14:12
(1) Ошибка:

    |Функция КонКол=КонОст(ЗапОстаток);
    |Функция СумДок=Сумма(ЗапНоменклатура.Цена  * КонКол);

    КОНКОЛ<<?>>
    Переменная не определена (КОНКОЛ)
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    {Отчет.ПоГруппам1.Форма.Модуль(36)}: Функция СумДок=Сумма(ЗапНоменклатура.Цена  * КонКол <<?>> );    
    Запрос[12] : Ошибка в выражении 'КонКол'
14 Builder
 
15.04.21
14:31
(13) Даже скопипастить сложно? Или посмотреть внимательно что в (1) написано.
* Запрос.КонКол
15 Злопчинский
 
15.04.21
14:56
"Строка с сумирование по группе. По сути текущая стоимость товара в группе. Потом детализация."
навоз-вопрос, все делается штатно, например таким извратом типа как в (6)
- выводишь строку-группу, итог = пусто. запоминаешь адрес.
- выводишь детализацию. считаешь итог.
- закончилась детализация - получаешь ячейку отчета по замомненному адресу - в свойство Текст пишешь итог
16 Mikeware
 
15.04.21
14:59
(15) но ведь приятно, когда ИТЗ сделает это вместо тебя, не правда ли?
17 Злопчинский
 
15.04.21
15:09
(16) а то!
одно бесит! плюсик как модификатор сортировки - похерили в ИТЗ, только "-" оставили... неудобно иногда
18 Злопчинский
 
15.04.21
15:10
(16) если бы еще ИТЗ так работала когда поменял в Тзпотомок колонку числовую суммировочную - на родительском уровне - оно само скорректировалось в итоговом значении...
а то приходится извращаться...
19 Cthulhu
 
15.04.21
15:11
(16): если ради только этого добавлять 1спп - то неправда.
20 Злопчинский
 
15.04.21
15:12
(19) ну, можно еще выполняемым модулем генерить исключения вменяемо
21 Cthulhu
 
15.04.21
15:14
(20): а еще можно собаку завести...
22 exec11
 
15.04.21
15:17
(13) Моя не внимательность. Каюсь. Все получилось.

Теперь для расчета в в процентах от общий стоимости по группам, нужно все просумировать. Добавляем еще одну строку :


    |Функция КонКол=КонОст(ЗапОстаток);
    |Функция СумДок=Сумма(ЗапНоменклатура.Цена  * Запрос.КонКол);    

    |Функция СумОбщая=Сумма(Запрос.СумДок);

Вроде логичо. Но не получилось. СумДок и СумОбщая оказались равными. Накопления не происходит. Почему ?

(15) - закончилась детализация - получаешь ячейку отчета по замомненному адресу - в свойство Текст пишешь итог

Интересненько, это как ? По сути то что надо. А можно как то по подробней ? Или где почитать ??
23 Mikeware
 
15.04.21
15:23
(19) 1спп и формекс уже давно входят в джентльменский набор  джентльменов-клюшечников.
(21) зачем тебе заводная собака?
24 Mikeware
 
15.04.21
15:23
(22) Область(запомненыйАдрес).Текст=формат(Итог)
25 Злопчинский
 
15.04.21
15:35
(22) "Вроде логичо. Но не получилось. СумДок и СумОбщая оказались равными. Накопления не происходит. Почему ?"
потому что это сущности одного уровня иерархии. паралельно считаются, друг от друга ника кне зависятю
26 exec11
 
15.04.21
16:31
(25) Как накопить в запросе сумму всех СумДок ?  Ни как ?

(24) Спасибо, буду изучать !
27 ADirks
 
16.04.21
06:47
(26) можешь ещё тут поизучать https://infostart.ru/public/15510/
28 Злопчинский
 
16.04.21
09:36
(26) Группировкой в запросе, ясен пень.
Сделай искуственную группировку, на самом верхнем уровне, на этой группировке будет сумма всех сумм
29 Arbuz
 
16.04.21
16:27
(16) Ещё приятнее когда это делают оконные функции SQL
30 Злопчинский
 
16.04.21
21:22
(29) отсыпьте мне...