Имя: Пароль:
1C
1C 7.7
v7: Не группирует по периодам
0 Anempadest
 
27.01.15
05:10
Делаю отчёт о продаже. Очень простой:
Год | Квартал | Месяц | День | Сумма

В отчёт выводится:
Год | Последний квартал года | Последний месяц года | Последний день года | Итог за год

Происходит группировка только по годам. По нижестоящим группировкам запрос просто суммирует значение за год.

Бьюсь уже полдня - не знаю, что делать. Помогите!
1 VladZ
 
27.01.15
05:16
Видимо, что-то пошло не так.

Показывай, что делаешь.
2 Anempadest
 
27.01.15
05:18
Вот текст запроса:

Период С ДатаН По ДатаК;
_Налоговый=Регистр.База.Налоговый;
_Сумма=Регистр.База.Сумма;
Группировка Год;
Группировка Квартал;
Группировка Месяц;
Группировка День;
Функция Сумма=Сумма(_Сумма);
Функция СуммаПродажа=Сумма(_Сумма) Когда (_Сумма>0);
Функция СуммаВозврат=Сумма(_Сумма) Когда (_Сумма<0);
Условие(_Налоговый=Перечисление.Булево.Да);
3 Anempadest
 
27.01.15
05:23
Что характерно?
Если делать запрос по кварталам, то картина аналогичная. Запрос делает переборку только по первому значению группировки, а по нижестоящим выводит одной строкой последний месяц/последний день и общую сумму по первому значению группировки.
4 Anempadest
 
27.01.15
05:45
Нашёл.
Пишут, что группировки по периодам ВМЕСТЕ не дружат. В запросе должна быть только одна группировка по периоду. Или Год, или Квартал, или Месяц, или День. Вместе нельзя.
Это правда?
5 VladZ
 
27.01.15
05:50
Что-то не помню таких проблем.
6 Anempadest
 
27.01.15
05:53
7 Anempadest
 
27.01.15
05:55
Ладно, буду распечатывать отчёты за каждый месяц с детализацией по дням :)
8 VladZ
 
27.01.15
06:07
Варианты решения:
1. Закинуть результат запроса в таблицу значений. Добавить нужную инфу. Привести ТЗ к нужному виду.

2. На этапе вывода получать необходимую инфу.
9 Anempadest
 
27.01.15
06:17
Закинуть результат в ТЗ и привести к нужному виду - это интересно. Спасибо.
10 Anempadest
 
27.01.15
16:39
Однако получился совсем не простой отчёт.

        М=СоздатьОбъект("ТаблицаЗначений");
        М.НоваяКолонка("Год","Число",4,0);
        М.НоваяКолонка("Продажа","Число",20,2);
        М.НоваяКолонка("Возврат","Число",20,2);
        М.НоваяКолонка("Сумма","Число",20,2);
        М.НоваяКолонка("Кварталы","ТаблицаЗначений");
        //дни
        Пока Запрос.Группировка()=1 Цикл
            //год
            ТекГод=ДатаГод(Запрос.День);
            НомерСтр=0;
            Если М.НайтиЗначение(ТекГод,НомерСтр,"Год")=0 Тогда
                М.НоваяСтрока();
                М.Год=ТекГод;
                М.Кварталы=СоздатьОбъект("ТаблицаЗначений");
                М.Кварталы.НоваяКолонка("Квартал","Число",1,0);
                М.Кварталы.НоваяКолонка("Продажа","Число",20,2);
                М.Кварталы.НоваяКолонка("Возврат","Число",20,2);
                М.Кварталы.НоваяКолонка("Сумма","Число",20,2);
                М.Кварталы.НоваяКолонка("Месяцы","ТаблицаЗначений");
            Иначе
                М.ТекущаяСтрока(НомерСтр);
            КонецЕсли;
            //квартал
            ТекКвартал=гДатаКвартал(Запрос.День);
            НомерСтр=0;
            Если М.Кварталы.НайтиЗначение(ТекКвартал,НомерСтр,"Квартал")=0 Тогда
                М.Кварталы.НоваяСтрока();
                М.Кварталы.Квартал=ТекКвартал;
                М.Кварталы.Месяцы=СоздатьОбъект("ТаблицаЗначений");
                М.Кварталы.Месяцы.НоваяКолонка("Месяц","Число",2,0);
                М.Кварталы.Месяцы.НоваяКолонка("Продажа","Число",20,2);
                М.Кварталы.Месяцы.НоваяКолонка("Возврат","Число",20,2);
                М.Кварталы.Месяцы.НоваяКолонка("Сумма","Число",20,2);
                М.Кварталы.Месяцы.НоваяКолонка("Дни","ТаблицаЗначений");
            Иначе
                М.Кварталы.ТекущаяСтрока(НомерСтр);
            КонецЕсли;
            //месяц
            ТекМесяц=ДатаМесяц(Запрос.День);
            НомерСтр=0;
            Если М.Кварталы.Месяцы.НайтиЗначение(ТекМесяц,НомерСтр,"Месяц")=0 Тогда
                М.Кварталы.Месяцы.НоваяСтрока();
                М.Кварталы.Месяцы.Месяц=ТекМесяц;
                М.Кварталы.Месяцы.Дни=СоздатьОбъект("ТаблицаЗначений");
                М.Кварталы.Месяцы.Дни.НоваяКолонка("День","Дата");
                М.Кварталы.Месяцы.Дни.НоваяКолонка("Продажа","Число",20,2);
                М.Кварталы.Месяцы.Дни.НоваяКолонка("Возврат","Число",20,2);
                М.Кварталы.Месяцы.Дни.НоваяКолонка("Сумма","Число",20,2);
                М.Кварталы.Месяцы.Дни.НоваяКолонка("Документы","ТаблицаЗначений");
            Иначе
                М.Кварталы.Месяцы.ТекущаяСтрока(НомерСтр);
            КонецЕсли;
            //день
            ТекДень=Запрос.День;
            НомерСтр=0;
            Если М.Кварталы.Месяцы.Дни.НайтиЗначение(ТекДень,НомерСтр,"День")=0 Тогда
                М.Кварталы.Месяцы.Дни.НоваяСтрока();
                М.Кварталы.Месяцы.Дни.День=ТекДень;
                М.Кварталы.Месяцы.Дни.Документы=СоздатьОбъект("ТаблицаЗначений");
                М.Кварталы.Месяцы.Дни.Документы.НоваяКолонка("Документ","Документ");
                М.Кварталы.Месяцы.Дни.Документы.НоваяКолонка("Продажа","Число",20,2);
                М.Кварталы.Месяцы.Дни.Документы.НоваяКолонка("Возврат","Число",20,2);
                М.Кварталы.Месяцы.Дни.Документы.НоваяКолонка("Сумма","Число",20,2);
            Иначе
                М.Кварталы.Месяцы.Дни.ТекущаяСтрока(НомерСтр);
            КонецЕсли;
            //документ
            М.Кварталы.Месяцы.Дни.Документы.НоваяСтрока();
            М.Кварталы.Месяцы.Дни.Документы.Документ=Запрос._Продажа;
            М.Кварталы.Месяцы.Дни.Документы.Продажа=Запрос.СуммаПродажа;
            М.Кварталы.Месяцы.Дни.Документы.Возврат=Запрос.СуммаВозврат;
            М.Кварталы.Месяцы.Дни.Документы.Сумма=Запрос.Сумма;
            //день
            М.Кварталы.Месяцы.Дни.Продажа=М.Кварталы.Месяцы.Дни.Продажа+Запрос.СуммаПродажа;
            М.Кварталы.Месяцы.Дни.Возврат=М.Кварталы.Месяцы.Дни.Возврат+Запрос.СуммаВозврат;
            М.Кварталы.Месяцы.Дни.Сумма=М.Кварталы.Месяцы.Дни.Сумма+Запрос.Сумма;
            //месяцы
            М.Кварталы.Месяцы.Продажа=М.Кварталы.Месяцы.Продажа+Запрос.СуммаПродажа;
            М.Кварталы.Месяцы.Возврат=М.Кварталы.Месяцы.Возврат+Запрос.СуммаВозврат;
            М.Кварталы.Месяцы.Сумма=М.Кварталы.Месяцы.Сумма+Запрос.Сумма;
            //кварталы
            М.Кварталы.Продажа=М.Кварталы.Продажа+Запрос.СуммаПродажа;
            М.Кварталы.Возврат=М.Кварталы.Возврат+Запрос.СуммаВозврат;
            М.Кварталы.Сумма=М.Кварталы.Сумма+Запрос.Сумма;
            //годы
            М.Продажа=М.Продажа+Запрос.СуммаПродажа;
            М.Возврат=М.Возврат+Запрос.СуммаВозврат;
            М.Сумма=М.Сумма+Запрос.Сумма;
        КонецЦикла;
        //вывод
        М.ВыбратьСтроки();
        Пока М.ПолучитьСтроку()=1 Цикл
            ПерваяСтрока1=Т.ВысотаТаблицы();
            М.Кварталы.ВыбратьСтроки();
            Пока М.Кварталы.ПолучитьСтроку()=1 Цикл
                ПерваяСтрока2=Т.ВысотаТаблицы();
                М.Кварталы.Месяцы.ВыбратьСтроки();
                Пока М.Кварталы.Месяцы.ПолучитьСтроку()=1 Цикл
                    ПерваяСтрока3=Т.ВысотаТаблицы();
                    М.Кварталы.Месяцы.Дни.ВыбратьСтроки();
                    Пока М.Кварталы.Месяцы.Дни.ПолучитьСтроку()=1 Цикл
                        ПерваяСтрока4=Т.ВысотаТаблицы();
                        М.Кварталы.Месяцы.Дни.Документы.ВыбратьСтроки();
                        Пока М.Кварталы.Месяцы.Дни.Документы.ПолучитьСтроку()=1 Цикл
                            тГод=М.Год;
                            тКвартал=Формат(М.Кварталы.Квартал,"Ч(0)2")+"-"+М.Год;
                            тМесяц=Формат(Дата(М.Год,М.Кварталы.Месяцы.Месяц,1),"Д ММММГГГГ");
                            тДень=М.Кварталы.Месяцы.Дни.День;
                            тДокумент=М.Кварталы.Месяцы.Дни.Документы.Документ;
                            тПродажа=М.Кварталы.Месяцы.Дни.Документы.Продажа;
                            тВозврат=М.Кварталы.Месяцы.Дни.Документы.Возврат;
                            тСумма=М.Кварталы.Месяцы.Дни.Документы.Сумма;
                            Т.ВывестиСекцию("Строка");
                        КонецЦикла;
                        тПродажа=М.Кварталы.Месяцы.Дни.Продажа;
                        тВозврат=М.Кварталы.Месяцы.Дни.Возврат;
                        тСумма=М.Кварталы.Месяцы.Дни.Сумма;
                        Т.ВывестиСекцию("День");
                        Т.Область(ПерваяСтрока4+1,4,Т.ВысотаТаблицы(),4).Объединить();
                    КонецЦикла;
                    тПродажа=М.Кварталы.Месяцы.Продажа;
                    тВозврат=М.Кварталы.Месяцы.Возврат;
                    тСумма=М.Кварталы.Месяцы.Сумма;
                    Т.ВывестиСекцию("Месяц");
                    Т.Область(ПерваяСтрока3+1,3,Т.ВысотаТаблицы(),3).Объединить();
                КонецЦикла;
                тПродажа=М.Кварталы.Продажа;
                тВозврат=М.Кварталы.Возврат;
                тСумма=М.Кварталы.Сумма;
                Т.ВывестиСекцию("Квартал");
                Т.Область(ПерваяСтрока2+1,2,Т.ВысотаТаблицы(),2).Объединить();
            КонецЦикла;
            тПродажа=М.Продажа;
            тВозврат=М.Возврат;
            тСумма=М.Сумма;
            Т.ВывестиСекцию("Год");
            Т.Область(ПерваяСтрока1+1,1,Т.ВысотаТаблицы(),1).Объединить();
        КонецЦикла;
        тПродажа=М.Итог("Продажа");
        тВозврат=М.Итог("Возврат");
        тСумма=М.Итог("Сумма");
        Т.ВывестиСекцию("Итог");
11 Ёпрст
 
27.01.15
17:01
Пищи прямой запрос и там какая угодно группировка и группировки.. хоть кубики делай
12 Anempadest
 
27.01.15
17:06
(11) Прямой запрос к регистру? Можно. Но теперь, когда используется ТЗ, как хранилище, уже без разницы откуда брать данные - через запрос или через прямое обращение к регистру.
13 Ёпрст
 
27.01.15
17:07
(12) На большом периоде..твоя ТЗ загнётся
14 Ёпрст
 
27.01.15
17:07
а так - сразу будешь иметь всё, из-запроса.
15 Anempadest
 
27.01.15
17:14
(14) Не понял. Я ведь и делаю запрос. Выбираю все подряд документы из регистра. А потом эти документы запихиваю в ТЗ с группировкой по Год, Квартал, Месяц, День.

Как по-другому получить такие группировки?
16 Ёпрст
 
27.01.15
17:27
(15) в прямом запросе, сразу
17 Anempadest
 
27.01.15
17:39
(16) Это невозможно. 1С не способна сделать запрос, в котором одновременно будут использоваться предопределённые группировки Год, Квартал, Месяц и День. Что-то одно.
Городил бы я огород? :)
18 Ёпрст
 
27.01.15
17:43
(17) читай по-губам: прямой запрос.
Это не черный, из(0), это прямой
19 Ёпрст
 
27.01.15
17:44
т.е прямое обращение к таблицам ИБ
20 Anempadest
 
27.01.15
18:07
(18) Прошу прощения, если не знаю, что такое "Прямой запрос".
Прямой запрос к таблицам ИБ пишется на Встроенном языке 1С?
21 Ёпрст
 
27.01.15
18:19
(20) в основном, на t-sql
22 Ёпрст
 
27.01.15
18:19
23 Anempadest
 
27.01.15
18:30
(22) Понятно. Благодарю.