При написании запросов в системе 1С:Предприятие разработчики часто сталкиваются с необходимостью вывести данные в удобном для пользователя виде. Типичная задача — добавить пояснительный текст перед числовым значением прямо в выборке, например: "Количество файлов: 5". Однако попытка выполнить простую конкатенацию строки и числа (или использование функции ВЫРАЗИТЬ) приводит к ошибке. Рассмотрим подробнее, почему так происходит, и разберем все возможные способы решения этой задачи.
Проанализируем ситуацию: язык запросов 1С основан на стандартах SQL, но имеет существенные ограничения для обеспечения кроссплатформенности. В 1С реализована строгая типизация в рамках запроса. Это означает, что оператор "+" применим только к операндам одного типа — либо к двум числам (сложение), либо к двум строкам (конкатенация).
Основные причины, по которым запрос автора из примера не работает:
ВЫРАЗИТЬ в языке запросов 1С предназначена для приведения ссылок к конкретному типу или для ограничения длины строк. Она не умеет преобразовывать базовые типы данных, такие как Число, в тип Строка.ПРЕДСТАВЛЕНИЕ и возвращает строку, она является "виртуальной". Результат её работы нельзя использовать в других операциях (склеивать, сравнивать или группировать), так как он формируется платформой уже в момент получения данных клиентом, а не на уровне СУБД.Выясним, какие существуют обходные пути, чтобы получить желаемый результат.
Это самый правильный и архитектурно верный метод. В 1С принято разделять получение "сырых" данных и их визуальное представление. Для этого идеально подходят Вычисляемые поля в СКД.
Разберем по шагам, как это реализовать:
КоличествоСПояснением."Количество файлов: " + Строка(КоличествоФайлов).В отличие от запроса, в выражениях СКД доступен практически весь функционал встроенного языка 1С, включая функции преобразования типов и форматирования.
Если вам необходимо динамически подставить строку или обойти ограничения жесткого кодинга, можно воспользоваться методом замены текста перед выполнением запроса. Посмотрим на пример кода:
ТекстЗапроса =
"ВЫБРАТЬ
| ""&Пояснение"" КАК Пояснение,
| Количество(Файлы.Ссылка) КАК Кол
|ИЗ
| Справочник.ЗаказПокупателяПрисоединенныеФайлы КАК Файлы";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Пояснение", "Количество файлов по заявке: ");
Запрос.Текст = ТекстЗапроса;
Хотя этот метод позволяет подставить строку, он все равно вернет два разных поля. Если же нужно именно одно объединенное поле, то в самом запросе штатными средствами этого сделать нельзя.
Проанализируем ситуацию, когда данные нужно вывести, например, в текстовое сообщение или лог. В этом случае правильнее всего будет склеить строку уже при обходе выборки. Рассмотрим пример:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекстДляВывода = "Количество файлов: " + Формат(Выборка.Количество, "ЧГ=0");
Сообщить(ТекстДляВывода);
КонецЦикла;
Использование функции Формат предпочтительнее, чем Строка, так как она позволяет избежать появления неразрывных пробелов в группах разрядов (например, "1 000" вместо "1000").
Если логика формирования строки очень сложная (например, нужно склонять слова в зависимости от числа), можно использовать функции общих модулей в СКД. Для этого у общего модуля должен стоять флаг "Сервер" и "Внешнее соединение".
Пример выражения в вычисляемом поле СКД:
ОбщийМодульСтроковыеФункции.СформироватьПояснение(КоличествоФайлов)
Если ваша цель — просто показать пользователю красивый текст в отчете или динамическом списке, используйте Условное оформление. В параметрах оформления можно задать свойство Текст, которое будет отображаться вместо реального значения поля, при этом само значение останется числом, что позволит корректно считать итоги по колонке.
Существует теоретическая возможность "разобрать" число на символы прямо в запросе, используя математические операции (остаток от деления) и оператор ВЫБОР. Однако мы крайне не рекомендуем использовать этот метод, так как он катастрофически снижает читаемость кода и производительность системы.
Пример логики для одной цифры:
ВЫБОР
КОГДА Число % 10 = 1 ТОГДА "1"
КОГДА Число % 10 = 2 ТОГДА "2"
...
ИНАЧЕ "0"
КОНЕЦ
Подведем итог: если вам требуется конкатенация строки и числа, не пытайтесь заставить запрос делать то, для чего он не предназначен. Используйте инструменты СКД или обрабатывайте результат программно во встроенном языке 1С. Это обеспечит стабильность работы программы и чистоту вашего кода.