IE 2018

1. b-dm 169 10.10.18 11:25 Сейчас в теме

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

Подскажите по запросу плиз:

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

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



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

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

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

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

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

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



Спасибо, а можно подробнее как будет выглядеть полный текст запроса ? не догоняю чтото...
11. mudrak 10.10.18 12:50 Сейчас в теме
(10) Да напишите уже с ИЛИ, пусть медленнее.
И (ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).ОтгрузкаБезПерехода = &ОтгрузкаБезПерехода_ОТБОР 
ИЛИ  Регистратор ссылка Документ.ВозвратТоваровОтПокупателя)
21. bmk74 77 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 671 10.10.18 14:23 Сейчас в теме
(21) попробуй обратиться к регистратору, выведи регистратор.дата
23. jan27 671 10.10.18 14:24 Сейчас в теме
(21) и обрати внимание на время выполнения
26. bmk74 77 10.10.18 14:57 Сейчас в теме
(23)Вывел :) Мой запрос 0,031
Ваш 0,110
Это в консоли, условия одинаковые :) Количество записей одинаковое
Просто я ни разу не видел в коде в стандартных конфах такого условия, поэтому и удивился...подумал может и правда так быстрее
27. jan27 671 10.10.18 15:00 Сейчас в теме
(26) а можно посмотреть запросы в скл.... просто вы вроде к документам то особо и не обращались, да и выразить только в конце в условии
28. bmk74 77 10.10.18 15:42 Сейчас в теме
(27)
просто вы вроде к документам то особо и не обращались, да и выразить только в конце

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

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

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

Показать




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

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


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


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

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

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

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

Вакансии

Программист 1С
Салехард
зарплата от 80 000 руб. до 200 000 руб.
Полный день

Программист 1С
Казань
Полный день

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Ведущий программист 1С
Екатеринбург
зарплата от 100 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 60 000 руб. до 110 000 руб.
Полный день