При разработке отчетов и запросов в 1С часто возникает необходимость вывести числовое значение вместе со строковыми символами, например, добавить знак процента % к рассчитанной доле затрат. Однако при попытке выполнить конкатенацию вида Число + "%" прямо в запросе платформа возвращает ошибку «Неверные параметры +». Разберем причины возникновения этой ошибки, а также проанализируем различные способы её решения в зависимости от версии платформы и архитектуры отчета.
Проанализируем, почему стандартное сложение строки и числа не работает внутри языка запросов 1С:
+ является исключительно бинарным строковым оператором. Он требует, чтобы оба операнда имели строковый тип. Если один из операндов является числом, платформа не выполняет неявное приведение типов и возвращает ошибку.ВЫРАЗИТЬ(): Оператор ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) не предназначен для преобразования чисел в строки. В языке запросов он используется только для приведения типов составных ссылок или для ограничения длины уже существующего строкового поля. Попытка применить его к числовому выражению приводит к синтаксической ошибке.Рассмотрим классический способ решения задачи для платформы 1С:Предприятие 8.1, 8.2 и ранних версий 8.3. Оставим в самом запросе чистый числовой расчет, а форматирование и добавление знака процента выполним во встроенном языке 1С при обходе результата запроса.
В запросе формируем числовое поле без попыток конкатенации:
ВЫБОР
КОГДА Затраты.ПлановыеЗатраты <> 0
ТОГДА ВЫРАЗИТЬ(Затраты.ФактическиеЗатраты / Затраты.ПлановыеЗатраты * 100 КАК ЧИСЛО(20, 2))
ИНАЧЕ 0
КОНЕЦ КАК Процент
Далее при обработке выборки или заполнении табличного документа преобразуем числовое значение в строку с помощью функции Формат():
Пока Выборка.Следующий() Цикл
ТекПроцент = Формат(Выборка.Процент, "ЧДЦ=2") + "%";
// Вывод значения в макет или таблицу
КонецЦикла;
Также можно использовать специальную строку формата для автоматического подставления символа процента без ручного сложения строк:
СтрокаПроцента = Формат(Выборка.Процент, "ЧДЦ=2; ЧФ='N%'");
Если отчет разрабатывается с использованием СКД, нет необходимости преобразовывать число в строку в тексте запроса. Посмотрим на два удобных встроенных механизма СКД:
Наборы данных или Поля для поля Процент установим значение свойства Оформление -> Формат. Зададим форматную строку ЧДЦ=2; ЧФ='N%'. В этом случае значение в отчете отобразится как 55.00%, но в ресурсах и итогах оно останется числом.Вычисляемые поля создадим новое поле со строковым выражением: Строка(Формат(Процент, "ЧДЦ=2")) + "%".Начиная с версии платформы 1С:Предприятие 8.3.20, в язык запросов была добавлена штатная функция СТРОКА(), которая позволяет преобразовывать примитивные типы (включая числа) в строку непосредственно в запросе.
Рассмотрим пример запроса для современных версий платформы:
ВЫБОР
КОГДА Затраты.ПлановыеЗатраты <> 0
ТОГДА СТРОКА(ВЫРАЗИТЬ(Затраты.ФактическиеЗатраты / Затраты.ПлановыеЗатраты * 100 КАК ЧИСЛО(20, 2))) + "%"
ИНАЧЕ "0%"
КОНЕЦ КАК Процент
Важная рекомендация: Если данные в дальнейшем требуют сортировки, группировки или подведения итогов по сумме, рекомендуется оставлять поле числовым в запросе и применять форматирование исключительно на этапе отображения данных.