Помогите с запросом к базе

1. b-dm 171 10.10.18 11:25 Сейчас в теме
Подскажите по запросу плиз:

Нужно чтобы из регистра накопления Продажи попали все строки по документам "Реализация товаров и услуг" с условием отбора "ОтгрузкаБезПерехода = НЕТ" и
"Возврат товаров от покупателя".

Запрос привожу ниже: 



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

СГРУППИРОВАТЬ ПО
                Продажи.Период,
                Продажи.Регистратор,
                Продажи.ЗаказПокупателя,
                Продажи.ДоговорКонтрагента,
                Продажи.Проект,
                Продажи.Контрагент,
                "ИНН_" + Продажи.Контрагент.ИНН
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. aurum2010 10.10.18 11:29 Сейчас в теме
ГДЕ Регистратор ссылка Документ.РеализацияТоваровУслуг .....
3. b-dm 171 10.10.18 11:32 Сейчас в теме
А как же "возврат товаров от покупателя"..нужно чтобы попали два вида документов регистраторов
4. jan27 733 10.10.18 11:48 Сейчас в теме
(3)а почему нельзя использовать Продажи.Обороты?
7. vadim1011985 99 10.10.18 11:56 Сейчас в теме
(3) через ИЛИ добавить второе условие на подобии первого
8. jan27 733 10.10.18 11:57 Сейчас в теме
(7) или хуже отрабатывает рекомендуется объединение
5. b-dm 171 10.10.18 11:52 Сейчас в теме
А конкретнее?) Даже если использую их то как получить то что хочу?)
6. jan27 733 10.10.18 11:56 Сейчас в теме
(5) если использовать обороты, то можно указать хотя бы интервал выборки, а не шерстить весь регистр
Далее ставим условие по первому типу документа и через объединить по второму, единственное указать периодичность регистратор
9. jan27 733 10.10.18 12:21 Сейчас в теме
ВЫБРАТЬ
Выразить(ПродажиОбороты.Регистратор как (Документ.РеализацияТоваровУслуг)) КАК регистратор

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
Выразить(ПродажиОбороты.Регистратор как (Документ.ВозвратТоваровПокупателем))
10. b-dm 171 10.10.18 12:33 Сейчас в теме
(9)
ВЫБРАТЬ
Выразить(ПродажиОбороты.Регистратор как (Документ.РеализацияТоваровУслуг)) КАК регистратор

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
Выразить(ПродажиОбороты.Регистратор как (Документ.ВозвраТоваровПокупателем))



Спасибо, а можно подробнее как будет выглядеть полный текст запроса ? не догоняю чтото...
11. mudrak 10.10.18 12:50 Сейчас в теме
(10) Да напишите уже с ИЛИ, пусть медленнее.
И (ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).ОтгрузкаБезПерехода = &ОтгрузкаБезПерехода_ОТБОР 
ИЛИ  Регистратор ссылка Документ.ВозвратТоваровОтПокупателя)
21. bmk74 234 10.10.18 14:21 Сейчас в теме
Ну вобщем то вот
ВЫБРАТЬ
	ЗаказыКлиентов.Регистратор КАК Регистратор,
	ЗаказыКлиентов.Период КАК Период
ИЗ
	РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
ГДЕ
	ЗаказыКлиентов.Период МЕЖДУ &ДатаНач И &ДатаКон
	И ТИПЗНАЧЕНИЯ(ЗаказыКлиентов.Регистратор) = ТИП(Документ.ЗаказКлиента)
	
exec sp_executesql N'SEL ECT
T1._RecorderTRef,
T1._RecorderRRef,
T1._Period
FR OM dbo._AccumRg51608 T1
WHERE ((T1._Fld1961 = @P1)) AND (((T1._Period >= @P2) AND (T1._Period <= @P3)) AND (T1._RecorderTRef = 0x000002D8))',N'@P1 numeric(10),@P2 datetime2(3),@P3 datetime2(3)',0,'4018-06-01 00:00:00','4018-06-10 00:00:00'
Показать


И ваш запрос

ВЫБРАТЬ
	ЗаказыКлиентов.Регистратор КАК Регистратор,
	ЗаказыКлиентов.Период КАК Период
ИЗ
	РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
ГДЕ
	ЗаказыКлиентов.Период МЕЖДУ &ДатаНач И &ДатаКон
	И НЕ ВЫРАЗИТЬ(ЗаказыКлиентов.Регистратор КАК Документ.ЗаказКлиента ) ЕСТЬ NULL
	
exec sp_executesql N'SELECT
T1._RecorderTRef,
T1._RecorderRRef,
T1._Period
FR OM dbo._AccumRg51608 T1
WH ERE ((T1._Fld1961 = @P1)) AND (((T1._Period >= @P2) AND (T1._Period <= @P3)) AND (NOT (((CASE WHEN T1._RecorderTRef = 0x000002D8 THEN T1._RecorderRRef END) IS NULL))))',N'@P1 numeric(10),@P2 datetime2(3),@P3 datetime2(3)',0,'2001-01-01 00:00:00','2001-01-01 00:00:00'
Показать


Т.е в вашем случае видно что идет лишнее приведение типов и он менее оптимизированный
22. jan27 733 10.10.18 14:23 Сейчас в теме
(21) попробуй обратиться к регистратору, выведи регистратор.дата
23. jan27 733 10.10.18 14:24 Сейчас в теме
(21) и обрати внимание на время выполнения
26. bmk74 234 10.10.18 14:57 Сейчас в теме
(23)Вывел :) Мой запрос 0,031
Ваш 0,110
Это в консоли, условия одинаковые :) Количество записей одинаковое
Просто я ни разу не видел в коде в стандартных конфах такого условия, поэтому и удивился...подумал может и правда так быстрее
27. jan27 733 10.10.18 15:00 Сейчас в теме
(26) а можно посмотреть запросы в скл.... просто вы вроде к документам то особо и не обращались, да и выразить только в конце в условии
28. bmk74 234 10.10.18 15:42 Сейчас в теме
(27)
просто вы вроде к документам то особо и не обращались, да и выразить только в конце

В скуле уже не покажу, лезть в профайлер уже не хочется, закрыл его...
а сам запрос в 1С вот просто добавил вывод регистратор.Дата.
ВЫБРАТЬ
	ЗаказыКлиентов.Регистратор КАК Регистратор,
	ЗаказыКлиентов.Период КАК Период,
		ЗаказыКлиентов.Регистратор.Дата
Поместить ВТ_Заказы

ИЗ
	РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
ГДЕ
	ЗаказыКлиентов.Период МЕЖДУ &ДатаНач И &ДатаКон
	И ТИПЗНАЧЕНИЯ(ЗаказыКлиентов.Регистратор) = ТИП(Документ.ЗаказКлиента)
Показать
29. jan27 733 10.10.18 15:52 Сейчас в теме
(28) вот в профайлере то самое интересное
30. jan27 733 10.10.18 15:56 Сейчас в теме
(28) возможно ты и прав, если не трудно посмотри, отсекает условие по типу значения другие документы
24. jan27 733 10.10.18 14:27 Сейчас в теме
(21) вообще то это рекомендации 1С, а не мои)))
12. jan27 733 10.10.18 12:53 Сейчас в теме
ВЫБРАТЬ
	ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ) КАК Регистратор,
	Регистратор.Дата КАК Дата
ИЗ
	РегистрНакопления.Продажи.Обороты(&дата1, &дата2, Регистратор, ) КАК ПродажиОбороты
ГДЕ
	ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ) ЕСТЬ НЕ NULL

ОБЪЕДИНИТЬ ВСЕ
	
ВЫБРАТЬ
	ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ОтчетОРозничныхПродажах),
	Регистратор.Дата
ИЗ
	РегистрНакопления.Продажи.Обороты(&дата1, &дата2, Регистратор, ) КАК ПродажиОбороты
ГДЕ
	ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ОтчетОРозничныхПродажах) ЕСТЬ НЕ NULL

Показать




только названия документов и реквизиты свои
13. bmk74 234 10.10.18 13:15 Сейчас в теме
(12)Интересное решение, первый раз такое вижу
А чем вас ТИПЗНАЧЕНИЯ() ИЛИ ССЫЛКА не устраивает? Как то по мне это быстрее отработает чем преобразование к типу ...
14. jan27 733 10.10.18 13:21 Сейчас в теме
(13) по моим данным это позволяет убрать лишние таблицы из соединения с полем составного типа данных, тем самым ускоряет выполнение запроса.
15. jan27 733 10.10.18 13:31 Сейчас в теме
(13) тип значения мы можем проверить только в условии, а здесь мы сразу отсекаем что не нужно
16. bmk74 234 10.10.18 13:40 Сейчас в теме
(15)
Я так понимаю абсолютно равнозначно в плане условия...чем ваше условие лучше ?

ГДЕ
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ) ЕСТЬ НЕ NULL


ГДЕ
    ТИПЗНАЧЕНИЯ(ПродажиОбороты.Регистратор) = ТИП(Документ.ЧекККМ)


Или
ГДЕ
    ПродажиОбороты.Регистратор ССЫЛКА Документ.ЧекККМ

Последнее может правда выдать ошибку, поэтому обычно пользуюсь ТИПЗНАЧЕНИЯ()
17. jan27 733 10.10.18 13:44 Сейчас в теме
(16) не совсем так... в вашем случае 1с транслирует запрос со связью ко всем таблицам (документам) в моем случае мы просто отсекаем NULL
18. jan27 733 10.10.18 13:45 Сейчас в теме
(16) в высоко нагруженных базах рекомендуется использовать именно выразить
19. bmk74 234 10.10.18 13:51 Сейчас в теме
(18)Хм надо проверить, хотя я всегда считал если в 1С поле составного типа то в SQL это будет два поля, а то и более если там не только ссылочные данные так вот второе поле как раз и определяет тип данных ( там циферки ) и по идее
ГДЕ
    ТИПЗНАЧЕНИЯ(ПродажиОбороты.Регистратор) = ТИП(Документ.ЧекККМ) 
условие как раз должно накладываться на вот это второе поле...
Хотя возможно я и не прав, давно это дело уже смотрел...
20. jan27 733 10.10.18 13:55 Сейчас в теме
(19) посмотри например в СКЛ во что превращается запрос.... насколько я помню так левое соединение к каждому документу, который входит в составной тип..... если мы ограничим тип одним документом через выразить, этих соединений будет меньше.... соответственно......
25. jan27 733 10.10.18 14:42 Сейчас в теме
да скорее всего должно быть даже так:

ВЫБРАТЬ
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ) КАК Регистратор,
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ).Дата КАК Дата
ИЗ
    РегистрНакопления.Продажи.Обороты(&дата1, &дата2, Регистратор, ) КАК ПродажиОбороты
ГДЕ
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ) ЕСТЬ НЕ NULL

ОБЪЕДИНИТЬ ВСЕ
    
ВЫБРАТЬ
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ОтчетОРозничныхПродажах),
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ОтчетОРозничныхПродажах).Дата
ИЗ
    РегистрНакопления.Продажи.Обороты(&дата1, &дата2, Регистратор, ) КАК ПродажиОбороты
ГДЕ
    ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ОтчетОРозничныхПродажах) ЕСТЬ НЕ NULL
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот