Пробелы в 1С 8.3: от ячейки печатной формы до строки во встроенном языке

· 10 мин

Содержание

Чтобы поставить пробел в 1С, в поле или ячейке макета достаточно нажать клавишу пробела. В коде пробел пишут строковым литералом " ", неразрывный пробел берут из Символы.НПП или Символ(160), а при склейке значений удобнее всего СтрШаблон("%1 %2", Фамилия, Имя).

Сложности начинаются не с самим пробелом, а с его поведением. Пробелы пропадают при склейке параметров в печатной форме, лишние появляются из строк фиксированной длины, а неразрывный пробел из Excel ломает преобразование в число.

Пробел в макете печатной формы и табличном документе

В макете (табличном документе) ячейка бывает трёх видов заполнения: Текст, Параметр и Шаблон. От этого зависит, куда и как ставить пробел.

📝 Текст. Пробел вводится как обычный символ. Ячейка выводит текст ровно так, как вы его набрали, включая пробелы между словами.

🔧 Параметр. В ячейке нет текста, только имя параметра. Пробел внутрь не поставить — его добавляют в коде, когда заполняют параметр.

🧩 Шаблон. Текст с параметрами в квадратных скобках. Всё, что стоит между скобками, выводится буквально:

[Фамилия] [Имя] [Отчество]

Пробелы между ] и [ попадут в печатную форму. Это самый простой способ собрать ФИО или адрес без правки модуля.

Как сделать отступ слева

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

Второй вариант — объединить ячейки или добавить узкую пустую колонку. Так отступ будет одинаковым на всех строках.

Пробелы при заполнении параметров из кода

Типовой фрагмент формирования печатной формы:

Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Покупатель = СокрЛП(Контрагент.Наименование) + ", ИНН " + Контрагент.ИНН;
Область.Параметры.ФИО = СтрШаблон("%1 %2 %3", Фамилия, Имя, Отчество);
ТабДок.Вывести(Область);

Пробел здесь стоит внутри строковых литералов: ", ИНН " и шаблон "%1 %2 %3". Если у сотрудника нет отчества, шаблон оставит хвостовой пробел. В печати его не видно, но при сравнении строк он мешает, поэтому результат лучше обернуть в СокрЛП().

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

Пробелы в системе компоновки данных

В отчётах на СКД пробел ставят в выражении вычисляемого поля или в свойстве «Выражение представления»:

Контрагент.Наименование + " (" + Договор.Номер + ")"

Склейка через + работает и в языке запросов, и в выражениях СКД. Строковые литералы в них тоже пишут в двойных кавычках.

Как добавить пробел в коде 1С

Во встроенном языке пробел — обычный символ строки. Способов вставить его несколько, и выбирать стоит по читаемости.

СпособПримерКогда удобен
ЛитералФамилия + " " + ИмяСклейка двух-трёх значений
СтрШаблонСтрШаблон("%1 %2", Фамилия, Имя)Много частей, числа и даты в строке
Символ(32)"А" + Символ(32) + "Б"Когда код символа приходит как число
Символы.НПП"10" + Символы.НПП + "шт."Неразрывный пробел, чтобы строка не переносилась
СтрСоединитьСтрСоединить(Массив, " ")Собрать массив слов через пробел

СтрШаблон и СтрСоединить появились в платформе 8.3.6. На актуальных версиях они есть везде.

Строка из N пробелов

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

Функция ДополнитьПробеламиСправа(Знач Стр, Длина)
	Пока СтрДлина(Стр) < Длина Цикл
		Стр = Стр + " ";
	КонецЦикла;
	Возврат Лев(Стр, Длина);
КонецФункции

Функция дополняет строку пробелами до нужной длины, а если строка длиннее, обрезает её через Лев(). Для выравнивания вправо, например сумм, пробелы добавляют слева: Стр = " " + Стр, а обрезают через Прав().

Пробел в тексте запроса

В языке запросов строки тоже склеиваются плюсом:

ВЫБРАТЬ
	Сотрудники.Фамилия + " " + Сотрудники.Имя КАК ФИО
ИЗ
	Справочник.ФизическиеЛица КАК Сотрудники

Если одно из полей NULL, результат склейки тоже будет NULL. Оборачивайте поля в ЕСТЬNULL(Поле, ""), иначе в отчёте появятся пустые ячейки вместо ФИО без отчества.

Неразрывный пробел и другие невидимые символы

Обычный пробел имеет код 32. Неразрывный — код 160. Внешне они одинаковые, но для программы это разные символы.

Неразрывный пробел попадает в базу тремя путями:

  • 📊 при копировании из Excel, где числа отформатированы с разделителем разрядов;
  • 🌐 из текстов с сайтов и писем, где стоит &nbsp;;
  • 🔢 из самой 1С: функции Формат() и Строка() разделяют разряды чисел именно неразрывным пробелом.

Другие символы, которые выглядят как пробел или его отсутствие:

СимволКодВ коде 1С
Пробел32" " или Символ(32)
Неразрывный пробел160Символы.НПП или Символ(160)
Табуляция9Символы.Таб
Перевод строки10Символы.ПС
Возврат каретки13Символы.ВК

Как увидеть, какой символ в строке

Самый надёжный способ — вывести коды символов. Код ниже показывает в окне сообщений каждую позицию строки и код символа на ней:

Для Поз = 1 По СтрДлина(Стр) Цикл
	Сообщить(Формат(Поз, "ЧГ=0") + ": «" + Сред(Стр, Поз, 1) + "» = "
		+ Формат(КодСимвола(Стр, Поз), "ЧГ=0"));
КонецЦикла;

Если вместо 32 вы видите 160 или 9, причина «странного» поведения найдена. В отладчике то же самое можно проверить через вычисление выражения КодСимвола(Стр, 5).

Как ввести неразрывный пробел вручную

В Windows-клиенте неразрывный пробел набирают сочетанием Alt+0160 на цифровом блоке клавиатуры при включённом NumLock. Если поле не принимает такой ввод, скопируйте символ из любого редактора и вставьте через буфер обмена.

В печатных формах неразрывный пробел полезен между числом и единицей: «15 шт.», «№ 125». Так при переносе строки число не отрывается от подписи.

Как убрать лишние пробелы в 1С

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

Пробелы по краям

  • СокрЛ(Стр) — убирает пробелы слева;
  • СокрП(Стр) — справа;
  • СокрЛП(Стр) — с обеих сторон.

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

Двойные пробелы внутри строки

Самый короткий вариант — разбить строку по пробелу без пустых частей и собрать обратно:

Стр = СтрЗаменить(Стр, Символы.НПП, " ");
Стр = СтрЗаменить(Стр, Символы.Таб, " ");
Стр = СтрСоединить(СтрРазделить(Стр, " ", Ложь), " ");

Третий параметр Ложь у СтрРазделить выкидывает пустые элементы, которые возникают между двумя подряд идущими пробелами. После сборки в строке остаются одиночные пробелы, а по краям их нет вообще.

Для старых платформ без СтрРазделить работает цикл:

Пока СтрНайти(Стр, "  ") > 0 Цикл
	Стр = СтрЗаменить(Стр, "  ", " ");
КонецЦикла;
Стр = СокрЛП(Стр);

Удалить все пробелы

Для ИНН, номеров счетов, телефонов пробелы не нужны совсем:

ИНН = СтрЗаменить(СтрЗаменить(ИНН, " ", ""), Символы.НПП, "");

Хвостовые пробелы из строк фиксированной длины

У строкового реквизита в конфигураторе есть свойство «Допустимая длина»: Переменная или Фиксированная. При фиксированной длине платформа дополняет значение пробелами до полной длины. Реквизит длиной 50 со значением «ООО Ромашка» вернёт строку из 50 символов.

В печатной форме это даёт сдвиг текста, а при сравнении Стр1 = Стр2 — ложное «не равно». Лечится СокрП() при чтении или сменой длины на переменную, если это ваш реквизит.

Очистка в запросе

В платформе 8.3.20 и новее в языке запросов появились строковые функции, в том числе СОКРЛП и СТРЗАМЕНИТЬ. На более ранних версиях чистить пробелы приходится уже в коде, после выполнения запроса.

Массовую очистку наименований справочника обработкой запускайте только после выгрузки базы в .dt. Если в процедуру закралась ошибка, восстановить тысячи изменённых элементов вручную не получится.

Пробелы в числах: разделитель разрядов

Число в 1С само по себе пробелов не содержит. Они появляются, когда число превращается в строку.

Строка(1234567) вернёт 1 234 567, где между группами стоит неразрывный пробел. Для пользователя это удобно, для выгрузки в файл или URL — нет.

Управляют этим форматной строкой функции Формат():

ЗадачаФорматная строкаРезультат для 1234567,5
Без разделителя разрядов"ЧГ=0"1234567,5
Две цифры после запятой, без групп"ЧДЦ=2; ЧГ=0"1234567,50
Точка вместо запятой"ЧРД=.; ЧГ=0"1234567.5
Обычный пробел между разрядами"ЧРГ=' '"1 234 567,5

Без ЧГ=0 склеивать число с текстом для обмена нельзя. Номер 12345 превратится в 12 345, и принимающая сторона его не распознает.

Обратное преобразование: строка в число

Число из Excel вида «1 234,56» напрямую в Число() не пройдёт. Сначала уберите оба вида пробелов и приведите разделитель:

Текст = СтрЗаменить(Текст, Символы.НПП, "");
Текст = СтрЗаменить(Текст, " ", "");
Текст = СтрЗаменить(Текст, ",", ".");
Сумма = Число(Текст);

На случай мусора в ячейке оберните последнюю строку в Попытка … Исключение, чтобы загрузка не падала на первой же кривой строке, а записывала её в протокол.

Пробел в маске поля ввода

У поля ввода на управляемой форме есть свойство Маска. В маске служебные символы задают, что можно вводить, а все остальные выводятся как есть. Пробел — не служебный, поэтому он становится постоянным разделителем.

Примеры масок:

  • 🪪 серия и номер паспорта: 99 99 999999;
  • 📞 телефон: +7 (999) 999-99-99;
  • 🏦 расчётный счёт группами: 99999 999 9 9999 9999999.

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

Что хранится в реквизите

Маска влияет на ввод, а в реквизит попадает строка вместе с символами маски. Значит, в базе паспорт будет записан с пробелами. Если в другом месте программы его сравнивают со строкой без пробелов, совпадения не будет.

Есть два решения: везде использовать одинаковую маску или перед сравнением удалять пробелы, как в разделе про ИНН выше.

Маску задают в конфигураторе или в расширении, в палитре свойств элемента формы. Пользователю без прав на конфигурацию маску не поменять, только разработчику.

Пробел в начале поля

Иногда пользователь случайно вводит пробел перед наименованием. Элемент с пробелом в начале уходит в начало списка при сортировке и не находится поиском по первым буквам. Для своих справочников добавьте СокрЛП() в обработчик ПередЗаписью модуля объекта — так значение очищается при любой записи, а не только из формы.

Ошибки при работе с пробелами

Большинство проблем с пробелами выглядят как ошибки совсем другого рода. Разберите свой симптом:

Диагностика: выберите симптом

Ещё три ошибки, которые встречаются при доработках:

  1. Пустой шаблон без СокрЛП. СтрШаблон("%1 %2", Фамилия, "") вернёт строку с пробелом в конце. В ключах поиска и именах файлов это даёт дубли.
  2. Склейка с NULL в запросе. Одно пустое поле обнуляет всё выражение. Нужен ЕСТЬNULL.
  3. Чистка без замены НПП. СокрЛП и цикл по двойным пробелам не трогают символ 160, если его не заменить заранее.

Частые вопросы

Почему в 1С не работает поиск по фразе с пробелом?
Чаще всего в искомом значении стоит неразрывный пробел или два пробела подряд. Проверьте коды символов строки и очистите данные.
Можно ли поставить пробел в имени реквизита или переменной?
Нет. Имена во встроенном языке состоят из букв, цифр и подчёркивания и не начинаются с цифры. Пробел допустим только в синониме, который видит пользователь.
Как вставить перенос строки вместо пробела?
В коде используйте Символы.ПС. В ячейке табличного документа перенос сработает, если у ячейки включено размещение текста с переносом.
Чем отличается Символ(32) от " "?
Ничем, это один и тот же символ. Символ(32) удобен, когда код приходит из переменной.
Как сделать так, чтобы сумма в печатной форме не разрывалась на две строки?
Выводите её через Формат() с разделителем по умолчанию: он неразрывный. Между числом и «руб.» ставьте Символы.НПП.