Как выполнить конкатенацию числа и строки в запросе 1С и вывести знак процента?

Программист 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При разработке отчетов и запросов в 1С часто возникает необходимость вывести числовое значение вместе со строковыми символами, например, добавить знак процента % к рассчитанной доле затрат. Однако при попытке выполнить конкатенацию вида Число + "%" прямо в запросе платформа возвращает ошибку «Неверные параметры +». Разберем причины возникновения этой ошибки, а также проанализируем различные способы её решения в зависимости от версии платформы и архитектуры отчета.

Выясним причину ошибки «Неверные параметры +»

Проанализируем, почему стандартное сложение строки и числа не работает внутри языка запросов 1С:

  1. Строгая типизация оператора конкатенации: В языке запросов 1С оператор + является исключительно бинарным строковым оператором. Он требует, чтобы оба операнда имели строковый тип. Если один из операндов является числом, платформа не выполняет неявное приведение типов и возвращает ошибку.
  2. Ограничение конструкции ВЫРАЗИТЬ(): Оператор ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) не предназначен для преобразования чисел в строки. В языке запросов он используется только для приведения типов составных ссылок или для ограничения длины уже существующего строкового поля. Попытка применить его к числовому выражению приводит к синтаксической ошибке.

Вариант 1. Постобработка результата запроса в коде (для обычных форм)

Рассмотрим классический способ решения задачи для платформы 1С:Предприятие 8.1, 8.2 и ранних версий 8.3. Оставим в самом запросе чистый числовой расчет, а форматирование и добавление знака процента выполним во встроенном языке 1С при обходе результата запроса.

В запросе формируем числовое поле без попыток конкатенации:


ВЫБОР
	КОГДА Затраты.ПлановыеЗатраты <> 0
		ТОГДА ВЫРАЗИТЬ(Затраты.ФактическиеЗатраты / Затраты.ПлановыеЗатраты * 100 КАК ЧИСЛО(20, 2))
	ИНАЧЕ 0
КОНЕЦ КАК Процент

Далее при обработке выборки или заполнении табличного документа преобразуем числовое значение в строку с помощью функции Формат():


Пока Выборка.Следующий() Цикл
	ТекПроцент = Формат(Выборка.Процент, "ЧДЦ=2") + "%";
	// Вывод значения в макет или таблицу
КонецЦикла;

Также можно использовать специальную строку формата для автоматического подставления символа процента без ручного сложения строк:

СтрокаПроцента = Формат(Выборка.Процент, "ЧДЦ=2; ЧФ='N%'");

Вариант 2. Настройка вывода в Системе компоновки данных (СКД)

Если отчет разрабатывается с использованием СКД, нет необходимости преобразовывать число в строку в тексте запроса. Посмотрим на два удобных встроенных механизма СКД:

  1. Настройка формата ячейки: В вкладке Наборы данных или Поля для поля Процент установим значение свойства Оформление -> Формат. Зададим форматную строку ЧДЦ=2; ЧФ='N%'. В этом случае значение в отчете отобразится как 55.00%, но в ресурсах и итогах оно останется числом.
  2. Вычисляемые поля: На вкладке Вычисляемые поля создадим новое поле со строковым выражением: Строка(Формат(Процент, "ЧДЦ=2")) + "%".

Вариант 3. Использование встроенной функции СТРОКА() в запросе (для платформы 1С 8.3.20 и новее)

Начиная с версии платформы 1С:Предприятие 8.3.20, в язык запросов была добавлена штатная функция СТРОКА(), которая позволяет преобразовывать примитивные типы (включая числа) в строку непосредственно в запросе.

Рассмотрим пример запроса для современных версий платформы:


ВЫБОР
	КОГДА Затраты.ПлановыеЗатраты <> 0
		ТОГДА СТРОКА(ВЫРАЗИТЬ(Затраты.ФактическиеЗатраты / Затраты.ПлановыеЗатраты * 100 КАК ЧИСЛО(20, 2))) + "%"
	ИНАЧЕ "0%"
КОНЕЦ КАК Процент

Важная рекомендация: Если данные в дальнейшем требуют сортировки, группировки или подведения итогов по сумме, рекомендуется оставлять поле числовым в запросе и применять форматирование исключительно на этапе отображения данных.

← На главную