Как в запросе 1С объединить число и строку: все способы от классических до современных

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

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

Решение 1: Современный подход (Платформа 8.3.20 и выше)

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


ВЫБРАТЬ
    СТРОКА(Документ.ДопустимоеЧислоДнейЗадолженности) + " дней" КАК СрокСтрокой
ИЗ
    Документ.ДоговорКонтрагента КАК Документ

Важный нюанс: при использовании СТРОКА() в запросе платформа применяет стандартные региональные настройки. Это значит, что если число большое (например, 1000), в строке может появиться неразрывный пробел в качестве разделителя разрядов («1 000 дней»). Если вам нужно избавиться от пробелов, в последних версиях платформы можно добавить функцию СТРЗАМЕНИТЬ прямо в запрос.

Решение 2: Использование Системы компоновки данных (СКД)

Если ваша задача — вывести данные в отчете, то выполнять объединение в самом запросе не только сложно (в старых версиях), но и не всегда правильно с точки зрения производительности СУБД. В СКД для этого предназначены Вычисляемые поля.

Рассмотрим алгоритм настройки:

  1. Перейдем на вкладку Вычисляемые поля в схеме компоновки.
  2. Добавим новое поле, например СрокДней.
  3. В колонке «Выражение» напишем формулу, используя функции встроенного языка:

Строка(ДопустимоеЧислоДнейЗадолженности) + " дней"
// Или с форматированием, чтобы убрать пробелы-разделители:
Формат(ДопустимоеЧислоДнейЗадолженности, "ЧГ=0") + " дней"

Этот метод считается наиболее «чистым», так как запрос остается простым и эффективным, а за оформление отвечает специальный механизм компоновки. Вы также можете использовать Макет поля, указав тип заполнения «Шаблон» и вписав текст вида [ЧислоПоле] дней. Для изучения практических приемов форматирования и вычислений подойдут примеры отчетов на СКД с использованием сложных выражений.

Решение 3: Динамические списки и шаблоны (Платформа 8.3.12+)

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

В конструкторе формата выберите вкладку Шаблон и задайте маску вывода. Например, [Число] дней. Платформа сама подставит значение из запроса в этот шаблон при отрисовке интерфейса. Это экономит ресурсы сервера, так как преобразование происходит на клиенте.

Решение 4: «Хак» через временные таблицы (для старых версий)

Если вы работаете на старой версии платформы (ниже 8.3.20) и вам критично получить строку именно в запросе (например, для передачи во внешнюю систему), придется использовать сложные конструкции. Один из самых надежных способов — создание соответствия цифр и их строковых представлений.

Рассмотрим пример построения числа до 99 через соединение таблиц:


// Создаем таблицу цифр
ВЫБРАТЬ 0 КАК Цифра, "0" КАК Текст ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 1, "1" ОБЪЕДИНИТЬ ВСЕ 
// ... и так далее до 9
ВЫБРАТЬ 9, "9";

// Собираем число из десятков и единиц
ВЫБРАТЬ
    Т1.Текст + Т2.Текст + " дней" КАК Результат
ИЗ
    ВТ_Данные КАК Данные
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цифры КАК Т1 
        ПО ВЫРАЗИТЬ(Данные.Число / 10 - 0.5 КАК ЧИСЛО(2, 0)) = Т1.Цифра
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цифры КАК Т2 
        ПО (Данные.Число - ВЫРАЗИТЬ(Данные.Число / 10 - 0.5 КАК ЧИСЛО(2, 0)) * 10) = Т2.Цифра

Этот метод выглядит громоздко, но он работает на любой версии платформы 8.x, так как использует только базовые операции ВЫРАЗИТЬ и математические действия. Выясним причину выбора такого метода: он гарантирует результат на уровне SQL, не требуя постобработки в коде 1С.

Решение 5: Математический метод через ПОДСТРОКА и секунды

Существует еще один экзотический, но лаконичный способ преобразовать число в строку, используя работу с датами. Мы можем добавить число в качестве секунд к «нулевой» дате и извлечь символы из представления времени.


ВЫБРАТЬ
    ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ЧислоПоле * 6)) / 6 + 1, 1) КАК Строка
ИЗ 
    ВТ_Данные

Здесь используется особенность функции СЕКУНДА и ПОДСТРОКА. Мы «прокручиваем» время и вычисляем позицию нужной цифры в эталонной строке. Однако стоит помнить, что этот метод сложен в отладке и сопровождении, поэтому рекомендуется только в исключительных случаях. Для быстрой проверки и отладки подобных алгоритмов можно использовать консоль запросов с поддержкой тонкого клиента и СКД.

Рекомендации по выбору решения

Проанализировав все ситуации, можно вывести простое правило:

  1. Если у вас современная платформа 8.3.20+ — используйте функцию СТРОКА() прямо в запросе.
  2. Если вы делаете отчет на СКД — делайте объединение в Вычисляемых полях или через Макет. Это стандарт разработки.
  3. Если нужно просто отобразить данные в списке — используйте Шаблон в свойствах формата колонки.
  4. К «хакам» с временными таблицами и математикой прибегайте только тогда, когда первые три варианта технически невозможны.

Помните, что преобразование типов в запросе — это ресурсоемкая операция для СУБД. Всегда старайтесь переносить форматирование данных на «верхние» уровни системы (интерфейс или компоновка), оставляя запрос максимально легким.

← На главную