При выводе данных в табличный документ программисты 1С часто сталкиваются с ситуацией, когда номер телефона, артикул или длинный числовой идентификатор отображается с пробелами (например, «55 678 999»). Это происходит из-за того, что платформа автоматически применяет региональные настройки для группировки разрядов чисел. Рассмотрим подробнее, почему это происходит и как решить эту проблему различными способами.
Если данные, которые попадают в макет, имеют тип Число, 1С по умолчанию разделяет их пробелами для удобства чтения. Чтобы подавить это поведение, мы можем использовать функцию Формат() с параметром ЧГ=0 (что означает «группировка разрядов — 0 символов»).
Проанализируем пример кода, который нужно вставить в процедуру печати перед заполнением параметра макета:
// Предположим, у нас есть переменная НомерДляПечати
НомерДляПечати = 55678999;
// Применяем форматирование для удаления группировки
ТекстДляВывода = Формат(НомерДляПечати, "ЧГ=0");
// Теперь ТекстДляВывода будет содержать строку "55678999"
Этот способ является наиболее корректным, если вы работаете с числовыми данными. Вы принудительно сообщаете системе, что число должно выводиться сплошным потоком цифр без разделителей.
Бывают ситуации, когда номер уже хранится или передается как Строка, но в ней всё равно присутствуют пробелы (введенные пользователем или добавленные системой ранее). В этом случае функция Формат() может не сработать. Разберем, как очистить строку с помощью функции СтрЗаменить().
Важный нюанс: в 1С пробел часто является не обычным символом с кодом 32, а «неразрывным пробелом» (символ Символы.НП с кодом 160). Обычная замена кавычками с пробелом " " его не найдет. Посмотрим на правильную реализацию:
// Удаляем обычные пробелы
СтрокаБезПробелов = СтрЗаменить(РеквизитНомер, " ", "");
// Гарантированно удаляем неразрывные пробелы (служебные символы 1С)
СтрокаБезПробелов = СтрЗаменить(СтрокаБезПробелов, Символы.НП, "");
Используя комбинацию этих замен, мы можем быть уверены, что любые визуальные разрывы в строке будут удалены.
Если вы не хотите вносить изменения в программный код модуля печати, можно воспользоваться визуальным редактором макета. Выясним, как это сделать правильно:
Важное ограничение: этот метод работает безупречно, если «Заполнение» ячейки установлено в значение Параметр. Если же у вас установлен Шаблон (например, текст вида «Номер: [НомерТелефона]»), то свойства формата всей ячейки могут игнорироваться для конкретного значения внутри скобок.
Рассмотрим ситуацию, когда тип заполнения ячейки — Шаблон. Платформа 1С позволяет писать выражения прямо внутри квадратных скобок в макете. Это очень удобный и современный способ форматирования данных.
Вместо простого [НомерТелефона] в ячейке макета напишем:
[Формат(НомерТелефона, "ЧГ=0")]
В этом случае система при обработке шаблона сама применит функцию форматирования к переменной. Это позволяет избежать загромождения кода в модуле менеджера или объекта и перенести логику представления данных непосредственно в макет.
Иногда пользователи вводят номера телефонов в совершенно разных форматах: с тире, скобками или случайными знаками препинания. Если ваша задача — вывести только цифры слитно, проанализируем метод «очистки» строки от всего лишнего.
Для этого можно использовать регулярные выражения (через COM-объект) или простой обход строки в цикле. Рассмотрим вариант с циклом, так как он работает на любой платформе (Windows/Linux) без дополнительных настроек:
Функция ОчиститьНомерОтСимволов(ВхСтрока)
Результат = "";
Для Индекс = 1 По СтрДлина(ВхСтрока) Цикл
Символ = Сред(ВхСтрока, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Этот метод гарантирует, что в печатную форму попадут только цифры, независимо от того, какие пробелы или знаки разделителей были в исходных данных.
Выясним причину, по которой даже после очистки пробелы могут появиться вновь. 1С — это система, ориентированная на бизнес-стандарты. Если вы передаете в макет переменную, которая имеет тип Число, платформа при формировании итогового ТабличногоДокумента может заново применить к ней системный формат.
Поэтому главное правило: чтобы гарантированно убрать пробелы, передавайте в параметр макета уже готовую строку, обработанную функцией Формат() или СтрЗаменить(). Как только число превращается в строку, автоматическая группировка разрядов перестает на него действовать.
Подведем итог: для решения проблемы с пробелами в шаблоне текста наиболее эффективным является сочетание программной обработки данных функцией Формат(Значение, "ЧГ=0") и контроля типа данных (приведение к строке) перед отправкой в макет.