|
Группировка в запросе отчета на СКД | ☑ | ||
---|---|---|---|---|
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>ВЫБРАТЬ РАЗРЕШЕННЫЕ РасходПродуктовПоНорме.Период КАК Период, РасходПродуктовПоНорме.Организация КАК Организация, РасходПродуктовПоНорме.КатегорияДовольствующихся КАК КатегорияДовольствующихся, МАКСИМУМ(РасходПродуктовПоНорме.КоличествоДовольствующихся) КАК КоличествоДовольствующихся, РасходПродуктовПоНорме.Регистратор КАК Регистратор ПОМЕСТИТЬ ВТ_РасходПоНормеДовольствующиеся ИЗ РегистрНакопления.РасходПродуктовПоНорме КАК РасходПродуктовПоНорме ГДЕ РасходПродуктовПоНорме.Период МЕЖДУ &НачалоПериода И &КонецПериода СГРУППИРОВАТЬ ПО РасходПродуктовПоНорме.Период, РасходПродуктовПоНорме.Организация, РасходПродуктовПоНорме.КатегорияДовольствующихся, РасходПродуктовПоНорме.Регистратор ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_РасходПоНормеДовольствующиеся.Период КАК Период, ВТ_РасходПоНормеДовольствующиеся.Организация КАК Организация, ВТ_РасходПоНормеДовольствующиеся.КатегорияДовольствующихся КАК КатегорияДовольствующихся, МАКСИМУМ(ВТ_РасходПоНормеДовольствующиеся.КоличествоДовольствующихся) КАК КоличествоДовольствующихся, ВТ_РасходПоНормеДовольствующиеся.Регистратор КАК Регистратор ПОМЕСТИТЬ ВТ_РасходПоНормеДовольствующиесяСгруппирован ИЗ ВТ_РасходПоНормеДовольствующиеся КАК ВТ_РасходПоНормеДовольствующиеся СГРУППИРОВАТЬ ПО ВТ_РасходПоНормеДовольствующиеся.Период, ВТ_РасходПоНормеДовольствующиеся.Организация, ВТ_РасходПоНормеДовольствующиеся.КатегорияДовольствующихся, ВТ_РасходПоНормеДовольствующиеся.Регистратор ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МЕСЯЦ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.Период) КАК МесяцРасхода, ВТ_РасходПоНормеДовольствующиесяСгруппирован.Организация КАК Организация, ВТ_РасходПоНормеДовольствующиесяСгруппирован.КатегорияДовольствующихся КАК КатегорияДовольствующихся, МАКСИМУМ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.КоличествоДовольствующихся) КАК КоличествоДовольствующихся, ВТ_РасходПоНормеДовольствующиесяСгруппирован.Регистратор КАК Регистратор ПОМЕСТИТЬ ВТ_ГруппыДовольствующихсяПоМесяцу ИЗ ВТ_РасходПоНормеДовольствующиесяСгруппирован КАК ВТ_РасходПоНормеДовольствующиесяСгруппирован СГРУППИРОВАТЬ ПО ВТ_РасходПоНормеДовольствующиесяСгруппирован.КатегорияДовольствующихся, ВТ_РасходПоНормеДовольствующиесяСгруппирован.Регистратор, ВТ_РасходПоНормеДовольствующиесяСгруппирован.Организация, МЕСЯЦ(ВТ_РасходПоНормеДовольствующиесяСгруппирован.Период) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода КАК МесяцРасхода, ВТ_ГруппыДовольствующихсяПоМесяцу.Организация КАК Организация, ВТ_ГруппыДовольствующихсяПоМесяцу.КатегорияДовольствующихся КАК КатегорияДовольствующихся, СУММА(ВТ_ГруппыДовольствующихсяПоМесяцу.КоличествоДовольствующихся) КАК КоличествоДовольствующихся ИЗ ВТ_ГруппыДовольствующихсяПоМесяцу КАК ВТ_ГруппыДовольствующихсяПоМесяцу СГРУППИРОВАТЬ ПО ВТ_ГруппыДовольствующихсяПоМесяцу.МесяцРасхода, ВТ_ГруппыДовольствующихсяПоМесяцу.Организация, ВТ_ГруппыДовольствующихсяПоМесяцу.КатегорияДовольствующихся</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
|
(28) Для "Специалистов" специально https://1c-bezproblem.ru/blog/v-pomoshch-1s-programmistu/zapretit-skd-izmenyat-zapros-skd-menyaet-zapros-skd-optimiziruet-itogovyj-zapros
|
|||
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) Ну тогда советую Вам разобраться все таки в инструменте, а не "много буков не осилил")
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |