Как преобразовать число в строку и убрать пробелы в запросе или отчете 1С

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

При работе с числовыми данными в 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда большие числа (например, 111 018 203) отображаются с разделителями групп разрядов. В интерфейсе программы это выглядит как неразрывные пробелы. Однако для выгрузки данных в сторонние системы или для специфических отчетов часто требуется представить это число как сплошную строку без лишних символов (111018203). В рамках данной статьи мы разберем, почему это нельзя сделать напрямую в тексте запроса и какие существуют эффективные способы решения этой задачи в различных механизмах платформы.

Особенности хранения и отображения чисел в 1С

Прежде всего, нам необходимо проанализировать, как 1С работает с типом Число. Важно понимать разницу между хранением данных и их представлением. В базе данных (будь то MS SQL Server, PostgreSQL или встроенная СУБД) число хранится в чистом виде, без каких-либо пробелов или форматирования. Пробелы, которые мы видим на форме или в результате запроса, — это визуальное представление, которое платформа 1С добавляет автоматически для удобства чтения пользователем. Символ, разделяющий разряды, обычно является «неразрывным пробелом» (код символа 160).

Рассмотрим ситуацию: если тип реквизита определен как Число(20, 0), то в нем гарантированно нет символов строки. Все манипуляции по «превращению» его в строку без пробелов должны происходить на уровне вывода данных, а не в самом теле запроса к СУБД.

Ограничения языка запросов 1С

Многие начинающие разработчики пытаются найти в языке запросов функции, аналогичные SQL-операторам CAST или CONVERT. Однако мы должны учитывать, что язык запросов 1С является декларативным и кроссплатформенным. Платформа транслирует запрос 1С в соответствующий диалект SQL конкретной СУБД. Прямой функции преобразования произвольного числа в строку в языке запросов 1С не предусмотрено. Это сделано для обеспечения идентичного поведения системы на разных СУБД, где механизмы преобразования типов могут существенно различаться.

Поэтому, если вам нужно получить число в строковом виде без пробелов, мы будем использовать механизмы оформления вывода. Для передачи данных в системы без API используется платформа для создания программных роботов, работающая через графический интерфейс.

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

Если ваша задача — вывести данные в отчет, то самым правильным и технологичным способом будет использование настроек СКД. Проанализируем два варианта настройки в компоновке:

Вариант А: Свойство «Оформление»

  1. Откроем схему компоновки данных и перейдем на закладку Наборы данных.
  2. Найдем нужное числовое поле.
  3. В колонке Оформление нажмем на кнопку выбора.
  4. В появившемся окне найдем параметр Формат.
  5. В конструкторе форматной строки установим флажок Группировка и выберем значение 0 (или в поле форматная строка впишем ЧГ=0).

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

Вариант Б: Выражение представления

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

Формат(ИмяПоляЧисло, "ЧГ=0")

В этом случае при генерации отчета система применит функцию форматирования к каждому значению поля.

Решение 2: Работа в консоли запросов

Часто задача преобразования возникает при быстрой отладке в консоли запросов. Рассмотрим, как это сделал автор исходного вопроса. Современные консоли запросов позволяют настраивать формат отображения колонок программно.

Посмотрим на алгоритм действий:

  1. Выполним запрос в консоли.
  2. Нажмем правой кнопкой мыши на колонку с числом или найдем кнопку Настройка колонок.
  3. Вызовем Конструктор форматной строки.
  4. Укажем параметр ЧГ=0 (ЧГ — число, группировка).

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

Решение 3: Преобразование в программном коде

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

Рассмотрим пример кода:


РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Преобразуем число в строку без пробелов группировки
    СтроковоеЗначение = Формат(Выборка.ЧисловоеПоле, "ЧГ=0");
    
    // Теперь переменную СтроковоеЗначение можно использовать для записи в файл или передачи в API
    Сообщить(СтроковоеЗначение);
КонецЦикла;

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

Решение 4: Вычисляемые поля СКД

Бывают случаи, когда строковое представление числа без пробелов нужно использовать для дальнейших вычислений внутри самой схемы компоновки данных. Для этого создадим Вычисляемое поле.

  1. Перейдем на закладку Вычисляемые поля.
  2. Добавим новое поле, назовем его, например, ЧислоСтрокой.
  3. В поле Выражение напишем: Строка(Формат(ИмяПоляЧисло, "ЧГ=0")).

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

Почему не стоит использовать строковые функции в запросе

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

Таким образом, мы выяснили, что наиболее правильным подходом является использование форматной строки "ЧГ=0". Этот метод применим практически везде: в свойствах полей отчета, в программном коде и в настройках консоли запросов. Проанализировав все способы, вы можете выбрать тот, который лучше всего подходит для вашей конкретной задачи.

← На главную