Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Условие в запросе, что реквизит у документа вообще существует

Условие в запросе, что реквизит у документа вообще существует
Я
   1C_coder
 
25.01.20 - 21:26
Как правильно написать условие запроса, что реквизит у документа вообще существует?
(в запросе выбираются из регистра самые разные документы, и у некоторых из них этого реквизита вообще нет)
[CODE]ВЫБОР
    КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер Реквизит вообще существует ТОГДА то-то
    ИНАЧЕ то-то
КОНЕЦ[/CODE]
Нужно, чтобы выбирались все документы, у которых нет такого реквизита, и все документы, у которых он есть и Партнер не в СпискеЗначений.

-------------------------------------------------------------------------------

Такой вариант не срабатывает (не видит документы без реквизита):
[CODE]ВЫБОР
    КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер.Ссылка <> ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
        ТОГДА ВЫБОР
                КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер.Ссылка В (&СписокЗначений)
                    ТОГДА ЛОЖЬ
                ИНАЧЕ ИСТИНА
            КОНЕЦ
    КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер.Ссылка = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
        ТОГДА ИСТИНА
КОНЕЦ[/CODE]

-------------------------------------------------------------------------------

Пока что вышел из положения таким нагромождением:
[CODE]ВЫБОР
    КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер.Ссылка В (&СписокЗначений)
            И (ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                ИЛИ ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ВозвратТоваровОтКлиента)
                ИЛИ ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваровУслуг)
                ИЛИ ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ВозвратТоваровПоставщику))
        ТОГДА ЛОЖЬ
    ИНАЧЕ ИСТИНА
КОНЕЦ[/CODE]
 
 
   ДенисЧ
 
1 - 25.01.20 - 21:28
Запрос в 1с не может обращаться к метаданным
   Злопчинский
 
2 - 25.01.20 - 21:33
Посмотри в сторону не того, чтобы по документам шарится, а возможно есть реквизит у оборотов типа движение "внешнее" или "внутреннее", у внутренних "Партнера" вообще как класса м.б. не быть...
?
   Ненавижу 1С
 
3 - 25.01.20 - 22:12
КОГДА НЕ ТоварыНаСкладахОбороты.Регистратор.Партнер ЕСТЬ NULL
   palsergeich
 
4 - 25.01.20 - 23:22
(3) не надо так.
Передавайте лучше в запрос массив типов регистраторов, которые имеют поле партнер.
   palsergeich
 
5 - 25.01.20 - 23:24
Последний вариант в (0) близок к истине, но еще не торт
   Ненавижу 1С
 
6 - 25.01.20 - 23:25
(4) может ты и прав, так будет быстрее
   Cyberhawk
 
7 - 26.01.20 - 09:41
"КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер.Ссылка В (&СписокЗначений)" // Зачем тебе обороты, если ты обращаешься к регистратору? Обращайся тогда уж к реальной таблице движений
   AneJIbcuH
 
8 - 26.01.20 - 09:42
(0) Создавай запрос программно (например, просто замена части запроса).
А пока запросы у тебя слишком кривые, что стоит только эта строка:
"КОГДА ТоварыНаСкладахОбороты.Регистратор.Партнер.Ссылка В (&СписокЗначений)"
   Cyberhawk
 
9 - 26.01.20 - 09:42
Возможность в виртуальной таблице оборотов периодичность по регистратору включить и выбирать регистратор - это же троллинг со стороны 1С знатный
   rsv
 
10 - 26.01.20 - 10:36
(0) можно так

Попытки

Твой запрос

Исключение
Значит нет реквизита 
Конецпопытки
   lEvGl
 
11 - 26.01.20 - 11:36
Документ.Реквизит Ссылка Справочник.НужныйСправочник
в Когда Тогда или в Где
   PR
 
12 - 26.01.20 - 11:37
Капец

НЕ ЕСТЬNULL(ТоварыНаСкладахОбороты.Регистратор.Партнер, Неопределено) В(&СписокПартнеров)

   lEvGl
 
13 - 26.01.20 - 11:38
есть null тоже должно отработать
   Rovan
 
14 - 26.01.20 - 12:52
(+1) всегда делаю это на уровне кода
ТекстЗапроса = ТекстЗапроса  + 
?( Метаданные.Документы[ ИмяДок ].Реквизиты.Найти( ИмяРек ) = Неопределено, " <> ", " Док.ИмяРек " )
   1C_coder
 
15 - 26.01.20 - 13:06
(12) Спасибо!

Такой вариант работает:
ВЫБОР
    КОГДА ЕСТЬNULL(ТоварыНаСкладахОбороты.Регистратор.Партнер, НЕОПРЕДЕЛЕНО) В (&СписокЗначений)
        ТОГДА ЛОЖЬ
    ИНАЧЕ ИСТИНА
КОНЕЦ

   PR
 
16 - 26.01.20 - 14:04
(15) А чем тебя просто (12) не устраивает,  без ВЫБОР?
   PR
 
17 - 26.01.20 - 14:06
(14) Как в лужу пукнул
   PR
 
18 - 26.01.20 - 14:07
+(17) Впрочем, как и половина отписавшихся в ветке
   Ненавижу 1С
 
19 - 26.01.20 - 15:09
(18) Рома, откуда столько спеси? Или это у всех хозяев маленьких франчайзи?
   Ненавижу 1С
 
20 - 26.01.20 - 15:25
(15) работать то он работает, но не оптимально
   Sasha_H
 
21 - 26.01.20 - 15:29
если хотите оптимально тогда не через ВЫБОР КОГДА, а через ОБЪЕДИНИТЬ и УСЛОВИЕ
   PR
 
22 - 26.01.20 - 15:30
(19) Ну вот смотри
В (0) человек накуролесил — это ладно, бывает, он потому и обратился к коллективному разуму, мол помогите, не могу сделать
Ну, пустое в (1) пропускаем
(2) почти по делу, если учитывать, что Злопчинский не кодер, могло бы и сработать
(3), (4), (5), (6) по делу, хотя насчет такой рекомендации бабушка еще надвое сказала, лучше так или нет, если говорить не только про оптимизацию производительности, но и, как минимум, про читабельность
(7), (8), (9), (10) вообще не в кассу
(11) по делу, хотя рекомендация не уверен, что верная
И после всего написанного веселее всего (14), который даже (0) не прочитал
Ну то есть по делу где-то половина и есть

А реакция моя — это не спесь, а чувство отвращения к тем, кто пишет всякую ерунду, когда по делу написать нечего, а что-нибудь написать хочется
   Ненавижу 1С
 
23 - 26.01.20 - 15:34
(22) не на двое
Тогда (3) также неоптимально как и у тебя, зато читабельно
   PR
 
24 - 26.01.20 - 15:37
(20) Речь и не шла про оптимальность
Оптимальнее всего, думаю, было бы сделать то, что делает платформа 1С, то есть написать запрос, максимально приведенный к виду SQL, то есть самому сделать всякие левые соединения по типам регистраторов, разложить все по полочкам, из одних регистраторов брать поле, из других не брать и т. д.
Но в том-то и дела, что производительность — это один из критериев, далеко не всегда самый важный
Если речь идет про узкое место, где реальная проблема из-за скорости выполнения запроса, то это один случай
А если это код отчета, который пользователь будет запускать раз в пятилетку и ему подождать пару лишних миллисекунд не в падлу и база при этом не упадет от такого запроса, то тут уже важно и то, насколько такой код читабелен, и сколько ТС за его реализацию денег попросит и еще некоторые вещи, которые могли бы быть менее важны
   PR
 
25 - 26.01.20 - 15:38
(23) Так (3) — это как у меня и есть, в чем разница-то кроме ВЫБОРа?
   Sasha_H
 
26 - 26.01.20 - 15:41
но обычно делают как-то так если уж так хотят добиться оптимальности.  в конструкции ГДЕ следует написать следующее

Конструкция ВЫБРАТЬ

ГДЕ ВЫРАЗИТЬ(Регистратор.Контрагент КАК Документ.РеалиазацияТоваров).Контрагент В (СписокКонтр)

ОБЪЕДИНИТЬ

.........

ГДЕ ВЫРАЗИТЬ(Регистратор.Контрагент КАК Документ.ПоступлениеТоваров).Контрагент В (СписокКонтр)
   Sasha_H
 
27 - 26.01.20 - 15:42
а оптимальность здесь в следующем ВЫРАЗИТЬ составной тип превращает в конкретный тип и на СКЛ уйдет план к одной таблице а не 30 если регистратор используется у стольких документов.
   Ненавижу 1С
 
28 - 26.01.20 - 15:43
(25) не нужен isnull, не нужно неопределено, не нужен список значений

Только is null. Всё. Но не оптимально
   Ненавижу 1С
 
29 - 26.01.20 - 15:44
В (4) наиболее оптимальное решение
   Sasha_H
 
30 - 26.01.20 - 15:45
(29) наиболее оптимально это через ОБЪЕДЕНИТЬ и УСЛОВИЕ
 
 Рекламное место пустует
   Sasha_H
 
31 - 26.01.20 - 15:50
(26) это если решать задачу, что будут передан еще и условие на контрагентов. А если расматривать только как задачу существования реквизита - то как в (4)

Просто условие ГДЕ ТипЗначения(Регситратор) В (СписокТиповИспользующихРеквизитКонтрагент)
   PR
 
32 - 26.01.20 - 15:58
(28) Ты бы прочитал (0) что ли повнимательнее, ту часть, где про "Партнер не в СпискеЗначений"
   palsergeich
 
33 - 26.01.20 - 16:38
(22) ты типовые современные открывал?
Там вполне себе передается массив допустимых типов и все нормально читается
   PR
 
34 - 26.01.20 - 17:03
(33) Типовые — это на всю Россию, ясен пень, что там производительность гораздо важнее и бюджет больше, чем в отдельно взятой фирме на три калеки
   Ненавижу 1С
 
35 - 26.01.20 - 18:09
(34) Рома начал отмазываться
   1C_coder
 
36 - 26.01.20 - 20:10
(16) Да просто для наглядности.

Изменил на
НЕ ЕСТЬNULL(ТоварыНаСкладахОбороты.Регистратор.Партнер, НЕОПРЕДЕЛЕНО) В (&СписокЗначений)

   1C_coder
 
37 - 26.01.20 - 20:11
(24) Именно так.
Высокое искусство - это, конечно, замечательно.
Только клиенты почему-то не собираются за него платить.
Что с них взять? Тёмные невежественные люди...
Когда меня пригласят на работу в газпром, обязательно начну приобщаться к высокому искусству.

А этот код, кстати, нужен для еженочной автоматической выгрузки.
Время выполнения несколько секунд.
Хотя даже если бы он выполнялся несколько часов, это клиента совершенно не интересовало бы, потому что пользователи вручную его не запускают.

Я ещё не сказал о том, кусок кода, про который я спросил, использую в секции ГДЕ запроса.
Вообще жуткая неоптимальность.
   Garykom
 
38 - 26.01.20 - 20:14
А потом когда конфа обновится и поле того кто то заипется все эти запросы переуячивать...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.