Имя: Пароль:
1C
1С v8
Не могу поставить условие в запросе
,
0 yalanton
 
07.06.17
09:51
Добрый день Помогите пожалуйста .  
Я хочу выбрать дебетовые обороты по счету 91,02(прочие расходы) за исключением сумм дебетовых оборотов которые  корреспондируют со счетом 68.02(Налог на добавленную стоимость) и при этом  
у которых Субконто1.ВидПрочихДоходовИРасходов=Прибыль(убыток) прошлых лет  (субконто1 это субконто счета 91.02 и оно имеет тип справочник "прочие доходы и расходы")  
ВЫБРАТЬ
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.Счет,
    ХозрасчетныйОбороты.СуммаОборотДт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты КАК ХозрасчетныйОбороты
ГДЕ
    (ХозрасчетныйОбороты.Счет = &счет9102
    И (ХозрасчетныйОбороты.Субконто1.ВидПрочихДоходовИРасходов <> &ПрибыльУбытокПрошлыхлет
    И ХозрасчетныйОбороты.КорСчет <> &корсчет6802))

а пока у меня запрос исключает все деб обор корреспондирующие с 68.02 не зависимо от ВидПрочихДоходовИРасходов
и все деб обороты по субконто1=  не зависимо от корреспондирующего счета  ,а я хочу чтоб только в случае одновременного выполнения 2-х условий исключались дебетовые обороты
1 Мимохожий Однако
 
07.06.17
09:54
Отбор в виртуальных таблицах рекомендуется делать в параметрах. Отладку запроса есть смысл делать с постепенным добавлением очередного условия.
2 Fram
 
07.06.17
09:56
(ХозрасчетныйОбороты.Субконто1.ВидПрочихДоходовИРасходов <> &ПрибыльУбытокПрошлыхлет
    ИЛИ ХозрасчетныйОбороты.КорСчет <> &корсчет6802)

но будет тупить при большом объеме данных
3 yalanton
 
07.06.17
09:58
думаешь "ИЛИ", а на "И" сейчас проверю
4 yalanton
 
07.06.17
10:03
О спасибо сработало -про отбор в вирт табл в параметрах я понял сейчас переделаю
5 Dmitrii
 
гуру
07.06.17
10:08
(2) Чтобы не тупило (имена таблиц и предопределенных элементов могу соврать):

НЕ (ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.ПрочиеДоходыИРасходы).ВидПрочихДоходовИРасходов = ЗНАЧЕНИЕ(Перечисление.ВидыПрочихДоходовИРасходов.ПрибыльУбытокПрошлыхлет) И ХозрасчетныйОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.НДС))

И добавить в параметры виртуальной таблицы условие на вид субконто.
6 cw014
 
07.06.17
10:10
ВЫБРАТЬ
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.Счет,
    ХозрасчетныйОбороты.СуммаОборотДт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(,Счет = &счет9102 И Субконто1.ВидПрочихДоходовИРасходов <> &ПрибыльУбытокПрошлыхлет И КорСчет <> &корсчет6802) КАК ХозрасчетныйОбороты
7 Fram
 
07.06.17
10:12
(5) имелось ввиду, что использование ИЛИ и <> заставляет движок сканировать таблицу, а не использовать индексы
8 Dmitrii
 
гуру
07.06.17
10:13
(6) Это неверно.
Он потеряет вообще ВСЕ обороты с видом ПрибыльУбытокПроошлыхЛет и ВСЕ обороты с КорСчетом = 68.02, а ему надо только где ОДНОВРЕМЕННО и ПрибыльУбытокПроошлыхЛет И КорСчет=68.02.
9 cw014
 
07.06.17
10:14
(8) Тогда через ИЛИ
10 cw014
 
07.06.17
10:15
ВЫБРАТЬ
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.Счет,
    ХозрасчетныйОбороты.СуммаОборотДт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(,Счет = &счет9102 И НЕ (Субконто1.ВидПрочихДоходовИРасходов = &ПрибыльУбытокПрошлыхлет И КорСчет = &корсчет6802)) КАК ХозрасчетныйОбороты
11 Dmitrii
 
гуру
07.06.17
10:19
(10) Не морочьте голову. Ну нужно это пихать в параметры виртуальной таблицы. С высокой долей вероятности производительность такого запроса упадёт на порядок по сравнения с размещением условий в "ГДЕ". Вполне достаточно отбора по Счет и (возможно) по виду субконто.

Рекомендация использовать параметры в ВТ является общей, но не нужно пихать её прям везде и всегда.
12 cw014
 
07.06.17
10:23
(11) Дело в том, что вынос параметров за виртуальную таблицу не всегда дает тот вариант, который ожидаешь. В моем случае в мое время в результате не выдавало вообще ничего
13 cw014
 
07.06.17
10:24
+(11) к (5) - ВЫРАЗИТЬ не сильно повлияет на производительность - проверено на БУХ 3.0 экспериментальным путем
14 yalanton
 
07.06.17
10:27
так надо мне теперь все это осмыслить
15 Fram
 
07.06.17
10:31
(13) теоретически выразить должно избавить от кучи соединений, а на практике черт его знает. надо в профайлер глядеть
16 Dmitrii
 
гуру
07.06.17
10:32
(12) На значительных объемах данных твой вариант (с условием на КорСчет и ВидПрочихДоходовИРасходов в параметрах ВТ) будет работать медленнее.
Причина в том, что эти условия будут накладываться на весь массив данных, который может быть весьма большим.
Поэтому гораздо дешевле будет получить небольшой объём данных (только обороты по счету 91.02 в параметрах ВТ) и уже там фильтровать по КорСчету и ВидПрочихДоходовИРасходов (в условии ГДЕ).
17 cw014
 
07.06.17
10:33
(16) Возможно, однако так же замечу, что не только выполнение запроса нагружает SQL но и формирование результата. То есть чем больше результат - тем дольше будет вывод
18 Dmitrii
 
гуру
07.06.17
10:34
(13) Зависит от конкретных условий. Использование ВЫРАЗИТЬ практически никогда не бывает лишним.
В отличии от запихивания всего что попало в параметры ВТ.
19 Dmitrii
 
гуру
07.06.17
10:35
(17) Вывод результата это уже другая история. К теме не имеющая никакого отношения, т.к. выводиться в ЛЮБОМ (что в твоём что в моём) случае будет одно и то же.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший