В запросе не отрабатывает отсеивание строкового типа у составного типа перед использованием "ВЫРАЗИТЬ"
Добрый день,
В запрос набора данных СКД передаю параметр с составным типом (Строка(150) и Справочник.Справочник1). В запросе использую конструкцию
Запросом пытаюсь получить родителя у значения этого параметра, когда он является значением типа Справочник.Справочник1. Формирование выдает ошибку Несовместимые типы "<?>ВЫРАЗИТЬ".
У меня вопрос. По идее после каждой строки условия, если текущая строка условия не отработала, программа должна выйти из условия с ложью и двигаться дальше. И раз ошибка выдается в строке с ВЫРАЗИТЬ, то по идее проверка на тип прошла успешно. Тогда почему оператор ВЫРАЗИТЬ по уже проверенному типу выдает ошибку несовместимости типов?
Сравнение с использованием ССЫЛКА также выдает то же самое. Пробовал добавлять такие условия как
но всё то же самое.
Пожалуйста помогите!
В запрос набора данных СКД передаю параметр с составным типом (Строка(150) и Справочник.Справочник1). В запросе использую конструкцию
ГДЕ
ВЫБОР
КОГДА т.Аналитика1 <> НЕОПРЕДЕЛЕНО
И ТИПЗНАЧЕНИЯ(&Параметр) = ТИП(Справочник.Справочник1) ТОГДА
ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1).Родитель = т.Аналитика1
ИНАЧЕ
ИСТИНА
КОНЕЦ
Запросом пытаюсь получить родителя у значения этого параметра, когда он является значением типа Справочник.Справочник1. Формирование выдает ошибку Несовместимые типы "<?>ВЫРАЗИТЬ".
У меня вопрос. По идее после каждой строки условия, если текущая строка условия не отработала, программа должна выйти из условия с ложью и двигаться дальше. И раз ошибка выдается в строке с ВЫРАЗИТЬ, то по идее проверка на тип прошла успешно. Тогда почему оператор ВЫРАЗИТЬ по уже проверенному типу выдает ошибку несовместимости типов?
Сравнение с использованием ССЫЛКА также выдает то же самое. Пробовал добавлять такие условия как
И &Параметр <> НЕОПРЕДЕЛЕНО
И НЕ &Параметр ЕСТЬ NULL
И ТИПЗНАЧЕНИЯ(&Параметр) <> ТИП(Строка)
но всё то же самое.
Пожалуйста помогите!
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Он когда дает ошибку? При заполненном параметре ссылкой на справочник ошибки не должно быть.
При других случаях будет ошибка разбора кода(запроса) на уровне оптимизатора, а не выполнения в данной строке кода(запроса), так как параметр не является нужной ссылкой. В отличие от программного кода, запрос работает несколько иначе. В запросе нет понятия параметра составного типа. Параметр будет того типа, который в запрос был передан.
Но выдает ошибку Несовместимые типы "ВЫРАЗИТЬ".
Он когда дает ошибку? При заполненном параметре ссылкой на справочник ошибки не должно быть.
При других случаях будет ошибка разбора кода(запроса) на уровне оптимизатора, а не выполнения в данной строке кода(запроса), так как параметр не является нужной ссылкой. В отличие от программного кода, запрос работает несколько иначе. В запросе нет понятия параметра составного типа. Параметр будет того типа, который в запрос был передан.
(15)
Параметр строка тоже, загнать левую строку, можно даже ту же. Что вернет?
У меня ошибок не выдал. И не должен был выдать.
Выразить применяется к значению. И ругается там, где не может выразить как требуемый тип значения.
Потому что ВЫРАЗИТЬ() применяется только к таблицам БД.
Параметр строка тоже, загнать левую строку, можно даже ту же. Что вернет?
У меня ошибок не выдал. И не должен был выдать.
Выразить применяется к значению. И ругается там, где не может выразить как требуемый тип значения.
Выбрать
Выразить("фдлвыоадлфыовад фовджлаофж оваждлф ыоваждлофыв д" как Строка(10)) как стр10
,Выразить(&ПараметрСтрока как Строка(11)) как стр11
(12) ошибка в том, что пытаетесь запрос рассматривать как программный код 1С.
В запросе параметр подставляется напрямую в текст запроса, и оптимизатор пытается разобрать текст запроса и натыкается на попытку Выразить уже известного значения (параметра) до выполнения запроса в совершенно другой тип. То что там идет ветвление и Выразить по замыслу не должно сработать, даже не рассматривается. Присутствует сам факт наличия вероятной ошибки при разборе кода.
В запросе параметр подставляется напрямую в текст запроса, и оптимизатор пытается разобрать текст запроса и натыкается на попытку Выразить уже известного значения (параметра) до выполнения запроса в совершенно другой тип. То что там идет ветвление и Выразить по замыслу не должно сработать, даже не рассматривается. Присутствует сам факт наличия вероятной ошибки при разборе кода.
Проверил, через Параметр1 при соединении с рассматриваемым набором данных попадают только два типа -- Справочник1 и Строка, хотя сейчас и изменил даже тип Строка на тип Справочник.ЗначенияСвойствОбъектов, когда прочитал, что могут быть проблемы с составным типом, куда входят примитивные типы. Но всё равно не срабатывает предварительно фильтрующее условние ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(...) = ТИП(...) ТОГДА, потому что выдает ошибку при использовании ВЫРАЗИТЬ КАК уже проверенный данным условием тип.
Извиняюсь, забыл добавить, запросом пытаюсь получить родителя у значения этого параметра, когда он является значением типа Справочник.Справочник1:
ГДЕ
ВЫБОР
КОГДА т.Аналитика1 <> НЕОПРЕДЕЛЕНО
И ТИПЗНАЧЕНИЯ(&Параметр) = ТИП(Справочник.Справочник1) ТОГДА
ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1).Родитель = т.Аналитика1
ИНАЧЕ
ИСТИНА
КОНЕЦ
(11)В чем проблема до запроса получить нужное значение параметра?
Если нужно сравнивать с родителем, получите его значение ДО запроса, и передайте в запрос еще один параметр.
Сделайте несколько запросов, в зависимости от типа параметра. Чтобы не проверять в запросе вот это вот все. Будет работать определенно быстрее.
Достаточно будет условия
В СКД добавьте еще один параметр ПараметрРодитель и вычисляйте его на закладке Параметры из значения параметра Параметр.
Если нужно сравнивать с родителем, получите его значение ДО запроса, и передайте в запрос еще один параметр.
Сделайте несколько запросов, в зависимости от типа параметра. Чтобы не проверять в запросе вот это вот все. Будет работать определенно быстрее.
Достаточно будет условия
ГДЕ
т.Аналитика1 В (НЕОПРЕДЕЛЕНО,&ПараметрРодитель)
В СКД добавьте еще один параметр ПараметрРодитель и вычисляйте его на закладке Параметры из значения параметра Параметр.
Хотя нет, поспешил. В отладчике в экспортной процедуре было всегда только неопределено. Возможно нельзя сделать так, чтобы во вкладке параметры, параметр динамически обновлял значение при формировании отчета, что использовал бы другой параметр в этой же вкладке, производящий с ним махинации. Решил проблему другим, предложенным вами же способом -- добавил в источник внешних данных поля для значений групп каждого отдельного уровня иерархии, чтобы не нужно было использовать проблемную конструкцию ВЫРАЗИТЬ(&Параметр КАК Справочник.Справочник1).Родитель = Т.Аналитика1, где, думаю из-за проблем связанными с составным типом у параметра, оператор ВЫРАЗИТЬ не отрабатывал.
Также, проблема скорее всего была в том, что, как оказалось, набор данных, поставляющий этот параметр, сам уже в себе приводил поставляемое значение к типу Справочник, что, по идее, заставляло в связанном наборе данных пытаться выразить уже не составной тип параметра, что, возможно, и приводило к ошибке.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот