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

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

При работе в 1С разработчики часто сталкиваются с ситуацией, когда числовые данные (например, год, полученный с помощью функции ГОД(), или числовой код) выводятся на экран или в отчет с пробелом посередине: 2 018 вместо 2018. Это происходит из-за автоматического применения региональных настроек операционной системы, которые группируют разряды чисел для удобства чтения.

В этой статье мы подробно разберем, почему возникает эта проблема, как управлять отображением чисел в компоновке данных (СКД), рассмотрим современные возможности платформы 1С для работы со строками в запросах, а также разберем смежную задачу — очистку СНИЛС и других кодов от лишних дефисов и пробелов.

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

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

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

Решение 1. Настройка формата вывода в Системе компоновки данных (СКД)

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

Способ А. Через свойства поля набора данных:

  1. Откроем конструктор схемы компоновки данных и перейдем на вкладку Наборы данных.
  2. Найдем в таблице поле, содержащее год (или число, разделители которого нужно скрыть).
  3. В колонке Оформление нажмем на кнопку выбора (три точки).
  4. В открывшемся окне параметров оформления найдем свойство Формат и нажмем кнопку выбора.
  5. В конструкторе формата установим флажок Группировка и выберем значение Не использовать. Альтернативный вариант — в поле «Форматная строка» вручную вписать код: ЧГ=0 (что означает «Число: Группировка = 0»).
  6. Нажмем ОК для сохранения настроек.

Способ Б. Через Условное оформление:

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

  1. Перейдем на вкладку Условное оформление в нижней части конструктора настроек СКД.
  2. Добавим новый элемент оформления.
  3. В поле Оформление выберем параметр Формат и укажем значение ЧГ=0.
  4. В поле Оформляемые поля выберем наше числовое поле (например, «Год»).
  5. При необходимости в поле Условие зададим правила, при которых форматирование должно применяться.

Решение 2. Преобразование числа в строку в коде 1С

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

Рассмотрим классический метод с использованием функции Формат():


ГодЧислом = ГОД(ТекущаяДата()); // Возвращает число 2026
ГодСтрокой = Формат(ГодЧислом, "ЧГ=0"); // Преобразует в строку "2026" без пробелов

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


// Этот метод работает в 2.5–3 раза быстрее, чем Формат() с маской "ЧГ=0"
ГодСтрокой = XMLСтрока(ГодЧислом); 

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

Решение 3. Современный подход в запросах (для платформы 8.3.20 и выше)

Начиная с версии платформы 8.3.20.1549, разработчики получили долгожданную возможность преобразовывать типы и манипулировать строками непосредственно внутри языка запросов. Теперь решить проблему с преобразованием числа в строку без разделителей можно прямо в СУБД.

Посмотрим на пример запроса, использующего новые функции преобразования типов:


ВЫБРАТЬ
    Строка(ГОД(Док.Дата)) КАК ГодСтрокой
ИЗ
    Документ.РеализацияТоваровУслуг КАК Док

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

Решение 4. Удаление разделителей и дефисов из строк (на примере СНИЛС)

В исходном обсуждении была затронута важная практическая задача: преобразование строки формата СНИЛС (например, "146-197-808 93") в непрерывную последовательность цифр ("1461978093") для жестких требований Минздрава или ПФР.

Рассмотрим два подхода к решению этой задачи в зависимости от версии вашей платформы 1С.

Вариант А. Исторический метод с использованием функции ПОДСТРОКА (для старых платформ)

Если ваша конфигурация работает на старой платформе, где встроенные функции запросов ограничены, единственным надежным решением внутри запроса будет жесткое разбиение строки посимвольно и последующая склейка (конкатенация):


ВЫБРАТЬ
    ПОДСТРОКА(ФизическиеЛица.СНИЛС, 1, 3) 
    + ПОДСТРОКА(ФизическиеЛица.СНИЛС, 5, 3) 
    + ПОДСТРОКА(ФизическиеЛица.СНИЛС, 9, 3) 
    + ПОДСТРОКА(ФизическиеЛица.СНИЛС, 13, 2) КАК ЧистыйСНИЛС
ИЗ
    Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
    ФизическиеЛица.СНИЛС ПОДОБНО "___-___-___ __"

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

Вариант Б. Современный метод с функцией СТРЗАМЕНИТЬ в запросе (для платформы 8.3.20+)

Если вы используете современную версию платформы, задача решается элегантно и надежно с помощью функции автозамены символов непосредственно в теле запроса:


ВЫБРАТЬ
    СтрЗаменить(СтрЗаменить(ФизическиеЛица.СНИЛС, "-", ""), " ", "") КАК ЧистыйСНИЛС
ИЗ
    Справочник.ФизическиеЛица КАК ФизическиеЛица

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

Исторический лайфхак: перевод чисел в строку в старых запросах

Что делать, если платформа старая, СКД использовать нельзя, а преобразовать число (например, ID или год) в строку без пробелов в запросе жизненно необходимо? Для полноты картины рассмотрим сложный математический трюк, который использовали разработчики прошлых лет.

Идея основана на получении остатков от деления числа на степени десятки и сопоставлении каждой полученной цифры с позицией в константной строке "0123456789":


ВЫБРАТЬ
    // Вычисляем тысячную долю числа и берем символ из строки
    ПОДСТРОКА("0123456789", 1 + ВЫРАЗИТЬ(Источник.Число / 1000 - 0.5 КАК ЧИСЛО(15, 0)), 1)
    // Вычисляем сотую долю числа
    + ПОДСТРОКА("0123456789", 1 + ВЫРАЗИТЬ(Источник.Число / 100 - 0.5 КАК ЧИСЛО(15, 0)) - (ВЫРАЗИТЬ(Источник.Число / 1000 - 0.5 КАК ЧИСЛО(15, 0))) * 10, 1)
    // Вычисляем десятую долю числа
    + ПОДСТРОКА("0123456789", 1 + ВЫРАЗИТЬ(Источник.Число / 10 - 0.5 КАК ЧИСЛО(15, 0)) - (ВЫРАЗИТЬ(Источник.Число / 100 - 0.5 КАК ЧИСЛО(15, 0))) * 10, 1)
    // Вычисляем единицы
    + ПОДСТРОКА("0123456789", 1 + Источник.Число - (ВЫРАЗИТЬ(Источник.Число / 10 - 0.5 КАК ЧИСЛО(15, 0))) * 10, 1) КАК ГодСтрокой
ИЗ
    ИсходныеДанные КАК Источник

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

Мы надеемся, что предложенные методы помогут вам эффективно решать задачи форматирования чисел и строк в ваших прикладных решениях на платформе 1С!

← На главную