При работе с числовыми данными в 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда большие числа (например, 111 018 203) отображаются с разделителями групп разрядов. В интерфейсе программы это выглядит как неразрывные пробелы. Однако для выгрузки данных в сторонние системы или для специфических отчетов часто требуется представить это число как сплошную строку без лишних символов (111018203). В рамках данной статьи мы разберем, почему это нельзя сделать напрямую в тексте запроса и какие существуют эффективные способы решения этой задачи в различных механизмах платформы.
Прежде всего, нам необходимо проанализировать, как 1С работает с типом Число. Важно понимать разницу между хранением данных и их представлением. В базе данных (будь то MS SQL Server, PostgreSQL или встроенная СУБД) число хранится в чистом виде, без каких-либо пробелов или форматирования. Пробелы, которые мы видим на форме или в результате запроса, — это визуальное представление, которое платформа 1С добавляет автоматически для удобства чтения пользователем. Символ, разделяющий разряды, обычно является «неразрывным пробелом» (код символа 160).
Рассмотрим ситуацию: если тип реквизита определен как Число(20, 0), то в нем гарантированно нет символов строки. Все манипуляции по «превращению» его в строку без пробелов должны происходить на уровне вывода данных, а не в самом теле запроса к СУБД.
Многие начинающие разработчики пытаются найти в языке запросов функции, аналогичные SQL-операторам CAST или CONVERT. Однако мы должны учитывать, что язык запросов 1С является декларативным и кроссплатформенным. Платформа транслирует запрос 1С в соответствующий диалект SQL конкретной СУБД. Прямой функции преобразования произвольного числа в строку в языке запросов 1С не предусмотрено. Это сделано для обеспечения идентичного поведения системы на разных СУБД, где механизмы преобразования типов могут существенно различаться.
Поэтому, если вам нужно получить число в строковом виде без пробелов, мы будем использовать механизмы оформления вывода. Для передачи данных в системы без API используется платформа для создания программных роботов, работающая через графический интерфейс.
Если ваша задача — вывести данные в отчет, то самым правильным и технологичным способом будет использование настроек СКД. Проанализируем два варианта настройки в компоновке:
Вариант А: Свойство «Оформление»
Наборы данных.Оформление нажмем на кнопку выбора.Формат.Группировка и выберем значение 0 (или в поле форматная строка впишем ЧГ=0).Этот метод не меняет тип данных (число остается числом), но визуально в отчете оно будет выглядеть как строка без пробелов.
Вариант Б: Выражение представления
Если вам нужно, чтобы платформа считала выводимое значение строкой, мы можем воспользоваться полем Выражение представления в СКД. Разберем пример выражения:
Формат(ИмяПоляЧисло, "ЧГ=0")
В этом случае при генерации отчета система применит функцию форматирования к каждому значению поля.
Часто задача преобразования возникает при быстрой отладке в консоли запросов. Рассмотрим, как это сделал автор исходного вопроса. Современные консоли запросов позволяют настраивать формат отображения колонок программно.
Посмотрим на алгоритм действий:
Настройка колонок.Конструктор форматной строки.ЧГ=0 (ЧГ — число, группировка).Это позволит скопировать результат из консоли, например, в Excel или текстовый файл уже в нужном «слитном» формате. Правильное форматирование необходимо для корректной работы обработки загрузки отчетов из Excel в 1С, которая исключает ошибки при импорте данных.
Если результат запроса обрабатывается в коде (например, в модуле обработки или менеджере объекта), мы выполняем преобразование при обходе выборки. Выясним, как это реализовать наиболее эффективно. Если такая обработка данных является частью подготовки к обмену, для контроля корректности проводок используется инструмент автоматической выверки баз 1С.
Рассмотрим пример кода:
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Преобразуем число в строку без пробелов группировки
СтроковоеЗначение = Формат(Выборка.ЧисловоеПоле, "ЧГ=0");
// Теперь переменную СтроковоеЗначение можно использовать для записи в файл или передачи в API
Сообщить(СтроковоеЗначение);
КонецЦикла;
Функция Формат() с параметром ЧГ=0 является универсальным инструментом в 1С для удаления разделителей групп разрядов. По умолчанию в 1С установлена группировка по 3 знака, разделенная неразрывным пробелом. Установка значения 0 полностью отключает это поведение.
Бывают случаи, когда строковое представление числа без пробелов нужно использовать для дальнейших вычислений внутри самой схемы компоновки данных. Для этого создадим Вычисляемое поле.
Вычисляемые поля.ЧислоСтрокой.Выражение напишем: Строка(Формат(ИмяПоляЧисло, "ЧГ=0")).Использование вложенной функции Строка() гарантирует приведение типа, хотя для целей отображения достаточно и одного Формат().
Некоторые разработчики пытаются использовать ПОДСТРОКА или другие строковые функции внутри запроса, чтобы «собрать» число по частям. Мы настоятельно рекомендуем избегать этого пути. Во-первых, это крайне негативно сказывается на производительности запроса. Во-вторых, длина числа может меняться, что сделает ваш код хрупким и подверженным ошибкам. Все задачи форматирования — это задачи уровня представления (UI) или уровня бизнес-логики (код 1С), но не уровня доступа к данным (SQL).
Таким образом, мы выяснили, что наиболее правильным подходом является использование форматной строки "ЧГ=0". Этот метод применим практически везде: в свойствах полей отчета, в программном коде и в настройках консоли запросов. Проанализировав все способы, вы можете выбрать тот, который лучше всего подходит для вашей конкретной задачи.