В запросе не отрабатывает отсеивание строкового типа у составного типа перед использованием "ВЫРАЗИТЬ"

1. user1050439 7 11.04.23 11:14 Сейчас в теме
Добрый день,

В запрос набора данных СКД передаю параметр с составным типом (Строка(150) и Справочник.Справочник1). В запросе использую конструкцию

ГДЕ
	ВЫБОР 
		КОГДА т.Аналитика1 <> НЕОПРЕДЕЛЕНО        
		И ТИПЗНАЧЕНИЯ(&Параметр) = ТИП(Справочник.Справочник1) ТОГДА
			ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1).Родитель =  т.Аналитика1
		ИНАЧЕ
			ИСТИНА
	КОНЕЦ

Запросом пытаюсь получить родителя у значения этого параметра, когда он является значением типа Справочник.Справочник1. Формирование выдает ошибку Несовместимые типы "<?>ВЫРАЗИТЬ".

У меня вопрос. По идее после каждой строки условия, если текущая строка условия не отработала, программа должна выйти из условия с ложью и двигаться дальше. И раз ошибка выдается в строке с ВЫРАЗИТЬ, то по идее проверка на тип прошла успешно. Тогда почему оператор ВЫРАЗИТЬ по уже проверенному типу выдает ошибку несовместимости типов?

Сравнение с использованием ССЫЛКА также выдает то же самое. Пробовал добавлять такие условия как

И &Параметр <> НЕОПРЕДЕЛЕНО
И  НЕ &Параметр ЕСТЬ NULL
И  ТИПЗНАЧЕНИЯ(&Параметр) <> ТИП(Строка) 

но всё то же самое.

Пожалуйста помогите!
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 11.04.23 11:58 Сейчас в теме
(1)Зачем выражать параметр, если он уже и так ссылка на справочник?
user1826630; +1 Ответить
10. user1050439 7 11.04.23 14:36 Сейчас в теме
(2) Параметр идет составного типа, а мне нужно получить родителя у значения этого параметра, когда он является значением типа Справочник.Справочник1
14. user1826630 11.04.23 14:49 Сейчас в теме
(10) Расскажи мне про параметр составного типа... Очень хочу знать!
6. spacecraft 11.04.23 13:42 Сейчас в теме
(1)
Но выдает ошибку Несовместимые типы "ВЫРАЗИТЬ".

Он когда дает ошибку? При заполненном параметре ссылкой на справочник ошибки не должно быть.
При других случаях будет ошибка разбора кода(запроса) на уровне оптимизатора, а не выполнения в данной строке кода(запроса), так как параметр не является нужной ссылкой. В отличие от программного кода, запрос работает несколько иначе. В запросе нет понятия параметра составного типа. Параметр будет того типа, который в запрос был передан.
user1050439; +1 Ответить
12. user1050439 7 11.04.23 14:44 Сейчас в теме
(6) Понятно. Но почему тогда программа, успешно проходя условие ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(...) = ТИП(...), выдает ошибку, когда я далее пытаюсь выразить как уже проверенный тип?
15. user1826630 11.04.23 14:50 Сейчас в теме
(12) Потому что ВЫРАЗИТЬ() применяется только к таблицам. А не к единичным параметрам.
17. Said-We 11.04.23 14:54 Сейчас в теме
(15)
Потому что ВЫРАЗИТЬ() применяется только к таблицам БД.

Параметр строка тоже, загнать левую строку, можно даже ту же. Что вернет?
У меня ошибок не выдал. И не должен был выдать.
Выразить применяется к значению. И ругается там, где не может выразить как требуемый тип значения.
Выбрать
        Выразить("фдлвыоадлфыовад фовджлаофж оваждлф ыоваждлофыв д" как Строка(10)) как стр10
       ,Выразить(&ПараметрСтрока как Строка(11)) как стр11
user1050439; +1 Ответить
18. user1826630 11.04.23 15:02 Сейчас в теме
16. spacecraft 11.04.23 14:53 Сейчас в теме
(12) ошибка в том, что пытаетесь запрос рассматривать как программный код 1С.
В запросе параметр подставляется напрямую в текст запроса, и оптимизатор пытается разобрать текст запроса и натыкается на попытку Выразить уже известного значения (параметра) до выполнения запроса в совершенно другой тип. То что там идет ветвление и Выразить по замыслу не должно сработать, даже не рассматривается. Присутствует сам факт наличия вероятной ошибки при разборе кода.
user1050439; +1 Ответить
3. booksfill 11.04.23 12:08 Сейчас в теме
попробуйте написать без "= т.Аналитика1":
ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1) 


Понятно, что это уже будет не логическое выражение, но на что будет тогда ругаться?
4. Bosma 69 11.04.23 12:30 Сейчас в теме
ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1) = т.Аналитика1
что вы пытаетесь сделать этой строкой? тут ошибка
5. Fatenm 11.04.23 12:44 Сейчас в теме
вы в запросе пытаетесь присвоить значение параметру с типом справочник?
зачем в выражении " ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1) = т.Аналитика1" знак "равно"?
7. user1050439 7 11.04.23 14:29 Сейчас в теме
Прошу прощения, не уточнил сразу, ВЫРАЗИТЬ находится в ГДЕ, и я в итоге должен получить значение типа булево при сравнении со значением аналитики.
9. Sashares 34 11.04.23 14:36 Сейчас в теме
(7)Не важно где находится Выразить. Оно не нужно.
8. user1050439 7 11.04.23 14:33 Сейчас в теме
Проверил, через Параметр1 при соединении с рассматриваемым набором данных попадают только два типа -- Справочник1 и Строка, хотя сейчас и изменил даже тип Строка на тип Справочник.ЗначенияСвойствОбъектов, когда прочитал, что могут быть проблемы с составным типом, куда входят примитивные типы. Но всё равно не срабатывает предварительно фильтрующее условние ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(...) = ТИП(...) ТОГДА, потому что выдает ошибку при использовании ВЫРАЗИТЬ КАК уже проверенный данным условием тип.
11. user1050439 7 11.04.23 14:39 Сейчас в теме
Извиняюсь, забыл добавить, запросом пытаюсь получить родителя у значения этого параметра, когда он является значением типа Справочник.Справочник1:

ГДЕ
    ВЫБОР 
        КОГДА т.Аналитика1 <> НЕОПРЕДЕЛЕНО        
        И ТИПЗНАЧЕНИЯ(&Параметр) = ТИП(Справочник.Справочник1) ТОГДА
            ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1).Родитель = т.Аналитика1
        ИНАЧЕ
            ИСТИНА
    КОНЕЦ
13. Sashares 34 11.04.23 14:46 Сейчас в теме
(11)В чем проблема до запроса получить нужное значение параметра?
Если нужно сравнивать с родителем, получите его значение ДО запроса, и передайте в запрос еще один параметр.
Сделайте несколько запросов, в зависимости от типа параметра. Чтобы не проверять в запросе вот это вот все. Будет работать определенно быстрее.
Достаточно будет условия
ГДЕ
т.Аналитика1 В (НЕОПРЕДЕЛЕНО,&ПараметрРодитель)


В СКД добавьте еще один параметр ПараметрРодитель и вычисляйте его на закладке Параметры из значения параметра Параметр.
user1050439; +1 Ответить
19. user1050439 7 11.04.23 15:17 Сейчас в теме
(13) Спасибо, этот вариант сработал! Во вкладке параметров вызвал экспортную процедуру общего модуля по получению группы у элемента.
20. user1050439 7 12.04.23 10:02 Сейчас в теме
Хотя нет, поспешил. В отладчике в экспортной процедуре было всегда только неопределено. Возможно нельзя сделать так, чтобы во вкладке параметры, параметр динамически обновлял значение при формировании отчета, что использовал бы другой параметр в этой же вкладке, производящий с ним махинации. Решил проблему другим, предложенным вами же способом -- добавил в источник внешних данных поля для значений групп каждого отдельного уровня иерархии, чтобы не нужно было использовать проблемную конструкцию ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1).Родитель = Т.Аналитика1, где, думаю из-за проблем связанными с составным типом у параметра, оператор ВЫРАЗИТЬ не отрабатывал.
21. user1050439 7 12.04.23 15:29 Сейчас в теме
Также, проблема скорее всего была в том, что, как оказалось, набор данных, поставляющий этот параметр, сам уже в себе приводил поставляемое значение к типу Справочник, что, по идее, заставляло в связанном наборе данных пытаться выразить уже не составной тип параметра, что, возможно, и приводило к ошибке.
22. Said-We 12.04.23 18:08 Сейчас в теме
(21)
заставляло в связанном наборе данных пытаться выразить уже не составной тип параметра, что, возможно, и приводило к ошибке

Неа. На скрине дважды из справочника выражается значение. Ошибки нет.
Прикрепленные файлы:
23. пользователь 12.04.23 18:27
Сообщение было скрыто модератором.
...
24. Said-We 12.04.23 19:24 Сейчас в теме
(21) ИИ в 23 не верь.
Ниже скрин с примером составной тип как у тебя: строка и справочник. Данные заполнены только у одной строки и заполнено типом строка.
Прикрепленные файлы:
26. пользователь 12.04.23 21:06
Сообщение было скрыто модератором.
...
25. Said-We 12.04.23 20:14 Сейчас в теме
(21) Если значение может быть преобразовано, то сколько раз преобразовывать не важно.
Ниже усложненный вариант.
Прикрепленные файлы:
27. user1880116 12.04.23 21:16 Сейчас в теме
(25) Умничка! А теперь давай то же самое, но на sqlite. А потом с оконными функциями - всё, как ты любишь.
Оставьте свое сообщение

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