Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Условие в запросе через 2 точки

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

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

такую:

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

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

|Функция СчетчикСумм  = Сумма(СчитаемЦену(Номенклатура,Количество,ДатаДокум));
   Franchiser
 
9 - 08.05.18 - 16:05
(7) у меня такая переменная и прописана. Проблема в том что в регистре 3 измерения с типом справочника контрагенты и похоже из-за этого запрос глючит: реквизиты берутся из первой группировки с типом справочника Контрагенты.
   Franchiser
 
10 - 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
..а может я и не прав со своими измышлениями...
ждем Епрста
   Chameleon1980
 
15 - 09.05.18 - 06:49
(14) ИМХО - не прав.
забор - неудачный пример.
может поесть и попить, например

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

:)

С праздником всех !!!
   Адинэснег
 
16 - 09.05.18 - 07:03
(0) а в сырой восьмерке посаны не парятся
1. пакет + ВНУТРЕННЕЕ
2. В()
3. ИМЕЮЩИЕ
   Franchiser
 
17 - 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
   Franchiser
 
18 - 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
   Franchiser
 
19 - 09.05.18 - 10:30
вообще реквизиты неправильно берутся для измерений: например, наименование берется также из первой группировки, хотя в отчете оно и не используется.
   Franchiser
 
20 - 09.05.18 - 10:35
обратите внимание на связь RA1159.SP1274=SC74...
Она во многих местах одинаковая
   Franchiser
 
21 - 09.05.18 - 10:45
Неправильно запросы указал:
Запрос 1
Период с ФормДатаНач по ФормДатаКон;
ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо;
Контрагент = Регистр.Отгрузка.Контрагент;
пзКоличество = Регистр.Отгрузка.Количество;
пзНДС = Регистр.Отгрузка.НДС;
пзВсего = Регистр.Отгрузка.Всего;
КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы;
Группировка ЮридическоеЛицо Без Групп;
Группировка Контрагент Без Групп;
Функция СуммаКоличество = Сумма(пзКоличество);
Функция СуммаНДС = Сумма(пзНДС);
Функция СуммаВсего = Сумма(пзВсего);
Условие (ЮридическоеЛицо =   гусл1);
Условие (КонтрагентКодСистемы >    гусли);
   Franchiser
 
22 - 09.05.18 - 10:47
хотя нет, все верно...


Список тем форума
Рекламное место пустует  Рекламное место пустует
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует