Имя: Пароль:
1C
 
Условие НЕ В() в запросе не срабатывает. Как правильно сделать?
0 e053nk
 
26.02.21
09:28
Раньше с таким поведением условия в запросе не сталкивался, может просто не попадал на такое условие..
Исходные данные: платформа 8.2,УТ10.3 не свежая, но запрос строится по типовому регистру Продажи. Задача исключить из отчёта документы продажи контрагентам, которые указаны списком (массивом).Некоторые документы(например, ОРП) без реквизита Контрагент, т.е. поле запроса не однородное по типу.
Текст запроса (кусок который анализирую ):

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.Подразделение КАК Подразделение,
    ПродажиОбороты.Регистратор,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(
            &ДатаНачПродажи,
            &ДатаКонПродажи,
            Регистратор,
            Номенклатура = &ТоварРасшифровки И (ДокументПродажи.Контрагент НЕ В(&СписокИСключенияКонтрагентов))
                 {(Организация).* КАК Организация}) КАК ПродажиОбороты
//ГДЕ
//    ПродажиОбороты.Регистратор.Контрагент В(&СписокИСключенияКонтрагентов)

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.Подразделение,
    ПродажиОбороты.Регистратор
ИТОГИ ПО
    Номенклатура,
    Подразделение

В этом запросе в параметрах виртуальной таблицы условие ДокументПродажи.Контрагент НЕ В(&СписокИСключенияКонтрагентов) - не срабатывает. Запрос выкидывает пустой результат. Если убрать отрицание ДокументПродажи.Контрагент В(&СписокИСключенияКонтрагентов) -условие срабатывает, выходит только продажи по указанному списку контрагентов.
Пробовал привести к одному типу поле через "выразить(ДокументПродажи.Контрагент КАК Справочник.Контрагенты) "- ничего не изменяется.
Пробовал в условие ГДЕ установить-тоже не работает.
Как правильно указать условие на исключение документов по списку Контрагентов?
1 ViSo76
 
26.02.21
09:30
Пиши так НЕ [Поле] В (...)
2 Ненавижу 1С
 
гуру
26.02.21
09:36
СписокИСключенияКонтрагентов случайно не содержит NULL?
3 e053nk
 
26.02.21
09:37
(1) Так тоже не работает, это ж стандартно конструктор запроса выдает
4 e053nk
 
26.02.21
09:39
(2) Нет, не содержит. Проверял в отладчике-только список контрагентов
5 ViSo76
 
26.02.21
09:40
(3) в где встречал, что работает именно так, а не иначе.
Так как там соединение, попробуй вынести это за скобки в конструкцию где, скорее всего даже быстрее отрабатывать будет
6 e053nk
 
26.02.21
09:41
Попробовал указать:
НЕ (ЕстьNull(ДокументПродажи.Контрагент,Значение(Справочник.Контрагенты.ПустаяСсылка))в(&СписокИСключенияКонтрагентов) )

вообще ругается на несовместимость типов
7 e053nk
 
26.02.21
09:42
(5) Пробовал
ГДЕ
    ПродажиОбороты.Регистратор.Контрагент В(&СписокИСключенияКонтрагентов)
-тоже не работает.
8 e053nk
 
26.02.21
09:43
(7) Конечно же с НЕ вначале условия
9 AlvlSpb
 
26.02.21
09:51
(0) Потому что не каждый ДокументПродажи в регистре имеет поле Контрагент
10 ViSo76
 
26.02.21
09:51
(7) Почему у тебя в одном месте от регистратора в другом от документа продажи
Убери фильтрации другие, оставь только по контрагенту. И вообще попробуй убрать виртуальную Обороты, она тут только замедляет
11 ViSo76
 
26.02.21
09:53
(9) Не факт конечно, всё же регистр продажи, по идее поле должно быть везде, это же не движение по складу
12 AlvlSpb
 
26.02.21
09:53
(10) С чего это замедляет? А как по твоему получить обороты быстрее?
13 AlvlSpb
 
26.02.21
09:55
(11) Это скорей всего Розница. А там у регистраторов Отчет по розничным продажам и ЧекККМ нет поля Контрагент
14 ViSo76
 
26.02.21
09:56
(12) По физической таблице быстрее, чем виртуальная, скорее всего запрос конечный будет такой же но создание запроса медленее
15 ViSo76
 
26.02.21
09:57
(13) Написано УТ 10.3
16 Малыш Джон
 
26.02.21
10:01
(0) а ты уверен, что у тебя за указанный период по указанному товару есть данные по контрагентам не из списка исключения?
17 e053nk
 
26.02.21
10:01
В теме я указал,что есть документы у которых поля Контрагент нет. Это Отчет по розничным продажам (ОРП). И в регистре по ним поле Контрагент -пустое. Но как тогда указывать условие?
18 AlvlSpb
 
26.02.21
10:01
(15) Да, невнимательный. Тогда еще проще. Зачем ДокументПродажи.Контрагент если в регистре есть измерение Контрагент?
Раньше с таким поведением условия в запросе не сталкивался, может просто не попадал на такое условие..
Исходные данные: платформа 8.2,УТ10.3 не свежая, но запрос строится по типовому регистру Продажи. Задача исключить из отчёта документы продажи контрагентам, которые указаны списком (массивом).Некоторые документы(например, ОРП) без реквизита Контрагент, т.е. поле запроса не однородное по типу.
Текст запроса (кусок который анализирую ):


ИЗ
    РегистрНакопления.Продажи.Обороты(
            &ДатаНачПродажи,
            &ДатаКонПродажи,
            Регистратор,
            Номенклатура = &ТоварРасшифровки И НЕ Контрагент В(&СписокИСключенияКонтрагентов))
19 Малыш Джон
 
26.02.21
10:02
(9) если бы в запросе попался такой документ, то была бы ошибка выполенния. Но обращение к реквизиту составного поля - это конечно плохо.
20 Малыш Джон
 
26.02.21
10:05
(18) нихрена ты слова "используй отбор по измерению регистра, а не по реквизиту составного измерения" развернул...
21 e053nk
 
26.02.21
10:05
(19) Есть такие ситуации, но ошибку обращения не выдает -просто пустой результат запроса
22 AlvlSpb
 
26.02.21
10:07
(20) )))) Неудачно скопировал и не обратил внимания. Приношу извинение
23 Ботаник Гарден Меран
 
26.02.21
10:07
ГДЕ
    ВЫБОР
    КОГДА Продажи.Регистратор.Контрагент ЕСТЬ NULL ТОГДА ИСТИНА
    ИНАЧЕ НЕ Продажи.Регистратор.Контрагент В (&Контрагенты)
КОНЕЦ
24 AlvlSpb
 
26.02.21
10:08
(14) Не по теме, конечно. Но для меня это что-то новенькое
25 Малыш Джон
 
26.02.21
10:09
(23) кто ж вас такому учит-то, а?
26 VS-1976
 
26.02.21
10:14
(18) ИЗ
    РегистрНакопления.Продажи
ГДЕ
    Период МЕЖДУ &ДатаНачПродажи И &ДатаКонПродажи
    И Номенклатура = &ТоварРасшифровки
    И НЕ Контрагент В ( &СписокИСключенияКонтрагентов )

Должно работать
27 Малыш Джон
 
26.02.21
10:19
(14) хренасе новости... а пацаны то и не знают...
28 Ботаник Гарден Меран
 
26.02.21
10:20
(25)
Меня поздно учить. Автор так спросил.
А изображать капитана очевидность скучно.
29 VS-1976
 
26.02.21
10:22
(27) Ну так представь что быстрее раскрывать скобки или переносить как есть в запрос?
(26) Добавить ещё
{ГДЕ
    (Организация).* КАК Организация}
30 Малыш Джон
 
26.02.21
10:25
(29) раскрывать скобки? какие скобки? что переносить?
31 VS-1976
 
26.02.21
10:28
(30) Какой ты малыш, ты думаешь что в запросе базы данных есть виртуальные таблицы? Всё преобразуется к запросу в физическую таблицу. Так вот есть ещё парсер запроса это объект Запрос. Так вот ты не учитываешь время его работы, а если у тебя портянка, то само преобразование в запрос может быть не сильно быстрым
32 e053nk
 
26.02.21
10:30
Да ,условие

И не Контрагент в(&СписокИСключенияКонтрагентов)

отрабатывает нормально.

Осталось только проверить, что аналитика Контрагент и поле  ДокументПродажи.Контрагент -содержат одно и тоже значение по документу....При возвратах от покупателя пока не понятно ,как это поле заполняется.

В итоге, как я понимаю, конструкция условия  Не в(...) при наложение на поле  указанное через точку типа "ДокументПродажи.Контрагент" не работает?  Или тут  больше влияет наличие значения типа NULL в этом поле?
33 Малыш Джон
 
26.02.21
10:36
(31)  О_о
А у меня такой вопрос неожиданный... А тебе такие слова как например "таблица итогов оборотов", "таблица итогов остатков" знакомы?
"пересчет итогов" вот ещё...
34 Малыш Джон
 
26.02.21
10:48
(32) условие к ДокументПродажи.Контрагент работает (к сожалению), только такое условие подразумевает неявное левое соединение таблиц  всех документов, из ссылок на которые состоит это составное поле. Сколько там типов? штук пять-шесть? вот считай таким обращением ты сделал ещё пять-шесть соединений со своим запросом.

Ещё раз повторю вопрос: в регистре есть данные период по товару с контрагентами кроме тех, кто в списке исключений? А то может тупо данных нет таких, поэтому и результат запроса пустой?
35 VS-1976
 
26.02.21
10:59
(33) Конечно знакомы, и это всё делается не в базе, а на сервере 1С если что
36 e053nk
 
26.02.21
10:59
(34) Есть, но это ОРП в моем примере -поля в нем такого нет. И одна Расходная накладная  с контрагентом исключения. Сейчас ради эксперимента  исправил в этой накладной Контрагента на значение  не из списка исключения,перепровел. Условие "не ДокументПродажи.Контрагент в(&СписокИСключенияКонтрагентов) " показало только одну накладную. ОРП-выкинуло из отчета. Т.е. по пустому полю условие не отрабатывает получется
37 Малыш Джон
 
26.02.21
11:05
(35) >>это всё делается не в базе, а на сервере 1С

что "это"?
38 Kassern
 
26.02.21
11:07
(37) я вот тоже не понял)
39 VS-1976
 
26.02.21
11:14
(37) ИТОГИ ПО - это всё рассчитывается на сервере предприятия чего не понятно? Запрос отрабатывает в базе, далее програмно достраиваются данные, чего не понятно?
40 Малыш Джон
 
26.02.21
11:15
(39) что????
41 e053nk
 
26.02.21
11:21
Так,я  отъеду по делам пока к клиентам. Если есть что то добавить по по поводу Условия Не В() на составное поле -готов выслушать. Могу поэкспериментировать на своей базе с реальными данными. Пока не до конца понятно почему именно так себя ведет данная конструкция запроса.
42 Малыш Джон
 
26.02.21
11:21
(39) я аж от неожиданности Enter нажал..

причем тут ИТОГИ ПО?

я говорю о том, что обращение в запросе 1С к физической таблице оборотного регистра и обращение к виртуальной таблице оборотов этого же регистра - это две разные конструкции; эти конструкции преобразуются в две совершенно разные SQL-инструкции(и в данном случае совершенно неважно где именно это преобразование происходит); вторая инструкция(которая на основе обращения к таблице оборотов) работает более эффективно, потому что использует данные таблицы итогов оборотов(это отдельная таблица, она физически хранится в базе) рассчитанных по месяцам.
43 Kassern
 
26.02.21
11:27
(39) почитай на досуге, как это работает
http://catalog.mista.ru/1c/articles/1064528/
44 VS-1976
 
26.02.21
11:33
(42) Что вы тут мне зубы то заговариваете?
Где в запросе вы видите Остатки?
РегистрНакопления.Продажи.Обороты <- Укажите здесь где используются остатки?
45 VS-1976
 
26.02.21
11:36
(42) Остатки в оборотах не используются, по тому что вы вытаскиваете все движения за период, какие остатки???
46 dmpl
 
26.02.21
11:37
(44) Там детализация до регистратора вообще, вообще нет смысла.
47 VS-1976
 
26.02.21
11:38
(46) Там не важно, товарищи ещё бы сказали что остатки хранятся во всех разрезах, что бы фильтрация правильно работала... Парни жгите ещё!
48 VS-1976
 
26.02.21
11:41
(47) За каждую секунду времени, что бы можно было в пределах месяца отодрать мух от котлет
49 Kassern
 
26.02.21
11:44
(46) прочитай еще раз, что ты написал в (35). Ты утверждаешь на серьезных щах, что "таблица итогов оборотов", "таблица итогов остатков" делаются не в "базе" а на сервере 1с, что для тебя сервер 1с? Для меня это сервер на котором развернут кластер. Возможно на нем есть скуль с базой данных, но не обязательно. таблица итогов оборотов и остатков как раз таки хранится в базе данных
50 VS-1976
 
26.02.21
11:45
(49) Итоги я имел ввиду ИТОГИ ПО, а не остатки оборотного
51 Kassern
 
26.02.21
11:54
(50) вы пробовали сделать запрос и посмотреть его скуле с "итоги по" и без него. Запрос у вас одинаковый будет для скуля?
52 VS-1976
 
26.02.21
11:57
(51) Нет не делал, но читал про формирование итогов, там даже в строках записей таблице указывается тип строки, это итог или данные. Да вы сами подумайте ИТОГИ ПО нет в ANSI SQL совсем.
53 Малыш Джон
 
26.02.21
15:28
(44) (45) Что?? Какие ещё остатки??  Ты читать не умеешь?
54 Малыш Джон
 
26.02.21
15:29
(52) Епрст... Какие ИТОГИ ПО? Ты о чем вообще?
55 e053nk
 
26.02.21
16:50
Вообще всем спасибо за помощь -указанное условие отрабатывает нормально в полном запросе..
P.S. Что то в теме вопросы стали уже фундаментальные рассматривать..Очень интересно, но что то и не понятно до конца.
56 VS-1976
 
26.02.21
17:52
(53) В общем не знаю о чём ты, но походу ты чего-то путаешь с рассчитанными помесячно остатками/итогами при условии

РегистрНакопления.Продажи.Обороты(
            &ДатаНачПродажи,
            &ДатаКонПродажи,
            Регистратор,

А особенно к примеру ДокументПродажи.Контрагент В ( &СписокИСключенияКонтрагентов )

Я конечно в не смотрел как формируется запрос в профайлере, но на 99,99% уверен что обороты не используют ( рассчитанные остатки/итоги ), ты путаешь с .Остатки / .ОстаткиИОбороты, там да используются рассчитанные остатки/итоги
57 xXeNoNx
 
26.02.21
18:40
Вообще не В() использовать моветон
58 youalex
 
26.02.21
19:10
(0) В РегистрНакопления.Продажи - нет измерения Контрагент?
59 Малыш Джон
 
01.03.21
11:41
(56) выходные прошли

Вот, просветись, человек заморочился и проверил на практике то, о чем мы спорим:

http://catalog.mista.ru/1c/articles/1062572/

Цитата: "По схеме видно, что наиболее оптимальным образом платформа работает с виртуальной таблицей "Обороты" для регистра накопления с видом "Обороты", поскольку использует рассчитанные итоги по оборотам в разрезе месяцев."
60 Timon1405
 
01.03.21
14:00
(59) в таблице оборотов нет регистратора, и детализация ...обороты(,,Регистратор) как у ТС в запросе не даст использовать итоги в каком-либо виде.
61 Малыш Джон
 
01.03.21
14:49
(60) Ссылка?
62 ДенисЧ
 
01.03.21
14:50
(61) Ссылку на что ты хочешь? На то, что в итогах нет регистратора? О_о
63 Малыш Джон
 
01.03.21
14:51
(62) на утверждение из (60)
64 ДенисЧ
 
01.03.21
14:52
(63) На "в таблице оборотов нет регистратора" ?
65 Timon1405
 
01.03.21
14:52
(61) ПолучитьСтруктуруХраненияБазыДанных() - дальше рассказать что с этим делать или тоже ссылка нужна?
66 Малыш Джон
 
01.03.21
14:53
(65) расскажи, не стесняйся)
67 Timon1405
 
01.03.21
14:56
(66) думаю пытливый ум найдёт дальше информацию самостоятельно, вернётся просветлённым и расскажет нам о результатах)
68 Ёпрст
 
01.03.21
15:15
(0)

указывать вот так:

(Контрагент).* КАК Контрагент}

и в фильтре, в настройках отчета  уже выбирать что хочешь.
69 VS-1976
 
01.03.21
16:47
(63) Что тут непонятного? Если есть Регистратор, то берутся все движения за период и никакие рассчитанные итоги тут не прокатят, а вот если у тебя запрос, который звучит так:

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.Подразделение КАК Подразделение,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(
            &ДатаНачПродажи,
            &ДатаКонПродажи,
            ,
            Номенклатура = &ТоварРасшифровки И (ДокументПродажи.Контрагент НЕ В(&СписокИСключенияКонтрагентов))
                 {(Организация).* КАК Организация}) КАК ПродажиОбороты

То тут оптимизация возможна ( так как все данных есть в измерениях ) из итогов, что бы меньше подымать данных с диска.

PS: Если смотреть на измерение ДокументПродажи ( тут свёртка итогов условно только по Номенклатуре и Характеристике ), то по идее итоги настолько же большие как и движения, телодвижений больше, теоретически для регистра накопления РегистрНакопления.Продажи виртуальная таблица даже  может работать хуже чем работа напрямую с физической таблицей
70 Малыш Джон
 
01.03.21
17:07
(69) где я написал, что это непонятно? Я попросил ссылку на это утверждение.
71 Малыш Джон
 
01.03.21
17:10
(69) это было во-первых. А во-вторых, ты такую чушь выше писал, что сейчас, (69) - ну какбэ уже немножко не в тему получается
72 VS-1976
 
01.03.21
17:11
(70) Смысл в ссылке, если и так понятно что регистратора нет в измерениях, как его можно получить то используя итоги - никак.
73 VS-1976
 
01.03.21
17:32
(71) Всё перечитал, что я написал. Ы общем я имел ввиду конкретный случай, а ты начал про виртуального коня в вауме по этому и пошло недопонимание
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший