При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с необходимостью вывести в одной ячейке комбинированные данные. Типичный пример: нужно соединить строковый префикс и числовой показатель (например, «А-15, Б-17, Г-34»), где «34» — это результат суммирования. Основная сложность заключается в том, что язык запросов 1С накладывает жесткие ограничения на преобразование типов данных. Рассмотрим подробнее, почему возникает эта проблема и какими способами ее можно решить на уровне СКД и программного кода.
Проанализируем ситуацию с точки зрения языка запросов. В SQL-диалекте 1С функция ВЫРАЗИТЬ(... КАК СТРОКА) работает только для полей, которые уже имеют строковый тип (например, для ограничения длины неограниченных строк). Попытка применить ее к числу или дате приведет к ошибке. Также оператор «+» в запросе предназначен либо для арифметических операций с числами, либо для конкатенации строк. Смешивание типов (строка + число) запрещено платформой на уровне компиляции запроса. Именно поэтому задачу по «склеиванию» данных разных типов необходимо переносить на уровень компоновки или программной обработки.
Это самый гибкий и мощный метод, который позволяет реализовать любую логику преобразования. Разберем его по шагам:
РаботаСОтчетами. В свойствах модуля обязательно должны быть установлены флажки «Сервер» и «Вызов сервера» (или «Внешнее соединение», если отчет работает в специфических условиях).
Функция ПреобразоватьВСтрокуСПрефиксом(Префикс, Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Число") Тогда
// Используем Формат, чтобы избавиться от неразрывных пробелов в числах более 1000
Возврат Строка(Префикс) + "-" + Формат(Значение, "ЧГ=0");
Иначе
Возврат Строка(Префикс) + "-" + Строка(Значение);
КонецЕсли;
КонецФункции
РаботаСОтчетами.ПреобразоватьВСтрокуСПрефиксом("Г", ИмяПоляСЧислом)
Если мы не хотим создавать лишние модули, мы можем воспользоваться встроенным языком выражений СКД. Важно понимать, что язык выражений СКД гораздо богаче языка запросов и поддерживает функции преобразования типов.
Рассмотрим пример формирования строки непосредственно в ресурсе или вычисляемом поле:
Вариант А (Простая конкатенация): "Г-" + Формат(СуммаЗначений, "ЧГ=0")
Параметр "ЧГ=0" в функции Формат критически важен. По умолчанию 1С разделяет группы разрядов (тысячи) неразрывными пробелами. Если сумма равна 1500, то без этого параметра функция вернет "1 500", что может нарушить логику дальнейшей склейки строк. Параметр ЧГ=0 убирает это разделение.
Вариант Б (Для функции СоединитьСтроки): Если вам нужно собрать массив значений в одну строку, используйте конструкцию:
СоединитьСтроки(Массив(Представление(ПолеСтрока), Представление(ПолеЧисло)))
Функция Представление() в СКД универсальна — она приводит любой тип данных к строковому виду, пригодному для отображения пользователю.
Иногда нам нужно, чтобы поле оставалось числовым (для корректного расчета итогов), но в отчете выглядело как строка с префиксом. Для этого проанализируем настройки полей на закладке «Наборы данных».
"А-" + Формат(ИмяПоля, "ЧГ=0").В этом случае в макете отчета 1С будет выводить результат этой формулы, но при этом в группировках и итогах система продолжит оперировать исходным числовым значением. Это «чистый» способ, не требующий создания дополнительных вычисляемых полей.
Если в одном объединении (UNION) у вас приходят разные типы данных, и вы используете агрегатную функцию в ресурсах, можно применить конструкцию ВЫБОР прямо внутри функции Массив(). Это позволит подготовить данные до того, как они будут объединены в итоговую строку:
СоединитьСтроки(
Массив(
Выбор
Когда ТипЗначения(Поле) = Тип("Число")
Тогда "Г-" + Формат(Поле, "ЧГ=0")
Иначе Поле
Конец
)
)
Этот метод позволяет гибко обрабатывать ситуации, когда в одну ячейку должны попасть данные из разных веток запроса с разной логикой префиксов.
Мы выяснили причину, по которой нельзя решить задачу конкатенации типов простым запросом, и рассмотрели четыре эффективных способа реализации в СКД:
Выбор конкретного метода зависит от архитектуры вашего отчета и требований к дальнейшей обработке этих данных. В большинстве случаев использования встроенных функций СКД (Формат, Строка) в вычисляемых полях бывает вполне достаточно.