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

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

При выводе данных в табличный документ программисты 1С часто сталкиваются с ситуацией, когда номер телефона, артикул или длинный числовой идентификатор отображается с пробелами (например, «55 678 999»). Это происходит из-за того, что платформа автоматически применяет региональные настройки для группировки разрядов чисел. Рассмотрим подробнее, почему это происходит и как решить эту проблему различными способами.

Метод 1: Использование функции Формат в программном коде

Если данные, которые попадают в макет, имеют тип Число, 1С по умолчанию разделяет их пробелами для удобства чтения. Чтобы подавить это поведение, мы можем использовать функцию Формат() с параметром ЧГ=0 (что означает «группировка разрядов — 0 символов»).

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


// Предположим, у нас есть переменная НомерДляПечати
НомерДляПечати = 55678999;
// Применяем форматирование для удаления группировки
ТекстДляВывода = Формат(НомерДляПечати, "ЧГ=0");
// Теперь ТекстДляВывода будет содержать строку "55678999"

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

Метод 2: Программная замена символов пробела в строках

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

Важный нюанс: в 1С пробел часто является не обычным символом с кодом 32, а «неразрывным пробелом» (символ Символы.НП с кодом 160). Обычная замена кавычками с пробелом " " его не найдет. Посмотрим на правильную реализацию:


// Удаляем обычные пробелы
СтрокаБезПробелов = СтрЗаменить(РеквизитНомер, " ", "");

// Гарантированно удаляем неразрывные пробелы (служебные символы 1С)
СтрокаБезПробелов = СтрЗаменить(СтрокаБезПробелов, Символы.НП, "");

Используя комбинацию этих замен, мы можем быть уверены, что любые визуальные разрывы в строке будут удалены.

Метод 3: Настройка формата непосредственно в макете

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

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

Важное ограничение: этот метод работает безупречно, если «Заполнение» ячейки установлено в значение Параметр. Если же у вас установлен Шаблон (например, текст вида «Номер: [НомерТелефона]»), то свойства формата всей ячейки могут игнорироваться для конкретного значения внутри скобок.

Метод 4: Выражения внутри шаблонов макета

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

Вместо простого [НомерТелефона] в ячейке макета напишем:

[Формат(НомерТелефона, "ЧГ=0")]

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

Метод 5: Удаление всех нецифровых символов (Продвинутый уровень)

Иногда пользователи вводят номера телефонов в совершенно разных форматах: с тире, скобками или случайными знаками препинания. Если ваша задача — вывести только цифры слитно, проанализируем метод «очистки» строки от всего лишнего.

Для этого можно использовать регулярные выражения (через COM-объект) или простой обход строки в цикле. Рассмотрим вариант с циклом, так как он работает на любой платформе (Windows/Linux) без дополнительных настроек:


Функция ОчиститьНомерОтСимволов(ВхСтрока)
    Результат = "";
    Для Индекс = 1 По СтрДлина(ВхСтрока) Цикл
        Символ = Сред(ВхСтрока, Индекс, 1);
        Если Найти("0123456789", Символ) > 0 Тогда
            Результат = Результат + Символ;
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

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

Почему пробелы появляются снова? (Влияние региональных настроек)

Выясним причину, по которой даже после очистки пробелы могут появиться вновь. 1С — это система, ориентированная на бизнес-стандарты. Если вы передаете в макет переменную, которая имеет тип Число, платформа при формировании итогового ТабличногоДокумента может заново применить к ней системный формат.

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

Подведем итог: для решения проблемы с пробелами в шаблоне текста наиболее эффективным является сочетание программной обработки данных функцией Формат(Значение, "ЧГ=0") и контроля типа данных (приведение к строке) перед отправкой в макет.

← На главную