pppp
01.12.08
✎
13:43
не могу выразить число в строку или наоборот
мож меня глючит пытаюсь в 1с написать аналог sql запроса
select cast(’30’ as numeric(10))
набираю в консоле
ВЫБРАТЬ ВЫРАЗИТЬ(«30» как число)
{ОбщаяФорма.КонсольТестированияЗапроса(35)}: Ошибка при вызове метода контекста (Выполнить): {(1, 9)}: Несовместимые типы «ВЫРАЗИТЬ»
ВЫБРАТЬ <<?>>ВЫРАЗИТЬ(«30» как число)
ЭлементыФормы.Результат.Значение=Запрос.Выполнить().Выгрузить();
по причине:
{(1, 9)}: Несовместимые типы «ВЫРАЗИТЬ»
ВЫБРАТЬ <<?>>ВЫРАЗИТЬ(«30» как число)
Garkin
01.12.08
✎
13:45
RTFM
asady
01.12.08
✎
13:45
(0) не взлетит.
Mitriy
01.12.08
✎
13:45
ВЫРАЗИТЬ так не умеет… справку читай… очень внимательно…
globalasax
01.12.08
✎
13:53
Приведение типа>
ВЫРАЗИТЬ ( <Выражение> КАК <Тип значения> )
<Тип значения>
БУЛЕВО |
ЧИСЛО [(Длина[, Точность])]|
СТРОКА [(Длина)]|
ДАТА |
<Имя таблицы>
<Длина>
Число
<Точность>
Число
pppp
01.12.08
✎
13:53
а на выразить и справки нету
globalasax
01.12.08
✎
13:54
<Выражение> приводится к одному из примитивных типов, или к ссылочному типу данных; в последнем случае <Имя таблицы> указывает на соответствующую таблицу информационной базы.
Если <Выражение> содержит в составном типе требуемый <Тип значения>, то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.
Если <Выражение> не содержит в составном типе требуемый <Тип значения>, то выполнение данного запроса завершится ошибкой из-за принципиальной невозможности совершить приведение типов.
Для <Тип значения> СТРОКА с указанием длины максимальный размер строки 1024.
pppp
01.12.08
✎
13:54
длина точность опциональны, но если их указать точно такая же ошибка
ВЫБРАТЬ ВЫРАЗИТЬ(«30» как число(10,0))
однох…
pppp
01.12.08
✎
13:55
и чего 1с не может число в строку и обратно???
pppp
01.12.08
✎
13:56
напишите рабочий пример плиз (всего 3 слова писать то)
pppp
01.12.08
✎
13:57
почему у 1с строка и число несовместиииииии-и-и-и-и-и-и-имые типы млин
globalasax
01.12.08
✎
13:59
дык не работает ВЫБРАТЬ ВЫРАЗИТЬ(«30» КАК ЧИСЛО). А так ВЫБРАТЬ ВЫРАЗИТЬ(«30» КАК СТРОКА) работает. Преобразовывать не хочет.
pppp
01.12.08
✎
13:59
на sql все легко переводится и туда и обратно с любой точностью и разрадностью
globalasax
01.12.08
✎
13:59
(4) из справки
pppp
01.12.08
✎
13:59
хахахаха строку в строку и конвертировать то не надо
Garkin
01.12.08
✎
13:59
(12) Нет в запросах 1с преобразования типов.
globalasax
01.12.08
✎
14:01
Поля исходных таблиц могут иметь составной тип. Для таких полей возникает необходимость привести значения поля к какому-либо определенному типу. В языке запросов предусмотрена возможность приведения типа, ею можно пользоваться в списке полей выборки и в условии отбора в предложении ГДЕ.
Cheater
01.12.08
✎
14:01
pppp
01.12.08
✎
14:06
млин скачай на клиент число переведи в строку и обратно отправь на сервер
проще быстрее ;((
pppp
01.12.08
✎
14:08
в общем функцию cast 1с решила не реализовывать а написала свою великую выразить для выражения типа в самого себя если он идет в выборке а остальные подтипы составного типа в NULL це глобально можно было решить
ВЫБРАТЬ КОГДА поле1 ССЫЛКА Справочник.Номенклатура ТОГДА поле1 ИНАЧЕ NULL КОНЕЦ
MSensey
01.12.08
✎
15:23
(19) не совсем ты прав, что можно вместо ВЫРАЗИТЬ использовать ВЫБОР …
почему? подумай сам
Несовместимые типы ВЫРАЗИТЬ в запросе
Автор eladan, 16 мая 2022, 18:14
0 Пользователей и 1 гость просматривают эту тему.
После обновления с УТ 11.4 на 11.5 перестала работать функция ВЫРАЗИТЬ в запросе для вывода Списка Реализаций. Не могу понять в чем дело.
{(4, 2)}: Несовместимые типы «ВЫРАЗИТЬ»
<<?>>ВЫРАЗИТЬ(РеализацияТоваровУслугДополнительныеРеквизиты.Значение КАК Перечисление.ФормыОплаты) КАК Значение
Сам код
ВЫБРАТЬ
РеализацияТоваровУслугДополнительныеРеквизиты.Ссылка КАК Ссылка,
РеализацияТоваровУслугДополнительныеРеквизиты.Свойство КАК Свойство,
ВЫРАЗИТЬ(РеализацияТоваровУслугДополнительныеРеквизиты.Значение КАК Перечисление.ФормыОплаты) КАК Значение
ПОМЕСТИТЬ ВТСвойства
ИЗ
Документ.РеализацияТоваровУслуг.ДополнительныеРеквизиты КАК РеализацияТоваровУслугДополнительныеРеквизиты
ГДЕ
РеализацияТоваровУслугДополнительныеРеквизиты.Свойство = &Свойство
;
eladan, так нормальная ситуация, ошибки в новом коде!
два варианта, либо сами исправляете, либо ждете новое обновление (где будут исправлены эти ошибки (и добавлены новые))
если помогло нажмите: Спасибо!
ВЫБРАТЬ Договора — это временная таблица, предварительно загружена из регистра Когда происходит обращение к Договора.Ссылка.ВидДоговора возникает сабж. Попробовал ЕСТЬNULL(Договора.Ссылка.ВидДоговора,»»пустой»» ) сделать — тоже самое. Изначально было условие ГДЕ Договора.Ссылка.ВидДоговора = ЗНАЧЕНИЕ(Перечисления.ВидыДоговоров.СПоставщиком) тот же хальт.
А если это временная таблица, то что мешает сразу в нее загружать ВидДоговора. А так по ходу видимо косяк во временной таблице
Только что добавил, на ней теперь сбоит
а тип этого реквизита какой? Сдается мне что не ссылка, или во всяком случае есть строки в таблице с незаполненными значениями данного реквизита
имею ввиду УникальныеИдентификаторыСтороннихБазДанных.Ссылка
а что как сбоит, ты обращаешься через точку к реквизиту объекта, а в базе объекта нет, вот и кричит
задавай тогда условие типа УникальныеИдентификаторыСтороннихБазДанных.Ссылка ССЫЛКА …. там что-то, что тебе нужно
А єто что по твоему |ГДЕ | И УникальныеИдентификаторыСтороннихБазДанных.Ссылка ССЫЛКА Справочник.ДоговорыКонтрагентов
{Форма.Форма(1985)}: Помилка при виклику методу контексту (Выполнить): {(50, 2)}: Несумісні типи <<?>>УникальныеИдентификаторыСтороннихБазДанных.Ссылка.ВидДоговора, Запрос.Выполнить;
сдается мне, дело в строгой типизации измерения ссылка в регистре. Это база новая, я туда при добавлении этого регистра поставил типы Справочник.Ссылка и Документ.Ссылка, а в оргинале перечислены все выборочно
Самое что интересное делал выгрузку в таблицу значений ( выборка производилась без поля ВидДоговора) — все нормально, в цикле проверил каждую ссылку на наличие этого реквизита — и… все ок. ничего не понимаю.
Запрос делай иерархически (в подзапросе выбирай строки из базы соответствующие типу ссылки, а в основном запросе соответсвующие уже виду договора). Тогда не будет кричать и при такой организации
думал про подзапрос уже, делаю
Не работает =(, та же песня
Несовместимые типы <?>ОтобранныеДоговоры.Ссылка.ВидДоговора КАК ВидДоговора
И что, никто ничего не знает?
а в консоли запросов нормально работает?
в консоли — тоже самое при проверке ругается на ВидДоговора
Причем не пойму, в оригинальной конфигурации работает, в этой нет. Регистра измерение ссылка уже идентично сделал по типам, ничего не помогает.
а в конструкторе запросов открывается?
Попробуй Выразить УникальныеИдентификаторыСтороннихБазДанных.Ссылка как Справочник.ДоговорыКонтрагентов С составными типами бывает
Хотя к этому времени я переписал запрос так чтоб избавится этого в таком виде
Кстати, в свое время позабавил синтаксис наподобие Выразить(УникальныеИдентификаторыСтороннихБазДанных.Ссылка как Справочник.ДоговорыКонтрагентов).ВидДоговора
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Доброго дня, коллеги!
Помните, мы уже разбирали вопрос, где наша внимательная слушательница решила самостоятельно исследовать метаданные конфигурации, в результате чего у нее появились интересные вопросы?
Сегодня у нас похожий случай, когда очередной слушатель, изучая курс Разработка и оптимизация запросов в 1С:Предприятие 8.3, разбираясь в синтаксисе языка запросов 1С, обнаружил занятную деталь.
Вопрос
Если необходимо отобрать тип регистратора для записей регистра, то можно воспользоваться несколькими разными вариантами:
● ГДЕ ТИПЗНАЧЕНИЯ(ТоварныеЗапасы.Регистратор) = ТИП(Документ.РасходТовара) ● ГДЕ ТоварныеЗапасы.Регистратор ССЫЛКА Документ.РасходТовара ● ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РасходТовара)
А какой из вариантов оптимален с методической точки зрения? Предположительно ВЫРАЗИТЬ исполнится до отбора данных. Так ли это?
Ответ
Можно использовать первые два варианта – оператор ССЫЛКА или функцию ТИПЗНАЧЕНИЯ.
При помощи оператора ВЫРАЗИТЬ можно привести значение только к одному типу:
ВЫРАЗИТЬ Поле КАК Тип
Т.е. сам по себе он не выполняет отбор. Нужно дополнительно в секции ГДЕ установить отбор.
Оператор ССЫЛКА не убирает лишние неявные соединения (это можно проверить при помощи просмотра плана запроса в консоли), а накладывает отбор по типу. А ВЫРАЗИТЬ явно говорит, что поле будет иметь не составной тип, а одну конкретную ссылку, поэтому не будет лишних соединений.
У оператора ССЫЛКА есть особенность.
Пусть используется следующий фрагмент запроса:
&ЦеноваяГруппа ССЫЛКА Справочник.ЦеновыеГруппы
Если в качестве значения параметра ЦеноваяГруппа установить, например, ссылку на справочник «Номенклатура», система выдаст ошибку:
Несовместимые типы “ССЫЛКА”
& ЦеноваяГруппа <<?>>ССЫЛКА Справочник.ЦеновыеГруппы
При работе с реквизитами составного типа тоже может возникать такая же ошибка. Например, документ «РеализацияТоваровУслуг» не входит в составной тип реквизита ДокументОснование документа «Авансовый Отчет». При выполнении запроса будет ошибка:
ВЫБРАТЬ АвансовыйОтчет.ДокументОснование ССЫЛКА Документ.РеализацияТоваровУслуг ИЗ Документ.АвансовыйОтчет КАК АвансовыйОтчет
Причем конструктор запроса даже не будет открываться. ТИПЗНАЧЕНИЯ при этом отработает корректно.
Фирма 1С поясняет это следующим образом:
«Язык запросов выдает эту ошибку, если в типе проверяемого выражения отсутствует ссылка на проверяемую таблицу.»
Вот такую особенность нужно учитывать при разработке запросов.
Кстати, завтра мы вновь вернемся к запросам. Обещаем, будет интересно!
P.S.
Понимать, как работают запросы и уметь их строить — обязательный навык для всех, кто дорабатывает и внедряет 1С.
После курса Вы сможете:
- Строить сложные запросы с несколькими источниками данных
- Уверенно задействовать вложенные запросы и временные таблицы
- Использовать встроенный язык для обработки результатов запроса
- Учитывать особенности соединений и объединений нескольких таблиц.
- Разрабатывать запросы на уровне задач Аттестации 1С:Специалист по платформе.
«Нельзя сравнивать поля неограниченной длины и поля несовместимых типов» — эта ошибка возникает, когда в запросе, мы осуществляем отбор, группировку или создаём связи по полям неограниченной длины.
Оператор «ВЫРАЗИТЬ()», поможет нам не допустить такую ошибку.
В приведённом примере кода, поле неограниченной длины «Представление» выразим, как строку длиной 150 символов.
Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ДополнительнаяИнф.Объект, | ВЫРАЗИТЬ(ДополнительнаяИнф.Представление КАК СТРОКА(150)) КАК Представление |ИЗ | РегистрСведений.ДополнительнаяИнф КАК ДополнительнаяИнф | |СГРУППИРОВАТЬ ПО | ВЫРАЗИТЬ(ДополнительнаяИнф.Представление КАК СТРОКА(150)), | ДополнительнаяИнф.Объект»; |