Как объединить строки и числа в одну ячейку в отчете СКД 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с необходимостью вывести в одной ячейке комбинированные данные. Типичный пример: нужно соединить строковый префикс и числовой показатель (например, «А-15, Б-17, Г-34»), где «34» — это результат суммирования. Основная сложность заключается в том, что язык запросов 1С накладывает жесткие ограничения на преобразование типов данных. Рассмотрим подробнее, почему возникает эта проблема и какими способами ее можно решить на уровне СКД и программного кода.

Почему нельзя просто сложить строку и число в запросе?

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

Способ 1. Использование общего модуля в вычисляемых полях

Это самый гибкий и мощный метод, который позволяет реализовать любую логику преобразования. Разберем его по шагам:

  1. Создание модуля: Создадим в конфигураторе новый общий модуль, например, с именем РаботаСОтчетами. В свойствах модуля обязательно должны быть установлены флажки «Сервер» и «Вызов сервера» (или «Внешнее соединение», если отчет работает в специфических условиях).
  2. Написание функции: Напишем экспортную функцию, которая будет принимать префикс и значение, выполнять их преобразование и возвращать готовую строку.
    
    Функция ПреобразоватьВСтрокуСПрефиксом(Префикс, Значение) Экспорт
        Если ТипЗнч(Значение) = Тип("Число") Тогда
            // Используем Формат, чтобы избавиться от неразрывных пробелов в числах более 1000
            Возврат Строка(Префикс) + "-" + Формат(Значение, "ЧГ=0");
        Иначе
            Возврат Строка(Префикс) + "-" + Строка(Значение);
        КонецЕсли;
    КонецФункции
    
  3. Настройка в СКД: Перейдем в схему компоновки данных на закладку «Вычисляемые поля». Добавим новое поле, укажем его заголовок, а в колонке «Выражение» пропишем вызов нашей функции:

    РаботаСОтчетами.ПреобразоватьВСтрокуСПрефиксом("Г", ИмяПоляСЧислом)

Способ 2. Использование функции Формат() и Представление() в выражениях СКД

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

Рассмотрим пример формирования строки непосредственно в ресурсе или вычисляемом поле:

Вариант А (Простая конкатенация): "Г-" + Формат(СуммаЗначений, "ЧГ=0")

Параметр "ЧГ=0" в функции Формат критически важен. По умолчанию 1С разделяет группы разрядов (тысячи) неразрывными пробелами. Если сумма равна 1500, то без этого параметра функция вернет "1 500", что может нарушить логику дальнейшей склейки строк. Параметр ЧГ=0 убирает это разделение.

Вариант Б (Для функции СоединитьСтроки): Если вам нужно собрать массив значений в одну строку, используйте конструкцию:

СоединитьСтроки(Массив(Представление(ПолеСтрока), Представление(ПолеЧисло)))

Функция Представление() в СКД универсальна — она приводит любой тип данных к строковому виду, пригодному для отображения пользователю.

Способ 3. Использование "Выражения представления" для полей набора данных

Иногда нам нужно, чтобы поле оставалось числовым (для корректного расчета итогов), но в отчете выглядело как строка с префиксом. Для этого проанализируем настройки полей на закладке «Наборы данных».

  1. Найдите нужное числовое поле.
  2. В колонке «Выражение представления» напишите формулу: "А-" + Формат(ИмяПоля, "ЧГ=0").

В этом случае в макете отчета 1С будет выводить результат этой формулы, но при этом в группировках и итогах система продолжит оперировать исходным числовым значением. Это «чистый» способ, не требующий создания дополнительных вычисляемых полей.

Способ 4. Сложная логика внутри функции СоединитьСтроки

Если в одном объединении (UNION) у вас приходят разные типы данных, и вы используете агрегатную функцию в ресурсах, можно применить конструкцию ВЫБОР прямо внутри функции Массив(). Это позволит подготовить данные до того, как они будут объединены в итоговую строку:


СоединитьСтроки(
    Массив(
        Выбор 
            Когда ТипЗначения(Поле) = Тип("Число") 
            Тогда "Г-" + Формат(Поле, "ЧГ=0") 
            Иначе Поле 
        Конец
    )
)

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

Подведем итоги

Мы выяснили причину, по которой нельзя решить задачу конкатенации типов простым запросом, и рассмотрели четыре эффективных способа реализации в СКД:

Выбор конкретного метода зависит от архитектуры вашего отчета и требований к дальнейшей обработке этих данных. В большинстве случаев использования встроенных функций СКД (Формат, Строка) в вычисляемых полях бывает вполне достаточно.

← На главную