ВЫБОР КОГДА в Запросе

1. user930087 24.05.23 17:49 Сейчас в теме
В запросе идет выбор
ВЫБОР
КОГДА А=1 Тогда Документ.Реквизит1
КОГДА А=2 Тогда Документ2.Реквизит
КОНЕЦ

Смысл такой, если срабатывает одно условие то берем реквизит из одного документа, если другое то из другого.
Срабатывает первое условие, но почему-то идет во второе и не находит реквизит, так как его нет в этом документе. Почему второе начинает отрабатывать когда уже первое отработало?
Где я туплю?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 24.05.23 18:08 Сейчас в теме
(1) логика запроса отличается от логики программного кода 1С.
Текст запроса вначале прогоняется через оптимизатор, который и строит план выполнения запроса. И данная ошибка выбрасывается оптимизатором на этапе анализа.
Данная задача решается через подзапросы с "Объединить все".
user1671936; ong1990; ONLYTILT; +3 Ответить
6. user1826630 24.05.23 20:05 Сейчас в теме
(1)
когда уже первое отработало?
Как определил, что оно отработало? Ты прям в тексте запроса можешь отладчик ставить?
7. user930087 24.05.23 21:22 Сейчас в теме
(6) если оставляю только первое условие -все норм отрабатывает. добавляю второе - почему заходит и во второе.
14. user654641_yaga_m 12 25.05.23 10:42 Сейчас в теме
(1)ДД, может я что-то не понял, формат оператора такой:

ВЫБОР 
	КОГДА <Выражение> ТОГДА <Выражение>
	ИНАЧЕ <Выражение>
КОНЕЦ


Этого достаточно, если А имеет два значения, иначе:

ВЫБОР 
	КОГДА <Выражение> ТОГДА <Выражение>
	ИНАЧЕ
ВЫБОР 
	КОГДА <Выражение> ТОГДА <Выражение>
КОНЕЦ
КОНЕЦ
2. user930087 24.05.23 17:56 Сейчас в теме
Причем ошибку выдает типа 1=2 Не найден реквизит Документ2.Реквизит. А с чего вообще идет до реквизита, если условие не срабатывает и А =1, а не 2.
4. truba 24.05.23 18:53 Сейчас в теме
(2)конструктор запроса выдает ошибку или нет?
8. user930087 24.05.23 21:39 Сейчас в теме
5. Said-We 24.05.23 18:54 Сейчас в теме
(1) Загони запрос в консоль и посмотри данные. Может там не 1.
9. user930087 24.05.23 21:40 Сейчас в теме
(5) как уже написал, когда одно условие -все отрабатывает норм, добавляю второе когда - почему-то в этой же ситуации заходит и в него.
10. user1936670 24.05.23 22:06 Сейчас в теме
(9)
как уже написал
Молодец. А теперь напиши точный текст запроса и точное сообщение об ошибке.
16. GSokolov 320 27.05.23 08:54 Сейчас в теме
(9) Так и должно быть. В такой конструкции проверяются все условия в последовательности КОГДА. Результатом будет последнее выполненное условие. Для выхода после проверки условия следует применять ИНАЧЕ и дальше вложенные ВЫБОР КОГДА... Если не уверены, что документ2 или его реквизит существует, делайте проверку на Nuul.
17. spacecraft 27.05.23 12:39 Сейчас в теме
(16)
Так и должно быть. В такой конструкции проверяются все условия в последовательности КОГДА. Результатом будет последнее выполненное условие.

это не так работает. Последовательность КОГДА работает как ИначеЕсли
Можете сами проверить:
ВЫБРАТЬ
	ВЫБОР
		КОГДА 1 = 1
				И 2 = 2
			ТОГДА 1
		КОГДА 2 = 1
			ТОГДА 2
		КОГДА 1 = 1
			ТОГДА 3
		ИНАЧЕ 4
	КОНЕЦ КАК Поле1
Показать

Результат: 1
18. GSokolov 320 27.05.23 17:40 Сейчас в теме
(17) Конфуз, неправ. Получается, проверяются не сами условия, а возможность корректного получения выражений во всех последующих итерациях...
19. spacecraft 27.05.23 19:34 Сейчас в теме
(18) данные не будут получаться из таблиц при каждой итерации. Данные получаются с избытком, все которые соответствуют прямому отбору и теоретически могут быть нужны. И уже из полученных данных идет выбор нужных.
Соответственно для их получения составляется план выполнения запроса. И тут оптимизатор дает ошибку, так как не может составить этот план, так как на этом этапе не знает условий для ВЫБОР и пытается составить план с учетом получения всех подходящих данных.
11. Said-We 24.05.23 23:11 Сейчас в теме
(1)
ВЫБРАТЬ А, Документ.Реквизит1, Документ2.Реквизит,
ВЫБОР
КОГДА А=1 Тогда Документ.Реквизит1
КОГДА А=2 Тогда Документ2.Реквизит
КОНЕЦ КАК НекийВыбор ИЗ...
Выполни в консоли и смотри результат.
У тебя может где-то 1 это цифра, а где-то строка "1". Визуально одинаково, по факту очень разные значения.
12. truba 25.05.23 08:57 Сейчас в теме
Собственно до сих пор не понимаю. Документ1, Документ2 - таблицы у которых есть столбцы - Реквизиты
В запросе судя по всему объединяются эти таблицы к некоторой третей основной. Если запрос построен так то вообще по сути все равно какие там условия - синтаксически это не ошибочная конструкция, синтаксической ошибки при выполнении запроса быть не должно в любом случае. Какой он результат выдаст это дело третье.

Или автор имеет в виду что он просто получает на выход результат второго условия вместо ожидаемого первого?
Опять же эта конструкция она действительно в запросе или в вычисляемых полях СКД?
13. пользователь 25.05.23 09:24
Сообщение было скрыто модератором.
...
15. Said-We 26.05.23 16:45 Сейчас в теме
(14) 1С поддерживает 2-а формата CASE:
 ВЫБРАТЬ
     т.Символ
    ,ВЫБОР
         КОГДА т.Символ = "А" Тогда 1
         КОГДА т.Символ = "Б" Тогда 2
         ...
         ИНАЧЕ 99
     КОНЕЦ как Поле1
    ,ВЫБОР т.Символ
         КОГДА "А" Тогда 1
         КОГДА "Б" Тогда 2
         ...
         ИНАЧЕ 99
    КОНЕЦ как Поле2
ИЗ ВТ как т
Показать
Но их больше. Например в MS SQL на вскидку есть ещё и такие:
COALESCE(p1, p2, p3, ..., pn) - Возвращает первое значение не равное NULL
IIF(<условие>, <Значение если условие выполняется>, <Значение если условие НЕ выполняется>) - допустимы вложенности. Примерно как языке в 1С, но не языке запросов ?(пол="м", 'Мужской'', "Женский").
CHOOSE (НомерДняНедели, 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресение')
AlexGoldT; +1 Ответить
20. user654641_yaga_m 12 28.05.23 18:16 Сейчас в теме
(15)Спасибо за наводку - никогда с таким форматом не встречался... "порою"....
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот