В запросе перечисление преобразовать в строку. как?
у меня остаёться вариант писать через ВЫБОР, но это очень утомительлно так как перечисление и значений много.
(5) да это в этом и подвох.
забил на это. после запроса програмно обрабаываю перечисление
ПеречНДС = ТаблицаИменПеречисления("СтавкиНДС");
Запрос = Новый Запрос("ВЫБРАТЬ
| Таб.Имя,
| Таб.Значение
|ПОМЕСТИТЬ ТабПеречНДС
|ИЗ
| &ПеречНДС КАК Таб
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.СтавкаНДС,
| ЕСТЬNULL(ТабПеречНДС.Имя, """") КАК ИмяПереч,
| Номенклатура.Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ТабПеречНДС КАК ТабПеречНДС
| ПО Номенклатура.СтавкаНДС = ТабПеречНДС.Значение");
Запрос.УстановитьПараметр("ПеречНДС", ПеречНДС);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Код + " — " + Выборка.ИмяПереч);
КонецЦикла;
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Значение", Новый ОписаниеТипов("ПеречислениеСсылка."+ИмяПеречисления));
Таблица.Колонки.Добавить("Имя", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(100));
Для Каждого ЗнПереч Из Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления Цикл
НовСтр = Таблица.Добавить();
НовСтр.Значение = ЗнПереч;
НовСтр.Имя = ЗнПереч.Имя;
КонецЦикла;
упс, сорян, поправил функцию
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Значение", Новый ОписаниеТипов("ПеречислениеСсылка."+ИмяПеречисления));
Таблица.Колонки.Добавить("Имя", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(100));
Для Каждого ЗнПереч Из Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления Цикл
НовСтр = Таблица.Добавить();
НовСтр.Значение = Перечисления[ИмяПеречисления][ЗнПереч.Имя];
НовСтр.Имя = ЗнПереч.Имя;
КонецЦикла;
Функция Представление(), Поле Представление
Функция Представление()
Функция представление предназначена для получения текстового представления любого значения, которое может быть получено при помощи языка запросов. Функция Представление() работает как для ссылочных, так и для примитивных типов. Для ссылочных типов результат функции полностью аналогичен получению поля "Представление" от ссылки, переданной в качестве параметра функции. Для примитивных типов, результатом работы функции является строка, в которую было преобразовано значение, переданное в качестве параметра. Особенностью данной функции является то, что ее результат не может быть использован в выражении. Такая особенность связана с тем фактом, что преобразование значений в строку осуществляется уже при получении данных из результата запроса, т.к. преобразование произвольного значения в строку при исполнении запроса на сервере, не осуществляется, в силу того, что при преобразовании значений в строку необходимо учитывать локальные настройки.
Использование функции Представление() имеет ряд преимуществ по сравнению с использованием поля "Представление". Например, в случае если поле, от которого получается представление, может содержать как ссылочные, так и примитивные типы, получение поля "Представление" через точку от такого поля приведет к тому, что представления для значений примитивного типа не будут получены. Если же, для такого поля применить функцию Представление(), то строковое представление будет получено вне зависимости от типа значения, содержащегося в поле. Кроме того, в случае если функция Представление() применяется к полю, которое является ссылкой более чем на три таблицы, язык запросов получает из базы данных только ссылочные значения, а значения представлений получает одним или несколькими дополнительными запросами. Такое поведение позволяет более эффективно получать представления для полей, которые ссылаются на большое количество таблиц (например, на любой справочник), за счет того, что в исполняемый запрос не будет помещаться большое количество соединений, которые необходимы для получения полей из которых состоит представление.
Применение функции Представление() также может быть полезным при получении представления поля — перечисления, в случае исполнения запроса через COM-соединение
Поле Представление
Каждая объектная таблица в информационной базе имеет виртуальное поле — "Представление". Это поле содержит текстовое представление объекта. В запросе возможно получать данное поле точно также как и другие поля таблиц, однако никакие операции с данным полем выполнять нельзя. Данная особенность связана с тем, что это поле является виртуальным, и, на самом деле, при получении данного поля из базы данных, запрос получает несколько полей, а при получении значения поля из результата запроса преобразовывает полученные значения в строку. Таким образом, единственное, что можно сделать с полем "Представление", это получить его в результат запроса.
Как следствие, результат запроса не рекомендуется упорядочивать по полю "Представление", т.к. это не приведет к желаемому результату — результат запроса будет упорядочен в порядке возрастания ссылок объектов. Подробнее об этом можно прочитать в разделе "Особенности упорядочивания по ссылочным полям".
ВЫРАЗИТЬ в запросе
Кроме преобразования строк и числа функция применяется для выделения одного типа в составных реквизитах.
Зачем использовать ВЫРАЗИТЬ для полей составного типа?
Поля составного типа — реквизиты, в которых допустимо указание значения различных типов.
В случае, когда такое поле не заполнено в нём хранится НЕОПРЕДЕЛЕНО, с которым не совсем удобно работать на выходе:
- необходимо постоянно проверять на заполнено
- если используется обращение к реквизитам через точку, при обращении возможно появление ошибки.
Пример №1:
Есть реквизит составного типа: Число+Перечисление
Если выполнить ВЫРАЗИТЬ(Реквизит как ЧИСЛО(15,0)) тогда на выходе получится NULL, что ничем не лучше.
Если вызвать ВЫРАЗИТЬ(Реквизит КАК Перечисление.ВидыЗаявок), в результате получится значение Перечисления.ВидыЗаявок.Пустая(), что вполне удобно.
Вышестоящий пример я привел для ситуации, когда удобство не так заметно.
Пример №2:
Реквизит составного типа: Справочник.ФизическиеЛица+Справочник.Сотрудники
Если вы сделаете отбор в запросе:
ГДЕ
Сотрудник ССЫЛКА Справочник.Сотрудник
У вас на выходе получатся только записи, где реквизит Сотрудник типа сотрудники, но если это поле пустое, там будет Неопределено.
В случае использования конструкции
ВЫРАЗИТЬ (Сотрудник как Справочник.Сотрудники) как ПолеСотрудник
В данном поле всегда будет значение ссылки и допустимо обращение к нему: в момент обработки результата запроса «ПолеСотрудник.Наименование», ПолеСотрудник.Пустая(), не вызывая ошибки.
Дополнительное преимущество такого использования:
В случае если составное поле имеет тип Справочник.Ссылка или Документ.Ссылка (любой справочник и любой документ, совместно) при выполнении запроса 1С присоединит все связанные таблицы:
- В лучшем случае это замедлит выполнение запроса.
- В больших конфигурациях типа УПП или ERP, такие запросы могут вызвать ошибку превышения количества таблиц в запросе — он попросту не выполнится.
Если же вы знаете, что там будет и ограничите значения функцией ВЫРАЗИТЬ, такого не происходит — и вы помогаете оптимизатору запросов, а для файловой версии это может оказаться критичным.
В типовых конфигурациях реквизит «ДокументОснование»,»ДокументОприходования», «Партия» или «Сделка», торговых документов чаще всего нуждается в таком преобразовании, т.к. составные поля используются редко: чаще разносят по различным реквизитам, которые видимы в зависимости от вида операции/ситуации.
Другие статьи про работу с ВЫРАЗИТЬ:
Реклама – самая интересная и самая трудная форма литературы.
— Олдос Хаксли.
Приведение типов в языке запросов 1С.
В этой статье разберем возможности приведения типов в языке запросов 1С, которые предоставляет функция «Выразить».
Рассмотрим несколько вариантов применения этой функции.
И первый вариант – округление чисел.
Для этого необходимо использовать функцию Выразить в следующем формате:
Выразить(<Число> как Число(<ДлинаЧисла>,<Точность>))
Где:
Число — поле, параметр которое нужно округлить
ДлинаЧисла — максимальная длина числа
Точность — точность округления числа
Параметры и длинна и точность должны быть целыми положительными числами.
Посмотрите, как работает эта функция на рисунке ниже.
Второй вариант применения – приведение строк. Очень часто в конфигурациях используются строки неограниченной длинны, что накладывает некоторые ограничения. Например, мы не можем сравнивать строки неограниченной длины.
В запросе, который приведен ниже, поле ПолноеНаименование имеет тип строка неограниченной длины, и этот запрос не будет работать.
Для того что бы он работал, необходим поле неограниченной длины привести в строку с определенной длинной, делается это при помощи функции Выразить в следующем формате:
Выразить(<Строка> как Строка(<ДлинаСтроки>)
Где
ДлинаСтроки – максимальная длина, к которой будет приведена строка.
Переделаем запрос: будем в условии приводить неограниченную строку к строке с определенной длинной. Тогда ни каких ошибок не будет.
Рассмотрим последний и, я бы сказал, самый главный вариант её применения: при работе с полями составного типа.
Ниже приведены два запроса, в которых используются поля составного типа. Первый неправильный, а второй правильный.
Т.е. когда вам нужно получить поле какого-нибудь составного типа, то всегда получайте значение этого поля только после приведения типа при помощи функции Выразить. В этом случае для документов и справочников будет следующий формат:
Выразить(<Документ> как Документ.<ИмяТаблицы>)
Выразить(<Справочник> как Справочник.< ИмяТаблицы > ).
Где
ИмяТаблицы — название объекта в конфигураторе 1С.
Всегда используйте функцию выразить, когда работаете с составными типами, это существенно оптимизирует запрос.
Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.
В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком
Для моих читателей, купон на скидку 25%: hrW0rl9Nnx
Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:
Можете перечислить любую сумму напрямую:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
One Reply to “Приведение типов в языке запросов 1С.”
Добрый день, в 1С нельзя кастовать типы в запросе. Функция выразить используется для полей составного типа, что бы оставить один из них.