Отчеты и Аналитика · 12 мин
Как убрать пробелы в отчете 1С
Как убрать лишние пробелы в отчетах 1С: функция СокрЛП, настройка макета, формат ячеек, обработка данных. Пошаговые инструкции с примерами кода.
Лишние пробелы в отчетах 1С — частая проблема: числа не сортируются, ФИО «расползаются» по колонкам, а при выгрузке в Excel данные не сходятся при сверке. Пробелы появляются из-за строк фиксированной длины, выравнивания в макете, ручного ввода с опечатками и особенностей вывода чисел с разделителями групп разрядов.
Способ устранения зависит от того, где именно возник пробел: в самих данных информационной базы, в запросе, формирующем отчет, в макете печатной формы или уже в готовом табличном документе. Ниже разобраны все основные сценарии — от простой функции СокрЛП до настройки формата ячеек и обработки результата отчета.
Откуда берутся лишние пробелы в отчетах 1С
Прежде чем исправлять, важно понять источник проблемы, потому что методы различаются. В практике встречаются четыре типовые причины появления пробелов.
Первая — строки фиксированной длины. В конфигурациях на обычных формах и в ряде реквизитов строка может храниться с дополнением пробелами справа до заданной длины. При выводе в отчет такие «хвосты» визуально разрывают текст и мешают сравнению значений.
Вторая — неразрывные пробелы в числах. При выводе чисел 1С по умолчанию группирует разряды (1 234 567), и в качестве разделителя используется неразрывный пробел (символ с кодом 160). На экране это выглядит аккуратно, но при копировании в Excel или при программной обработке значение перестает распознаваться как число.
Третья — ручной ввод. Пользователи вносят наименования контрагентов, номенклатуры и ФИО с двойными пробелами, пробелами в начале и конце строки. Эти пробелы попадают во все отчеты, построенные по справочникам.
Четвертая — настройки макета: выравнивание по ширине, отступы, объединение ячеек. В этом случае в данных пробелов нет, и «чистить» нужно не данные, а оформление.
Проверьте значение функцией СокрЛП и сравните длину строки до и после
Проверьте формат ячейки — задана ли группировка разрядов
Откройте макет и проверьте свойство горизонтального выравнивания
Найдите в строке два пробела подряд через Найти() или визуально
Удаление пробелов функциями СокрЛ, СокрП и СокрЛП
Стандартный инструмент встроенного языка 1С — три функции обрезки пробелов. СокрЛ удаляет пробелы слева, СокрП — справа, СокрЛП — с обеих сторон. В абсолютном большинстве случаев используется именно СокрЛП, потому что она безопасна: не трогает пробелы внутри строки.
Применять функцию можно в запросе, в коде формирования отчета и в выражениях СКД. Например, при выводе наименования контрагента в отчет:
// В коде формирования отчета
Наименование = СокрЛП(Выборка.КонтрагентНаименование);
Область.Параметры.Контрагент = Наименование;
В запросе аналогичная возможность есть через функцию языка запросов:
ВЫБРАТЬ
ВЫРАЗИТЬ(СокрЛП(Контрагенты.Наименование) КАК Строка(150)) КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
Обратите внимание: в запросе результат СокрЛП рекомендуется приводить к строке фиксированной длины через ВЫРАЗИТЬ, иначе тип поля может стать строкой неограниченной длины, что влияет на производительность и поведение СКД.
Как убрать пробелы внутри строк и чисел
Двойные пробелы внутри текста и неразрывные пробелы в числах требуют другого подхода — замены символов через СтрЗаменить.
Для удаления неразрывных пробелов из числового представления используется замена символа с кодом 160:
// Убираем неразрывные пробелы из строки с числом
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символ(160), "");
// Теперь строку можно безопасно преобразовать в число
ЗначениеЧисло = Число(СтрокаЧисла);
Для сжатия повторных пробелов внутри текста (например, «Иванов Иван» → «Иванов Иван») применяют цикл замены двойного пробела на одинарный, пока дубли не исчезнут:
Пока Найти(Текст, " ") > 0 Цикл
Текст = СтрЗаменить(Текст, " ", " ");
КонецЦикла;
Этот прием полезен при подготовке данных к выгрузке: во внешние системы (банк-клиенты, ЭДО, обмен с сайтом) строки с двойными пробелами часто отклоняются при проверке форматов.
Настройка формата чисел: убираем разделители разрядов
Если пробелы появляются только в числах (1 234 567 вместо 1234567), правильнее не чистить строки, а изменить формат вывода. Это делается в свойствах ячейки макета или в настройках поля СКД.
В макете табличного документа: выделите ячейку, откройте палитру свойств, найдите свойство «Формат» и задайте строку формата без группировки разрядов, например ЧГ=0 — параметр «ЧГ» (число групп) со значением 0 отключает разделение групп разрядов.
В схеме компоновки данных аналогичная настройка находится на закладке «Наборы данных» → поле → «Оформление» → «Формат», либо в пользовательских настройках отчета, если разработчик вынес формат в доступные параметры.
// Программная установка формата ячейки табличного документа
Область.Формат = "ЧГ=0"; // числа без разделителей групп разрядов
Учтите ограничение: отключение группировки ухудшает читаемость крупных сумм в печатных формах. Для отчетов, которые смотрят на экране, разделители обычно оставляют, а убирают их только в формах для выгрузки и обмена.
Способы убрать пробелы из чисел
Правильный способ для отчетов и печатных форм: данные не меняются, меняется только отображение. Не работает для уже сформированной строки
Подходит для готовых строк перед выгрузкой или преобразованием в число. Требует аккуратности — не перепутайте с обычным пробелом
Убирает только краевые пробелы. Для разделителей разрядов внутри числа не подходит
Исправление макета: выравнивание и отступы
Когда пробелов в данных нет, но текст в отчете визуально «разорван», причина почти всегда в свойствах ячеек макета. Проверьте три параметра.
Первый — горизонтальное положение. Значение «По ширине» растягивает текст, вставляя визуальные промежутки между словами. Замените его на «Лево» или «Право» в зависимости от содержимого. Второй — свойство «Отступ», которое добавляет визуальный отступ от края ячейки; при нулевом значении текст прижимается к границе. Третий — «Автоотступ» и объединение ячеек: объединенная широкая ячейка с выравниванием по центру создает иллюзию лишних пробелов.
Для проверки откройте макет в конфигураторе (или типовую печатную форму через «Изменить макет», если она внешняя), выделите проблемную область и сравните свойства с соседними ячейками, где отображение корректное.
- 1Откройте макет в конфигураторе и найдите область с проблемным отображением
- 2Проверьте свойство 'Горизонтальное положение' — замените 'По ширине' на 'Лево' или 'Право'
- 3Установите 'Отступ' равным 0, если текст должен начинаться от края ячейки
- 4Проверьте формат числовых ячеек и при необходимости задайте ЧГ=0
- 5Сформируйте отчет и убедитесь, что текст выводится без лишних промежутков
Очистка данных в справочниках и документах
Если пробелы сидят в самих данных, точечные исправления в отчете — полумера: при следующем формировании проблема вернется. Для системного решения используют групповую обработку реквизитов.
В типовых конфигурациях есть встроенный инструмент «Групповое изменение реквизитов» (раздел «Администрирование»). С его помощью можно выбрать справочник, отобрать элементы и установить новое значение реквизита. Однако стандартная обработка не умеет применять СокрЛП «на лету» — для этого нужен либо режим произвольного алгоритма (если он доступен в вашей версии), либо внешняя обработка.
Типовой код массовой очистки выглядит так:
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
НовоеИмя = СокрЛП(Объект.Наименование);
Пока Найти(НовоеИмя, " ") > 0 Цикл
НовоеИмя = СтрЗаменить(НовоеИмя, " ", " ");
КонецЦикла;
Если НовоеИмя <> Объект.Наименование Тогда
Объект.Наименование = НовоеИмя;
Объект.Записать();
КонецЕсли;
КонецЦикла;
Обязательно выполняйте такую обработку в транзакционно безопасном режиме на тестовой копии. После записи проверьте: не появились ли дубли наименований (два элемента, отличавшиеся только пробелом, после очистки станут одинаковыми), не сломались ли обмены и печатные формы, где наименование сверяется с внешними данными.
Проверка результата и контроль качества
После исправления убедитесь, что пробелы действительно ушли, а не просто перестали быть заметными. Скопируйте значение из отчета в блокнот и включите отображение непечатаемых символов, либо проверьте длину строки программно: СтрДлина(СокрЛП(Значение)) должна совпадать с СтрДлина(Значение), если краевых пробелов нет.
Для чисел проверка проста: попробуйте преобразовать строку функцией Число(). Если преобразование проходит без исключения — разделители разрядов удалены корректно. Дополнительно сформируйте отчет и выгрузите его в Excel: числа должны распознаваться как числовой формат и участвовать в суммировании.
Как проверить результат
Длины совпадают — краевых пробелов нет
Длина уменьшается — пробелы по краям остались
Число() выполняется без ошибки
Ошибка преобразования — в строке остались неразрывные пробелы
Числа суммируются, текст не содержит двойных пробелов
Числа воспринимаются как текст, итоги не считаются
Найти(Текст, " ") возвращает 0
Найдены вхождения — нужна повторная замена
Часто задаваемые вопросы
Почему СокрЛП не убирает пробелы между разрядами числа?
СокрЛП обрезает пробельные символы только по краям строки. Разделители разрядов находятся внутри строки, поэтому их нужно либо убирать заменой символа 160 через СтрЗаменить, либо не допускать их появления, задавая формат вывода с параметром ЧГ=0.
Как убрать пробелы в уже сформированном табличном документе?
Программно пройдите по ячейкам табличного документа циклом, прочитайте текст каждой ячейки, примените СокрЛП и СтрЗаменить для символа 160, затем запишите значение обратно. Это уместно как постобработка перед сохранением или отправкой файла, но лучше исправлять источник — запрос или макет.
Можно ли убрать пробелы в отчете на СКД без изменения конфигурации?
Да, если проблема в формате чисел — настройка формата доступна в пользовательском режиме через «Еще» → «Изменить вариант отчета» → оформление поля. Если же пробелы в данных, без изменения запроса или очистки справочников обойтись нельзя: пользовательские настройки не преобразуют значения.
Чем опасна массовая замена пробелов в наименованиях контрагентов?
После очистки могут появиться элементы с одинаковыми наименованиями, а обмены с банками, ЭДО и сайтами, где зафиксировано старое написание, начнут давать расхождения при сопоставлении. Перед обработкой сделайте копию базы и проверьте результат на небольшой выборке.
Как отличить обычный пробел от неразрывного в 1С?
Визуально они неотличимы. Программно проверяют код символа: обычный пробел — КодСимвола 32, неразрывный — 160. Для поиска используйте Найти(Строка, Символ(160)) — если результат больше нуля, в строке есть неразрывные пробелы.
Почему после выгрузки отчета в Excel числа стали текстом?
Причина — неразрывные пробелы-разделители разрядов, которые Excel не воспринимает как часть числа. Решение: задайте в 1С формат числовых ячеек без группировки разрядов (ЧГ=0) перед выгрузкой, либо удалите символы 160 из значений программно.
Что важно запомнить
Краевые пробелы убирают функцией СокрЛП, неразрывные пробелы в числах — заменой символа 160 или форматом ЧГ=0, визуальные разрывы — настройкой выравнивания в макете. Массовую очистку данных выполняйте только после резервного копирования и проверяйте результат на длине строк, преобразовании в число и выгрузке в Excel.