Часто в процессе разработки отчетов или обработки данных возникает необходимость вывести информацию в виде комбинации значений. Например, нам нужно отобразить результат группировки в формате 4/5, где каждое число является результатом работы агрегатной функции КОЛИЧЕСТВО. Рассмотрим, как правильно реализовать это в языке запросов 1С, избегая ошибок и лишних преобразований.
Многие разработчики на первых этапах пытаются решить задачу вывода чисел в строку с помощью функции ПРЕДСТАВЛЕНИЕ. Хотя этот метод позволяет получить строковое значение, он имеет существенные недостатки:
ПРЕДСТАВЛЕНИЕ учитывает настройки системы, что может приводить к появлению лишних пробелов или специфических символов форматирования чисел (например, неразрывных пробелов в тысячных разрядах).ПРЕДСТАВЛЕНИЕ, зачастую приводит к ошибкам несовместимости типов или к непредсказуемому поведению системы.Начиная с версии платформы 8.3.20, разработчики 1С получили удобный инструмент — прямое приведение типов непосредственно в тексте запроса. Теперь мы можем использовать функцию СТРОКА, которая позволяет преобразовать результат агрегатной функции или числового поля в строковый тип. Это открывает возможность для использования оператора сложения + для объединения данных.
Рассмотрим пошагово, как это реализовать:
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...)).СТРОКА()."/") с помощью знака +.Представим, что у нас есть два числовых поля, полученных в результате группировки. Вместо того чтобы создавать временные таблицы с ПРЕДСТАВЛЕНИЕ, мы можем сформировать итоговое поле прямо в основном запросе:
ВЫБРАТЬ
ВТ.Ссылка,
СТРОКА(КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ.ЗаказКлиента)) + "/" + СТРОКА(КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПриобретениеТоваровУслуг.Ссылка)) КАК ИтоговоеПредставление
ИЗ
ВТ КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ
Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
ПО
ВТ.ЗаказКлиента = ПриобретениеТоваровУслуг.ЗаказПоставщику
СГРУППИРОВАТЬ ПО
ВТ.Ссылка
Для того чтобы ваш запрос работал стабильно и не вызывал ошибок, примите во внимание следующие советы:
8.3.20 или выше. В более ранних версиях попытка прямого приведения агрегатных функций к строке может вызвать ошибку синтаксиса.СТРОКА() для каждого элемента отдельно перед тем, как добавлять к ним разделители. Не пытайтесь складывать числа до преобразования, иначе система выполнит математическое сложение (арифметическую сумму), а не конкатенацию.ВЫРАЗИТЬ или использовать фильтры ГДЕ для исключения пустых значений или нецелевых типов данных.СТРОКА в запросе предпочтительнее создания промежуточных временных таблиц с ПРЕДСТАВЛЕНИЕ, так как это снижает нагрузку на базу данных и делает код более читаемым для других разработчиков.Таким образом, использование оператора СТРОКА позволяет нам легко формировать нужные строковые представления данных «на лету». Это избавляет от необходимости писать сложный код на стороне 1С (в процедурах вывода данных) и позволяет сразу получать готовый для отчетов результат.