Имя: Пароль:
1C
1С v8
Группировка в запросе отчета на СКД
, ,
0 Фантазер
 
07.09.20
08:32
Здравствуйте.
Сделал запрос для отчета на СКД, проверил его в консоли - работает как надо.
Засунул этот же запрос в сам отчет - неверно работает группировка в обной из таблиц.
Как это победить? Куда посмотреть?
1 LoneWanderer
 
07.09.20
08:55
(0)
1. Проверять нужно в консоли отчетов / СКД, а не запросов.
2. Из экспресс советов:
- выключить "Использовать группировки запроса если возможно"
- если предыдущий пункт не поможет, выключить "Автозаполнение" доступных полей и разметить запрос (с помощью {}) руками
2 toypaul
 
гуру
07.09.20
09:17
3 toypaul
 
гуру
07.09.20
09:24
А еще приходите на митапчик ИС http://catalog.mista.ru/events/1269352/

там я дам ответ на ваш (и многих других) сокровенный вопрос - "Сделал запрос для отчета на СКД, проверил его в консоли - работает как надо."
4 Фантазер
 
07.09.20
13:55
(1) Проверил в консоли СКД - да, дает неверный результат, даже если отключить Группировки где это возможно
Про автозаполнение понял, но не знаю как размечать.

Запрос все-таки приложу.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РасходПродуктовПоНорме.Период КАК Период,
    РасходПродуктовПоНорме.Организация КАК Организация,
    РасходПродуктовПоНорме.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    МАКСИМУМ(РасходПродуктовПоНорме.КоличествоДовольствующихся) КАК КоличествоДовольствующихся,
    РасходПродуктовПоНорме.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_РасходПоНормеДовольствующиеся
ИЗ
    РегистрНакопления.РасходПродуктовПоНорме КАК РасходПродуктовПоНорме
ГДЕ
    РасходПродуктовПоНорме.Период МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО
    РасходПродуктовПоНорме.Период,
    РасходПродуктовПоНорме.Организация,
    РасходПродуктовПоНорме.КатегорияДовольствующихся,
    РасходПродуктовПоНорме.Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_РасходПоНормеДовольствующиеся.Период КАК Период,
    ВТ_РасходПоНормеДовольствующиеся.Организация КАК Организация,
    ВТ_РасходПоНормеДовольствующиеся.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    МАКСИМУМ(ВТ_РасходПоНормеДовольствующиеся.КоличествоДовольствующихся) КАК КоличествоДовольствующихся,
    ВТ_РасходПоНормеДовольствующиеся.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_РасходПоНормеДовольствующиесяСгруппирован
ИЗ
    ВТ_РасходПоНормеДовольствующиеся КАК ВТ_РасходПоНормеДовольствующиеся

СГРУППИРОВАТЬ ПО
    ВТ_РасходПоНормеДовольствующиеся.Период,
    ВТ_РасходПоНормеДовольствующиеся.Организация,
    ВТ_РасходПоНормеДовольствующиеся.КатегорияДовольствующихся,
    ВТ_РасходПоНормеДовольствующиеся.Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МЕСЯЦ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.Период) КАК МесяцРасхода,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Организация КАК Организация,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    МАКСИМУМ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.КоличествоДовольствующихся) КАК КоличествоДовольствующихся,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_ГруппыДовольствующихсяПоМесяцу
ИЗ
    ВТ_РасходПоНормеДовольствующиесяСгруппирован КАК ВТ_РасходПоНормеДовольствующиесяСгруппирован

СГРУППИРОВАТЬ ПО
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.КатегорияДовольствующихся,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Регистратор,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Организация,
    МЕСЯЦ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.Период)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода КАК МесяцРасхода,
    ВТ_ГруппыДовольствующихсяПоМесяцу.Организация КАК Организация,
    ВТ_ГруппыДовольствующихсяПоМесяцу.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    СУММА(ВТ_ГруппыДовольствующихсяПоМесяцу.КоличествоДовольствующихся) КАК КоличествоДовольствующихся
ИЗ
    ВТ_ГруппыДовольствующихсяПоМесяцу КАК ВТ_ГруппыДовольствующихсяПоМесяцу

СГРУППИРОВАТЬ ПО
    ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода,
    ВТ_ГруппыДовольствующихсяПоМесяцу.Организация,
    ВТ_ГруппыДовольствующихсяПоМесяцу.КатегорияДовольствующихся
5 LoneWanderer
 
07.09.20
13:59
В последнем запросе пакета сделать что-то типа:
ВЫБРАТЬ
...
{ВЫБРАТЬ
    МесяцРасхода,
    Организация
    ...}
....
{ГДЕ
    ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода КАК МесяцРасхода,
    ...
    СУММА(ВТ_ГруппыДовольствующихсяПоМесяцу.КоличествоДовольствующихся) КАК КоличествоДовольствующихся}

В остальных не вписывать {} вообще.
Это будет не очень оптимально, зато запрос будет формироваться наиболее предсказуемо.

{} Можно не вписывать руками а добавить через конструктор запросов. Если открыть его из конструктора схемы компоновки компоновки данных - там будет закладка "Компоновка данных" (или что-то типа того).
6 toypaul
 
гуру
07.09.20
14:47
(4) дэк ты покажи исходный запрос, запрос из консоли и настройки. и тогда будет проще понять что и где подкрутить
7 Фантазер
 
07.09.20
14:51
(6) Сам запрос приложил выше в сообщении 4
А это из КОнсоли СКД

<dataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema"; xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common"; xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"; xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"; xmlns:v8="http://v8.1c.ru/8.1/data/core"; xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
    <dataSource>
        <name>ИсточникДанных1</name>
        <dataSourceType>Local</dataSourceType>
    </dataSource>
    <dataSet xsi:type="DataSetQuery">
        <name>НаборДанных1</name>
        <dataSource>ИсточникДанных1</dataSource>
        <query>ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РасходПродуктовПоНорме.Период КАК Период,
    РасходПродуктовПоНорме.Организация КАК Организация,
    РасходПродуктовПоНорме.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    МАКСИМУМ(РасходПродуктовПоНорме.КоличествоДовольствующихся) КАК КоличествоДовольствующихся,
    РасходПродуктовПоНорме.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_РасходПоНормеДовольствующиеся
ИЗ
    РегистрНакопления.РасходПродуктовПоНорме КАК РасходПродуктовПоНорме
ГДЕ
    РасходПродуктовПоНорме.Период МЕЖДУ &amp;НачалоПериода И &amp;КонецПериода

СГРУППИРОВАТЬ ПО
    РасходПродуктовПоНорме.Период,
    РасходПродуктовПоНорме.Организация,
    РасходПродуктовПоНорме.КатегорияДовольствующихся,
    РасходПродуктовПоНорме.Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_РасходПоНормеДовольствующиеся.Период КАК Период,
    ВТ_РасходПоНормеДовольствующиеся.Организация КАК Организация,
    ВТ_РасходПоНормеДовольствующиеся.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    МАКСИМУМ(ВТ_РасходПоНормеДовольствующиеся.КоличествоДовольствующихся) КАК КоличествоДовольствующихся,
    ВТ_РасходПоНормеДовольствующиеся.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_РасходПоНормеДовольствующиесяСгруппирован
ИЗ
    ВТ_РасходПоНормеДовольствующиеся КАК ВТ_РасходПоНормеДовольствующиеся

СГРУППИРОВАТЬ ПО
    ВТ_РасходПоНормеДовольствующиеся.Период,
    ВТ_РасходПоНормеДовольствующиеся.Организация,
    ВТ_РасходПоНормеДовольствующиеся.КатегорияДовольствующихся,
    ВТ_РасходПоНормеДовольствующиеся.Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МЕСЯЦ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.Период) КАК МесяцРасхода,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Организация КАК Организация,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    МАКСИМУМ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.КоличествоДовольствующихся) КАК КоличествоДовольствующихся,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_ГруппыДовольствующихсяПоМесяцу
ИЗ
    ВТ_РасходПоНормеДовольствующиесяСгруппирован КАК ВТ_РасходПоНормеДовольствующиесяСгруппирован

СГРУППИРОВАТЬ ПО
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.КатегорияДовольствующихся,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Регистратор,
    ВТ_РасходПоНормеДовольствующиесяСгруппирован.Организация,
    МЕСЯЦ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.Период)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода КАК МесяцРасхода,
    ВТ_ГруппыДовольствующихсяПоМесяцу.Организация КАК Организация,
    ВТ_ГруппыДовольствующихсяПоМесяцу.КатегорияДовольствующихся КАК КатегорияДовольствующихся,
    СУММА(ВТ_ГруппыДовольствующихсяПоМесяцу.КоличествоДовольствующихся) КАК КоличествоДовольствующихся
ИЗ
    ВТ_ГруппыДовольствующихсяПоМесяцу КАК ВТ_ГруппыДовольствующихсяПоМесяцу

СГРУППИРОВАТЬ ПО
    ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода,
    ВТ_ГруппыДовольствующихсяПоМесяцу.Организация,
    ВТ_ГруппыДовольствующихсяПоМесяцу.КатегорияДовольствующихся</query>
        <autoFillFields>false</autoFillFields>
        <useQueryGroupIfPossible>false</useQueryGroupIfPossible>
    </dataSet>
    <parameter>
        <name>НачалоПериода</name>
        <title xsi:type="v8:LocalStringType">
            <v8:item>
                <v8:lang>ru</v8:lang>
                <v8:content>Начало периода</v8:content>
            </v8:item>
        </title>
        <valueType>
            <v8:Type>xs:dateTime</v8:Type>
            <v8:DateQualifiers>
                <v8:DateFractions>DateTime</v8:DateFractions>
            </v8:DateQualifiers>
        </valueType>
        <value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
        <useRestriction>false</useRestriction>
    </parameter>
    <parameter>
        <name>КонецПериода</name>
        <title xsi:type="v8:LocalStringType">
            <v8:item>
                <v8:lang>ru</v8:lang>
                <v8:content>Конец периода</v8:content>
            </v8:item>
        </title>
        <valueType>
            <v8:Type>xs:dateTime</v8:Type>
            <v8:DateQualifiers>
                <v8:DateFractions>DateTime</v8:DateFractions>
            </v8:DateQualifiers>
        </valueType>
        <value xsi:type="xs:dateTime">0001-01-01T00:00:00</value>
        <useRestriction>false</useRestriction>
    </parameter>
    <settingsVariant>
        <dcsset:name>Основной</dcsset:name>
        <dcsset:presentation xsi:type="xs:string">Основной</dcsset:presentation>
        <dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style"; xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"; xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web"; xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows">;
            <dcsset:selection>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>ГруппаНормыРасхода</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>ДелительНормы</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>КатегорияДовольствующихся</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>Количество</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>КоличествоДовольствующихся</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>МесяцРасхода</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>Номенклатура</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>Организация</dcsset:field>
                </dcsset:item>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>ЭтоВзрослые</dcsset:field>
                </dcsset:item>
            </dcsset:selection>
            <dcsset:dataParameters>
                <dcscor:item xsi:type="dcsset:SettingsParameterValue">
                    <dcscor:parameter>НачалоПериода</dcscor:parameter>
                    <dcscor:value xsi:type="xs:dateTime">2020-07-31T00:00:00</dcscor:value>
                    <dcsset:userSettingID>e4c61d13-d518-4d9a-a7ac-f43c0a3f43c0</dcsset:userSettingID>
                </dcscor:item>
                <dcscor:item xsi:type="dcsset:SettingsParameterValue">
                    <dcscor:parameter>КонецПериода</dcscor:parameter>
                    <dcscor:value xsi:type="xs:dateTime">2020-07-31T23:59:59</dcscor:value>
                    <dcsset:userSettingID>ae7396c2-ddc5-4d9c-a3f9-403359694f24</dcsset:userSettingID>
                </dcscor:item>
            </dcsset:dataParameters>
            <dcsset:item xsi:type="dcsset:StructureItemGroup">
                <dcsset:order>
                    <dcsset:item xsi:type="dcsset:OrderItemAuto"/>
                </dcsset:order>
                <dcsset:selection>
                    <dcsset:item xsi:type="dcsset:SelectedItemAuto"/>
                </dcsset:selection>
            </dcsset:item>
        </dcsset:settings>
    </settingsVariant>
</dataCompositionSchema>
8 toypaul
 
гуру
07.09.20
14:52
вот у тебя в предпоследнем запросе есть поле Регистратор

которое 99% выкидывается в СКД

вчера уже обсуждали такую проблему. написали, что не нужно включать его в список ВЫБРАТЬ. или применить к ней функцию МИНИМУМ и все-таки выбрать в последней части запроса
9 toypaul
 
гуру
07.09.20
14:54
хм. здесь вроде запросы одинаковые. или я чего-то не вижу
10 toypaul
 
гуру
07.09.20
14:57
ну давай что ли теперь картинки. как в консоли запросов, а как в консоли СКД. это прям что-то новенькое когда одинаковые запросы дают разный результат
11 toypaul
 
гуру
07.09.20
15:01
и я чот не понял - зачем такой сложный запрос-то. его в 2 раза меньше можно сделать
12 Фантазер
 
07.09.20
15:19
(8) Поясни что значит не нужно включать?
(11) Проблема как раз и возникает в СКД - один и тот же запрос в консоли запросов и консоли СКД дает разный результат.
13 eTmy
 
07.09.20
15:36
(12) Скдшный оптимизатор запроса встревает)
14 toypaul
 
гуру
08.09.20
07:51
(13) текст запроса из (7) это и есть запрос после оптимизации. ничего в нем больше не должно меняться. что=то тут нечисто. или автор не умеет консолью пользоваться
15 Фантазер
 
08.09.20
09:05
(14) Прикладываю скины из Консоли запросов и Консоли СКД, результаты разные.
Что все таки надо подкрутить? От поля Регистратор отказаться? А что вместо него использовать? За один день могут быть несколько документов с одинаковой Категорией довольствующихся и количеством.
https://yadi.sk/i/QYJ1tQNvVAzZlg     - ЗапросИзКонсолиЗапросов
https://yadi.sk/i/aVBJJ2X5Zy6BmA     - ЗапросИзКонсолиСКД
16 eTmy
 
08.09.20
09:44
(15) В консоли компоновки данных, тебе нужно получить итоговый запрос измененный СКД... в Инструментах разработчика это делается кнопкой "Обновить макет компоновки и открыть его запросы в консоли запросов"... То что ты скинул это уже отредактированный запрос? или это просто текст запроса из конструктора скд, который ты скопировал из запроса и туда воткнул?
17 eTmy
 
08.09.20
10:06
(16) либо можешь отловить готовый текст запроса программно в событии ПриКомпоновкеРезультата модуля объекта
18 Фантазер
 
08.09.20
10:08
(16) Да, это текст запроса из Консоли Запросов, закинутый в Консоль СКД.
Я не вижу кнопку Обновить макет в обработке КонсольСистемыКомпоновкиДанных.
Или я не то использую или смотрю не туда.
19 eTmy
 
08.09.20
10:20
(18) Да ты используешь другую обработку, в ней к сожалению не подскажу... Но можно отловить программно измененный текст запроса... в модуле объекта отчета добавь следующий код:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.ПолучитьНастройки());
    НаборДанных = МакетКомпоновки.НаборыДанных.Получить(0);    
КонецПроцедуры

И отладчиком в наборе данных сможешь посмотреть измененный текст запроса.
20 Фантазер
 
08.09.20
11:30
(19) В отладчике точка останова не срабатывает. Как ее отловить то?
База файловая, не сервер, точки по тексту других модулей стопорятся нормально
21 TormozIT
 
гуру
08.09.20
11:58
(18) В консоли компоновки ИР это делается так https://youtu.be/-NJJP79TccI?t=503
22 eTmy
 
08.09.20
12:03
(20) Просто при нажатии стандартной кнопки сформировать отчет, туда попадает отладчиком. Создал точно в модуле ОБЪЕКТА ОТЧЕТА, а не формы?
23 Фантазер
 
08.09.20
13:32
(22) Да, точно в модуле объекта (в форме он ругается что не знает что такое Компоновщик :) ).
Про добавлении строчки "СтандартнаяОбработка = Ложь;" отчет не выполняется - что правильно, но на точку останова не реагирует.
24 Фантазер
 
08.09.20
15:30
(23) Выгрузил отчет как внешний - стала точка останова работать. ТОлько я не пойму - как запрос вернуть в исходную форму? Если я программно подставляю текст запроса на свой - все равно СКД его корявит.
25 eTmy
 
08.09.20
15:52
(24) Это так оптимизирует СКД, нужно правильно строить запросы изначально... 99% что решение из (8) поможет... Попробуйте добавить регистратор в группировку в последнем запросе, но не включать в выборку
26 Фантазер
 
08.09.20
16:18
(25) У меня там куча Виртуальных таблиц. Как можно не включать в выборку, но добавить в группировке?
Если я убираю Регистратор в первом запросе, он пропадает и для остальных.
27 eTmy
 
08.09.20
16:23
(26) Причем тут первый запрос? Вам в последнем пакете, нужно сгруппировать по регистратору, но просто не включать его туда в выборку
28 LoneWanderer
 
08.09.20
17:08
(26) Решение из (5) непонятное или по какой-то другой причине не подошло?
Или просто решение не нужно, а нужны рецепты как правильно стучать в бубен?

P.S. Причина большинства подобных проблем обычно в том что генерация запроса для набора данных (то что местные "специалисты" называют "оптимизацией" СКД) сопоставляет поля только по имени, почти не глядя на структуру запроса. Т.е. если, например, в каждом запросе пакета есть поле Организация и на него наложен отбора - отбор будет применён ко всем запросам пакета. В т.ч. и в параметры виртуальных таблиц. Рекомендация в (5) делает все поля из всех запросов пакета, кроме последнего, недоступными для отбора (при этом если они будут не задействованы -  то всё равно удалятся, на удаление из запросов пакета разметка через {} не действует).
P.P.S. Ещё может стоит-таки расшифровать что понимается под "неверно работает группировка в обной из таблиц.". Может проблема вообще не в запросе...
29 eTmy
 
08.09.20
17:58
30 Фантазер
 
08.09.20
18:54
(28) Честно, я не понял как пользоваться скобочками. Видно придется мне подучиться хитростям СКД.
(29) Ваша статья натолкнула меня на эксперименты с запросом и - о чудо, - всё заработало.
Спасибо огромное всем.
31 LoneWanderer
 
08.09.20
19:52
(29) По ссылке "много буков не осилил".
Но судя по заголовку это какое-то очередное народное творчество, типа "оптимизации запроса" - нет способа запретить компоновщику макета "изменять" запрос.
Он ведь его генерирует.
Наверное если очень напрячься, можно существенно приблизиться к этому "запретить".
Но зачем?
Может лучше разобраться как нормально пользоваться инструментом, а не пытаться выровнять все углы под привычные 90 градусов?
32 toypaul
 
гуру
09.09.20
08:06
способ запретить изменять есть. причем железобетонный.
33 eTmy
 
09.09.20
09:08
(31) Ну тогда советую Вам разобраться все таки в инструменте, а не "много буков не осилил")