Пробелы в 1С 8.3: от ячейки печатной формы до строки во встроенном языке
Содержание
Чтобы поставить пробел в 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, где числа отформатированы с разделителем разрядов;
- 🌐 из текстов с сайтов и писем, где стоит
; - 🔢 из самой 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 %2", Фамилия, "")вернёт строку с пробелом в конце. В ключах поиска и именах файлов это даёт дубли. - Склейка с
NULLв запросе. Одно пустое поле обнуляет всё выражение. НуженЕСТЬNULL. - Чистка без замены НПП.
СокрЛПи цикл по двойным пробелам не трогают символ 160, если его не заменить заранее.