Имя: Пароль:
1C
 
Некорректная работа оператора НЕ В ()
0 rewritello
 
01.09.25
13:45
ВЫБРАТЬ
ВТ_ФильтрСубконто.Ссылка КАК Ссылка,
ВТ_ФильтрСубконто.СуммаБезНДС КАК СуммаБезНДС,
ВТ_ФильтрСубконто.СубконтоБУ КАК СубконтоБУ,
ВТ_ФильтрСубконто.Номенклатура КАК Номенклатура,
ВТ_ФильтрСубконто.Склад КАК Склад,
ВТ_ФильтрСубконто.ДоговорКонтрагентаРегистрационныйНомер КАК ДоговорКонтрагентаРегистрационныйНомер,
ВТ_ФильтрСубконто.СуммаВсего КАК СуммаВсего,
ВТ_ФильтрСубконто.СчетКт КАК СчетКт,
ВТ_ФильтрСубконто.НаименованиеБДПГН КАК НаименованиеБДПГН,
ИЗ
ВТ_ФильтрСубконто КАК ВТ_ФильтрСубконто
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеБДПГНиНомГрупп КАК СоответствиеБДПГНиНомГрупп
по ВТ_ФильтрСубконто.НаименованиеБДПГН = СоответствиеБДПГНиНомГрупп.НаименованиеБДПГН
И СоответствиеБДПГНиНомГрупп.Фильтр = "Подразделение в договоре"
И НЕ ПОДСТРОКА(ВТ_ФильтрСубконто.ДоговорКонтрагентаРегистрационнныйНомер, 6, 3) В
(ВЫБРАТЬ СоответствиеБДПГНиНомГрупп.ЗначениеФильтра
ИЗ РегистрСведений.СоответствиеБДПГНиНомГрупп
ГДЕ СоответствиеБДПГНиНомГрупп.Фильтр = "Подразделение в договоре")
ГДЕ
   СоответствиеБДПГНиНомГрупп.НаименованиеБДПГН ЕСТЬ NULL
ИТОГИ ПО
НаименованиеБДПГН,
СубконтоБУ



Предоставил последний пакет запроса.

Регистр сведений - СоответствиеБДПГНиНомГрупп содержит 3 поля - "НаименованиеБДПГН", "Фильтр", "ЗначениеФильтра".
В регистре есть 3 записи со значениями:
1) НаименованиеБДПГН - "Услуги электроэнергии", Фильтр - "Подразделение в договоре", "ЗначениеФильтра" = "997"
2) НаименованиеБДПГН - "Услуги электроэнергии", Фильтр - "Подразделение в договоре", "ЗначениеФильтра" = "998"
3) НаименованиеБДПГН - "Услуги электроэнергии", Фильтр - "Подразделение в договоре", "ЗначениеФильтра" = "999"

Запросом я пытаюсь получить строки, подразделение в договоре которых содержит подразделения, указанные в РС (по сути условием НЕ В() и проверкой на есть null в секции ГДЕ должен получить строки входящие в фильтр "Подразделение в договоре" и строки, на которые не накладывалось фильтров).
В результате получаю строки, на которые не накладывалось фильтров, но не получаю строки, которые должны были отфильтроваться.
При выборке строк только с условием В() запрос отрабатывает корректно (то есть при выборке исключительно фильтруемых строк):
ВЫБРАТЬ
ВТ_ФильтрСубконто.Ссылка КАК Ссылка,
ВТ_ФильтрСубконто.СуммаБезНДС КАК СуммаБезНДС,
ВТ_ФильтрСубконто.СубконтоБУ КАК СубконтоБУ,
ВТ_ФильтрСубконто.Номенклатура КАК Номенклатура,
ВТ_ФильтрСубконто.Склад КАК Склад,
ВТ_ФильтрСубконто.ДоговорКонтрагентаРегистрационныйНомер КАК ДоговорКонтрагентаРегистрационныйНомер,
ВТ_ФильтрСубконто.СуммаВсего КАК СуммаВсего,
ВТ_ФильтрСубконто.СчетКт КАК СчетКт,
ВТ_ФильтрСубконто.НаименованиеБДПГН КАК НаименованиеБДПГН,
ИЗ
ВТ_ФильтрСубконто КАК ВТ_ФильтрСубконто
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеБДПГНиНомГрупп КАК СоответствиеБДПГНиНомГрупп
по ВТ_ФильтрСубконто.НаименованиеБДПГН = СоответствиеБДПГНиНомГрупп.НаименованиеБДПГН
И СоответствиеБДПГНиНомГрупп.Фильтр = "Подразделение в договоре"
И ПОДСТРОКА(ВТ_ФильтрСубконто.ДоговорКонтрагентаРегистрационнныйНомер, 6, 3) В
(ВЫБРАТЬ СоответствиеБДПГНиНомГрупп.ЗначениеФильтра
ИЗ РегистрСведений.СоответствиеБДПГНиНомГрупп
ГДЕ СоответствиеБДПГНиНомГрупп.Фильтр = "Подразделение в договоре")

ИТОГИ ПО
НаименованиеБДПГН,
СубконтоБУ


почему так отрабатывает НЕ В()?
1 Garykom
 
гуру
01.09.25
13:46
Какая жопа

Зачем тебе подзапрос?
Сделай еще ВТ и соедини с ней
2 Garykom
 
гуру
01.09.25
13:49
А еще лучше тупо передай параметром в запрос
3 maxab72
 
01.09.25
13:49
ЛЕВОЕ СОЕДИНЕНИЕ выдаст все, что в первой таблице, и что найдет во второй, как ее ни фильтруй.
4 vicof
 
01.09.25
13:51
Структура регистров - единица.
Текст запроса и наименования - единица.
Форматирование - единица, дальше смотреть неинтересно.
5 rewritello
 
01.09.25
13:53
в этом случае какая разница подзапрос или вт, если мне все равно придется писать подзапрос? мне нужно соединение если подразделение в договоре НЕ В (список подразделений) (1)
6 Garykom
 
гуру
01.09.25
13:57
(3) Не совсем
Еще если во второй таблице записей больше подходящих то будет дублирование строк из первой таблицы
7 H A D G E H O G s
 
01.09.25
13:58
Тебе пою свои я песни.
Я ноты подобрал на слух,
Кровь по твоим плечам стекает...
Из ух.
8 Garykom
 
гуру
01.09.25
14:02
(5) Потому что коррелированный подзапрос это жопа
У тебя вроде нет, но лучше так не делать, сильно от СУБД зависит

Главное, что подзапросы хреново читаются, как и дорабатываются
В твоем случае лучше обойтись банальным параметром (массив или список)

Ну и обрати внимание на (3)
9 rewritello
 
01.09.25
15:27
(8) Да, проблема решилась с помощью использования подзапроса из ВТ или параметра, спасибо
10 Маленький Вопросик
 
01.09.25
16:40
Обожаю таких мастеров, соединяющих выборки запросов соединениями напрямую)))

Потом неделя пройдет - сам не может разобраться)))
Ошибка? Это не ошибка, это системная функция.