Имя: Пароль:
1C
1C 7.7
v7: Условие в запросе через 2 точки
0 Franchiser
 
гуру
08.05.18
10:06
Есть универсальный отчёт по регистру (доработанный), заметил странное поведение запроса. В случае когда ставится условие, например, на реквизит измерения регистра, то если это измерение идёт в группировке первым по счету то результат корректный, если же последним то результат пустой. Профайлер показывает, что условие через 2 точки вообще не идёт в SQL, т.е. видимо обрабатывается bkend.dll. установлен sql2008.
1 Ёпрст
 
08.05.18
10:09
За 2 точки в условии, нужно пиз..ить металлической линейкой по пальчикам
2 Ёпрст
 
08.05.18
10:10
Ну и в профайлере, наглядно видно, во что ЭТО превращается и почему этого не надо делать, никогда.
3 Franchiser
 
гуру
08.05.18
10:55
Да я бы сделал без 2 точек, но тогда теряется вся универсальность : запрос динамический с итогами, иначе нужно делать свою функцию.
4 Franchiser
 
гуру
08.05.18
11:00
Можно ли сделать динамическую функцию: то есть например в условии я генерирую название функции в зависимости от выбранного реквизита с передачей в нее родительского элемента в условии и далее эту функцию как-то создать в коде с применением выполнить().
5 Ёпрст
 
08.05.18
11:17
(3) какая разница, как формируется текст запроса ?
Создавай отдельную переменную, её и пихай в условие. Всё.
6 Franchiser
 
гуру
08.05.18
11:51
(5) не понял идею, какую переменную? Я думал сделать функцию туда передавать параметры: имя реквизита условия, родительский объект, тип условия, значения условия.

Сейчас пример динамического запроса выглядит так:
КК = Регистр.Отгрузка.КК ;
ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо;
Контрагент = Регистр.Отгрузка.Контрагент;
пзНДС = Регистр.Отгрузка.НДС;
пзВсего = Регистр.Отгрузка.Всего;
КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы;
Группировка КК Без Групп;
Группировка ЮридическоеЛицо Без Групп;
Группировка Контрагент Без Групп;
Функция СуммаНДС = Сумма(пзНДС);
Функция СуммаВсего = Сумма(пзВсего);
Условие (КК =   гУсл1);
Условие (ЮридическоеЛицо =   гУсл2);
Условие (СокрЛП(КонтрагентКодСистемы) >=   СокрЛП(гУсл3));
Условие (СокрЛП(КонтрагентКодСистемы) <    СокрЛП(гУсл4));
7 Ёпрст
 
08.05.18
12:59
(6)

такую:

|Переменная = Регистр.Отгрузка.Измерение.Реквизит.Реквизит.Реквизит....Реквизит;

|Условие Переменная = Вася;
8 serpentt
 
08.05.18
13:11
(4) Это?

|Функция СчетчикСумм  = Сумма(СчитаемЦену(Номенклатура,Количество,ДатаДокум));
9 Franchiser
 
гуру
08.05.18
16:05
(7) у меня такая переменная и прописана. Проблема в том что в регистре 3 измерения с типом справочника контрагенты и похоже из-за этого запрос глючит: реквизиты берутся из первой группировки с типом справочника Контрагенты.
10 Franchiser
 
гуру
09.05.18
00:33
Убрал из условия СокрЛП(), теперь все условия попадают в профайлер.
Но проблема осталась: условие упорно ставится на реквизит из первой группировки типа Справочник Контрагенты вместо нужной.
Кто нибудь встречался с такой проблемой: в регистре 3 измерения одинакового типа, но при интерпретации запроса 1с 7.7 в sql условие не устанавливается на реквизиты нужной группировки?
11 Злопчинский
 
09.05.18
05:52
Я как-то в меру своей няшности думаю что условие ставится не на группировку, а на переменную запроса. А то что получилось в результате - уже группируется (суммируется).
12 Злопчинский
 
09.05.18
05:55
..а вот от порядка Условий - стопудово результат будет зависеть имхо.

это как применение двух условий даст разный результат

1.
Условие(ПокраситьЗаборБелым)
Условие(ПокраситьЗаборЧерным)
Результат -> Черный забор

2.
Условие(ПокраситьЗаборЧерным)
Условие(ПокраситьЗаборБелым)
Результат -> Белый забор
13 Злопчинский
 
09.05.18
05:57
.. и посмотреть - при изменении порядка условий - в профайлере код запроса как меняется?
14 Злопчинский
 
09.05.18
05:57
..а может я и не прав со своими измышлениями...
ждем Епрста
15 Chameleon1980
 
09.05.18
06:49
(14) ИМХО - не прав.
забор - неудачный пример.
может поесть и попить, например

и наелся и напился
оба условия выполнены

:)

С праздником всех !!!
16 Адинэснег
 
09.05.18
07:03
(0) а в сырой восьмерке посаны не парятся
1. пакет + ВНУТРЕННЕЕ
2. В()
3. ИМЕЮЩИЕ
17 Franchiser
 
гуру
09.05.18
10:20
Запрос 1с 7.7:
Период с ФормДатаНач по ФормДатаКон;
ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо;
Контрагент = Регистр.Отгрузка.Контрагент;
пзКоличество = Регистр.Отгрузка.Количество;
пзНДС = Регистр.Отгрузка.НДС;
пзВсего = Регистр.Отгрузка.Всего;
Комитент = Регистр.Отгрузка.Комитент;
КомитентСимвольныйКод = Регистр.Отгрузка.Комитент.СимвольныйКод;
КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы;
Группировка ЮридическоеЛицо Без Групп;
Группировка Контрагент Без Групп;
Функция СуммаКоличество = Сумма(пзКоличество);
Функция СуммаНДС = Сумма(пзНДС);
Функция СуммаВсего = Сумма(пзВсего);
Условие (Комитент =   гУсл1);
Условие (ЮридическоеЛицо =   гУсл2);
Условие (КомитентСимвольныйКод =    гУсл3);
Условие (КонтрагентКодСистемы >    гУсл4);


Профайлер (обрабатывает вместо кода системы контрагента код системы из Юр. Лица):

select  max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1162,

max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1274,

sum(RA1159.SP1166 ),sum(RA1159.SP1168 ),sum(RA1159.SP1167 ),

min(RA1159.SP1166 ), min(RA1159.SP1168 ), min(RA1159.SP1167 ),

min(RA1159.SP1161 ), min(SC74_1.SP103 )

from  _1SJOURN(NOLOCK) left outer join RA1159(NOLOCK) on _1SJOURN.IDDOC=RA1159.IDDOC left outer join SC74(NOLOCK) on RA1159.SP1162=SC74.ID left outer join SC74 SC74_1(NOLOCK) on RA1159.SP1274=SC74_1.ID left outer join SC74 SC74_2(NOLOCK) on RA1159.SP1274=SC74_2.ID

where _1SJOURN.RF1159 = 1 and _1SJOURN.DATE_TIME_IDDOC >= '20170130     0     0   ' and _1SJOURN.DATE_TIME_IDDOC < '20170131     0     0   '

and _1SJOURN.CLOSED&1 = 1 and (((RA1159.SP1161 ='     B   ')) and ((RA1159.SP1162 ='     V   '))

and ((SC74.SP103 >'1                        ')))

group by RA1159.SP1162,RA1159.SP1274
18 Franchiser
 
гуру
09.05.18
10:25
Запрос 1с 7.7
Период с ФормДатаНач по ФормДатаКон;
Контрагент = Регистр.Отгрузка.Контрагент;
ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо;
пзКоличество = Регистр.Отгрузка.Количество;
пзНДС = Регистр.Отгрузка.НДС;
пзВсего = Регистр.Отгрузка.Всего;
Комитент = Регистр.Отгрузка.Комитент;
КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы;
Группировка Контрагент Без Групп;
Группировка ЮридическоеЛицо Без Групп;
Функция СуммаКоличество = Сумма(пзКоличество);
Функция СуммаНДС = Сумма(пзНДС);
Функция СуммаВсего = Сумма(пзВсего);
Условие (Комитент =   гУсл1);
Условие (ЮридическоеЛицо =   гУсл2);
Условие (КонтрагентКодСистемы >    гУсл3);



Профайлер (тут условие отрабатывает корректно):
select  max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1274,

max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1162,sum(RA1159.SP1166 ),

sum(RA1159.SP1168 ),sum(RA1159.SP1167 ), min(RA1159.SP1166 ), min(RA1159.SP1168 ),

min(RA1159.SP1167 ), min(RA1159.SP1161 ), min(SC74_3.SP103 )

from  _1SJOURN(NOLOCK) left outer join RA1159(NOLOCK) on _1SJOURN.IDDOC=RA1159.IDDOC

left outer join SC74(NOLOCK) on RA1159.SP1274=SC74.ID

left outer join SC74 SC74_3(NOLOCK) on RA1159.SP1274=SC74_3.ID

left outer join SC74 SC74_4(NOLOCK) on RA1159.SP1274=SC74_4.ID

where _1SJOURN.RF1159 = 1 and _1SJOURN.DATE_TIME_IDDOC >= '20170130     0     0   '

and _1SJOURN.DATE_TIME_IDDOC < '20170131     0     0   '

and _1SJOURN.CLOSED&1 = 1 and (((RA1159.SP1161 ='     B   '))

and ((RA1159.SP1162 ='     V   ')) and ((SC74.SP103 >'1                        ')))

group by RA1159.SP1274,RA1159.SP1162
19 Franchiser
 
гуру
09.05.18
10:30
вообще реквизиты неправильно берутся для измерений: например, наименование берется также из первой группировки, хотя в отчете оно и не используется.
20 Franchiser
 
гуру
09.05.18
10:35
обратите внимание на связь RA1159.SP1274=SC74...
Она во многих местах одинаковая
21 Franchiser
 
гуру
09.05.18
10:45
Неправильно запросы указал:
Запрос 1
Период с ФормДатаНач по ФормДатаКон;
ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо;
Контрагент = Регистр.Отгрузка.Контрагент;
пзКоличество = Регистр.Отгрузка.Количество;
пзНДС = Регистр.Отгрузка.НДС;
пзВсего = Регистр.Отгрузка.Всего;
КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы;
Группировка ЮридическоеЛицо Без Групп;
Группировка Контрагент Без Групп;
Функция СуммаКоличество = Сумма(пзКоличество);
Функция СуммаНДС = Сумма(пзНДС);
Функция СуммаВсего = Сумма(пзВсего);
Условие (ЮридическоеЛицо =   гусл1);
Условие (КонтрагентКодСистемы >    гусли);
22 Franchiser
 
гуру
09.05.18
10:47
хотя нет, все верно...
AdBlock убивает бесплатный контент. 1Сергей