Округление в запросе при помощи ВЫРАЗИТЬ()
Как я понял, мне нужно указывать константы, переменные тут не подходят.
Понимаю что можно сделать через ВЫБОР КОГДА ТОГДА, но в таком случае получится очень громоздко и некрасиво, поэтому прошу помощи у вас.
Уважаемые знатоки, подскажите пожалуйста ещё какие-нибудь варианты округления в запросе..
(1)Не хотелось бы конечно, но, в любом случае спасибо, буду иметь ввиду..
Ну и тут пример я привёл, что указываю параметр, на самом же деле, я указываю поле ДлинаДробнойЧасти из ВТПараметрыРасчета, в которых для каждого контрагента указывается до какого знака округлять расчеты по нему.. Поэтому параметром тут не передать на самом деле.. Я прост думал может быть есть ещё какие-нибудь методы помимо Выразить(), о которых я не знаю.
(2)Ну я математику не проверял конечно.. в статьях в интернете пишут что округляет, верю на слово, но всё равно спасибо
ВЫБРАТЬ
вз2.Номенклатура,
ВЫБОР
КОГДА &Разряд = 1
ТОГДА вз2.Разряд1
КОГДА &Разряд = 2
ТОГДА вз2.Разряд2
КОГДА &Разряд = 3
ТОГДА вз2.Разряд3
КОГДА &Разряд = 4
ТОГДА вз2.Разряд4
КОГДА &Разряд = 5
ТОГДА вз2.Разряд5
ИНАЧЕ вз2.Разряд6
КОНЕЦ КАК Цена
ИЗ
(ВЫБРАТЬ
вз1.Номенклатура КАК Номенклатура,
ВЫРАЗИТЬ(вз1.Сумма / вз1.Количество КАК ЧИСЛО(15, 1)) КАК Разряд1,
ВЫРАЗИТЬ(вз1.Сумма / вз1.Количество КАК ЧИСЛО(15, 2)) КАК Разряд2,
ВЫРАЗИТЬ(вз1.Сумма / вз1.Количество КАК ЧИСЛО(15, 3)) КАК Разряд3,
ВЫРАЗИТЬ(вз1.Сумма / вз1.Количество КАК ЧИСЛО(15, 4)) КАК Разряд4,
ВЫРАЗИТЬ(вз1.Сумма / вз1.Количество КАК ЧИСЛО(15, 5)) КАК Разряд5,
ВЫРАЗИТЬ(вз1.Сумма / вз1.Количество КАК ЧИСЛО(15, 6)) КАК Разряд6
ИЗ
(ВЫБРАТЬ
АвансовыйОтчетТовары.Номенклатура КАК Номенклатура,
СУММА(АвансовыйОтчетТовары.Количество) КАК Количество,
СУММА(АвансовыйОтчетТовары.Сумма) КАК Сумма
ИЗ
Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары
СГРУППИРОВАТЬ ПО
АвансовыйОтчетТовары.Номенклатура) КАК вз1) КАК вз2
(3) Если у тебя параметр, от которого зависит округление, находится в той же строке текущего запроса, то в (4) тебе отличный рецепт дали. Вместо числа знаков после запятой хранишь 10 в нужной степени и вычисляшь примерно так:
ВЫРАЗИТЬ(МояТаблица.МоёЧисло * ВТПараметрыРасчета.СтепеньОкругления + 0.5 КАК ЧИСЛО(22, 0)) / ВТПараметрыРасчета.СтепеньОкругления
где в ВТПараметрыРасчета.СтепеньОкругления у тебя будет, например, 1000 для 3х знаков после запятой
Целое число в запросе
Для округления чисел в запросе необходимо применять функцию ВЫРАЗИТЬ, для отсечения дробной части придется использовать конструкцию ВЫБОР.
Пример округления до целого:
ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))
Пример получения целой части (отсечение дробной):
ВЫБОР
КОГДА (ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))) > ЦеныМагазина.Цена
ТОГДА (ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))) — 1
ИНАЧЕ ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))
КОНЕЦ
Еще один «привет» из мира 1с — новые возможности языка запроса, которые нужно знать всем 1с-никам
Под конец года, я решил разместить еще одну небольшую статейку у вас на ресурсе, где рассмотрю некоторые относительно новые возможности языка запросов 1с. Надеюсь, что данная статья воспримется положительно.
Введение
Всем привет! В данном материале, я решил, что немного отойду от своего основного профиля — практической разработке и изучения возможностей библиотеке стандартных подсистем (БСП) и затрону работу программиста с языком запросов 1с.
Думаю, что материал данной статьи будет полезен всем разработчикам и программистам, а также все желающим, кто хочет разобраться в элементарных запросах платформы и приобщиться к касте 1с-ников). Так же данный материал подойдет как обычная «напоминалка» для программиста
Статья содержит только практические примеры использования вот этих функций языка запросов 1С — вот они:
Для реализации данных примеров можно использовать типовой конструктор запросов или типовую консоль (из предприятия), 1С: Платформу 8.3.20 и мою любимую конфигурацию «Библиотека стандартных подсистем 3.1» (3.1.7.137), режим совместимости которой я поднял до 8.3.20 (без использования). Условно, я разбил эти функции на 11 групп (по одной или несколько функций близких по смыслу).
Примеры
1.Строка(String):
2. Sin, Cos, Tan, ASin, ACos, ATan:
3. Exp, Log, Log10, Pow и Sqrt:
4.Окр(Round) и Цел(Int):
5. ДлинаСтроки(StringLength):
6. СокрЛ(TrimL), СокрП(TrimR) и СокрЛП(TrimAll):
7. Прав(Right) и Лев(Left):
8. СтрНайти(StrFind):
9. ВРег(Upper) и НРег(Lower):
10. СтрЗаменить(StrReplace):
11. РазмерХранимыхДанных(StoredDataSize):
Так, ну вроде, все проверено — все работает. При строгой типизации — ошибок в применении не будет.
Выводы статьи
Спасибо за прочтение. В материале представлены практические примеры применения новых функций языка запросов 1с. Эти функции характерны для платформы 1с предприятия версии от 8.3.20. Надеюсь, что вам понравилась данная статья и вы на один шаг приблизились к миру 1С.
ВЫРАЗИТЬ в запросах 1С 8.3 — применение на примерах
Оператор «ВЫРАЗИТЬ» в языке запросов 1С 8.3 используют в двух случаях:
- Когда необходимо преобразовать строковый или числовой тип данных к нужному виду (формату)
- Для выделения одного типа, в полях выборки имеющих составной тип данных.
Рассмотрим на примерах работу такого оператора.
ВЫРАЗИТЬ КАК Строка
Для работы со строковым типом данных такой оператор может пригодиться, когда необходимо жёстко задать размерность строки.
Синтаксис:
ВЫРАЗИТЬ(<Выражение> КАК Строка(<ДлинаСтроки>))
Пример:
ВЫБРАТЬ
ВЫРАЗИТЬ(Номенклатура.Наименование КАК Строка(1)) КАК НаименованиеДлина_1
ИЗ
Справочник.Номенклатура КАК Номенклатура

В таком примере выбираем все наименования из справочника «Номенклатура», затем с помощью конструкции «ВЫРАЗИТЬ» совместно с оператором «Строка», ограничиваем размер строки поля выборки до одного символа.
ВЫРАЗИТЬ КАК Число
В полях выборки запроса имеющих числовой тип данных, с помощью оператора «ВЫРАЗИТЬ» возможно, контролировать длину целой и дробной части числа. В случаях, когда в результате такого контроля будет уменьшено количество знаков в числе, произойдёт округление по математическим правилам.
Синтаксис:
Получите понятные самоучители по 1С бесплатно:
ВЫРАЗИТЬ(<Выражение> КАК Число(<ДлинаЦелойЧасти>.<ДлинаДробнойЧасти>))
Пример№1:
ВЫБРАТЬ
3.55 КАК НашеЧисло,
ВЫРАЗИТЬ(3.55 КАК Число(15,1)) КАК РезультатОкругления
Результат:

Пример№2:
ВЫБРАТЬ
10/3 КАК Результат,
ВЫРАЗИТЬ(10/3 КАК Число(15,2)) КАК РезультатОкругления
Результат:

Глядя на результаты примеров понятно, что оператор «ВЫРАЗИТЬ» округляет числа по правилу «до ближайшего целого».
«ВЫРАЗИТЬ» для составного типа данных и оптимизация запросов
С помощью оператора «ВЫРАЗИТЬ», для в полей имеющих составной тип данных, возможно ограничить попадание значений которые не соответствуют определённому типу данных. Причём такие ограничения можно сделать ещё на этапе выборки данных. Такие действия приводят к неявной оптимизации запросов. Рассмотрим подробно на примере.
Есть запрос, который выбирает всех покупателей, из существующих в базе документов «ПродажаТоваров». У документов такого вида реквизит «Покупатель» имеет составной тип данных:
- <СправочникСсылка.Контрагенты>
- <СправочникСсылка.Сотрудники>.
Запрос:
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК СсылкаНаДокументПродажи,
ПродажаТоваров.Покупатель КАК СсылкаНаПокупателя
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
Результат:

Следует понимать, что данные в поле «СсылкаНаПокупателя» формируются путём неявного левого соединения с таблицами «Контрагенты.Ссылка» из справочника «Контраенты» и «Сотрудники.Ссылка» из справочника «Сотрудники». Такие соединения в запросах 1С происходят, когда мы обращаемся к подчинённому полю через точку (разыменовываем поле). В нашем случае мы обращаемся к полю «Покупатель».
Визуальное представление работы такого запроса:

Если бы стояла задача отобрать только те документы, в которых покупателем был сотрудник. То наиболее оптимальным решением с точки зрения скорости выполнения запроса было бы вовсе запретить обращаться к справочнику «Контрагенты» так как данные из этого справочника для нас излишни. С такой задачей легко справится оператор «ВЫРАЗИТЬ» и запрос мог бы выглядеть так:
Запрос:
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК СсылкаНаДокументПродажи,
ВЫРАЗИТЬ(ПродажаТоваров.Покупатель КАК Справочник.Сотрудники) КАК СсылкаНаПокупателя
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
Результат:

Однако, как мы можем видеть из результата запроса, поля выборки, которые не удовлетворяют условиям нашего отбора, получили значения «NULL». По этому реализуя отборы с помощью конструкции «ВЫРАЗИТЬ» во избежание дальнейших ошибок правильно накладывать дополнительное условие, например с помощью оператора «Где». Тогда запрос мог бы выглядеть так:
Запрос:
ВЫБРАТЬ
ПродажаТоваров.Ссылка КАК СсылкаНаДокументПродажи,
ВЫРАЗИТЬ(ПродажаТоваров.Покупатель КАК Справочник.Сотрудники) КАК СсылкаНаПокупателя
ИЗ
Документ.ПродажаТоваров КАК ПродажаТоваров
Где
ПродажаТоваров.Покупатель ССЫЛКА Справочник.Сотрудники
Результат:

Возможные ошибки
С помощью оператора «ВЫРАЗИТЬ» не представляется возможным преобразование типов данных. Например, строку в число: