Разработка и Конфигурация · 9 мин
Как сократить строку в 1С: все способы с примерами
Как сократить строку в 1С: функции СокрЛ, СокрП, СокрЛП для пробелов, Лев, Прав, Сред для обрезки по длине. Примеры кода, ошибки и проверка результата.
Встроенный язык 1С предлагает два разных смысла слова «сократить строку». Первый — убрать незначащие пробелы в начале и в конце строки, для этого служат функции СокрЛ, СокрП и СокрЛП. Второй — обрезать строку до нужной длины, отбросив лишние символы слева, справа или из середины, для этого используются функции Лев, Прав и Сред. Путаница между этими задачами — самая частая причина ошибок у начинающих разработчиков.
Проблема лишних пробелов возникает постоянно: данные приходят из файлов Excel, веб-сервисов, обменов между базами, где поля дополняются пробелами до фиксированной длины. Если сравнить такую строку с эталоном оператором «=», сравнение даст «Ложь», хотя визуально строки одинаковы. Поэтому обрезка пробелов — обязательный шаг при загрузке и сопоставлении строковых данных.
Обрезка по длине нужна реже, но тоже регулярно: при формировании коротких представлений номенклатуры, подготовке данных для выгрузки в форматы с ограничением длины поля, усечении длинных наименований для печатных форм. Ниже разобраны оба сценария с готовыми примерами кода.
Как убрать пробелы: СокрЛ, СокрП, СокрЛП
Три функции работают по одному принципу и отличаются только стороной, с которой удаляются незначащие символы. СокрЛ(Строка) удаляет пробелы слева (в начале строки), СокрП(Строка) — справа (в конце), СокрЛП(Строка) — с обеих сторон. Все три функции возвращают новую строку, исходная переменная не изменяется, если результат не присвоить обратно.
На практике в 95% случаев используется именно СокрЛП, потому что разработчику обычно неважно, с какой стороны появились пробелы — их нужно убрать все. СокрЛ и СокрП по отдельности полезны в специальных случаях: например, когда отступ слева несёт смысл (иерархический список с отступами) и удалять его нельзя.
Наименование = " Кресло офисное ";
Чистое = СокрЛП(Наименование); // "Кресло офисное"
БезЛевых = СокрЛ(Наименование); // "Кресло офисное "
БезПравых = СокрП(Наименование); // " Кресло офисное"
Важно понимать, что именно считается «незначащим символом». Функции удаляют не только обычные пробелы, но и символы табуляции, перевода строки, возврата каретки и неразрывный пробел. Это удобно при обработке многострочного текста, но иногда приводит к сюрпризам: если в конце строки осмысленно стоит перевод строки, СокрЛП его тоже уберёт.
Как обрезать строку по длине: Лев, Прав, Сред
Когда нужно укоротить строку до заданного количества символов, используются функции извлечения подстроки. Лев(Строка; N) возвращает первые N символов, Прав(Строка; N) — последние N символов, Сред(Строка; Позиция; Длина) — фрагмент начиная с указанной позиции. Нумерация символов в 1С начинается с единицы, а не с нуля — это отличается от многих других языков.
Артикул = "ТР-00012345-РФ";
Короткий = Лев(Артикул; 10); // "ТР-0001234"
Суффикс = Прав(Артикул; 2); // "РФ"
Номер = Сред(Артикул; 4; 8); // "00012345"
Типичный прикладной сценарий — усечь длинное наименование до лимита поля в формате обмена. Здесь полезен безопасный шаблон: сначала СокрЛП, потом проверка длины, потом Лев. Если применить Лев к строке короче указанной длины, ошибки не будет — вернётся вся строка целиком, поэтому предварительная проверка через СтрДлина нужна только для логики, а не для защиты от падения.
Наименование = СокрЛП(СтрокаИзФайла);
Если СтрДлина(Наименование) > 100 Тогда
Наименование = Лев(Наименование; 97) + "...";
КонецЕсли;
Результат = Лев(СокрЛП(ИсходнаяСтрока); 50); // обрезка пробелов и длины одной строкойКомбинированный типовой приём: очистка плюс обрезка
В реальных задачах загрузки данных оба действия почти всегда идут вместе. Строка из внешнего источника сначала очищается от краевых пробелов и служебных символов, затем при необходимости усекается до лимита. Порядок важен: сначала СокрЛП, потом Лев. Если сделать наоборот, отрезанные символы могут оказаться как раз теми самыми пробелами, и строка останется «грязной».
Удобно оформить такую обработку функцией в общем модуле, чтобы не копировать связку по всему коду. Функция принимает строку и максимальную длину, возвращает готовый результат. Это особенно актуально при обменах, где одно и то же правило применяется к десяткам полей: наименование, адрес, ФИО, комментарий.
Функция ПодготовитьСтроку(Значение, МаксДлина) Экспорт
Результат = СокрЛП(Строка(Значение));
Если СтрДлина(Результат) > МаксДлина Тогда
Результат = Лев(Результат; МаксДлина);
КонецЕсли;
Возврат Результат;
КонецФункции
- 1Приведите значение к строке через Строка() если тип не гарантирован
- 2Уберите краевые пробелы и служебные символы через СокрЛП
- 3Проверьте длину через СтрДлина, если нужна логика по условию
- 4Обрежьте до лимита функцией Лев
- 5Проверьте результат на тестовой строке с пробелами и превышением длины
Как проверить результат и не ошибиться с длиной
Главный инструмент проверки — функция СтрДлина(Строка), возвращающая количество символов. Именно по ней определяют, нужна ли обрезка и сработала ли она. При отладке удобно выводить длину до и после обработки: если после СокрЛП длина не изменилась, а вы ожидали изменений — вероятно, в строке не обычные пробелы, а другие символы, например неразрывные пробелы из веб-страниц.
Отдельная ловушка — пустая строка и строка из одних пробелов. СокрЛП от строки из пробелов вернёт пустую строку, и последующий Лев(Результат; 10) тоже вернёт пустую строку без ошибки. Если бизнес-логика требует непустого значения (например, наименование справочника обязательно), проверку на пустоту нужно делать явно через ПустаяСтрока(Результат).
Как проверить результат
СтрДлина уменьшилась на число краевых пробелов
Длина не изменилась — вероятно неразрывные пробелы или другие символы
Длина равна заданному лимиту или меньше
Длина больше лимита — применена не та функция или не тот параметр
ПустаяСтрока(Результат) = Ложь
Строка пуста после очистки — источник дал только пробелы
Типичные ошибки при сокращении строк
Самая распространённая ошибка — забыть присвоить результат. Вызов СокрЛП(Наименование) сам по себе ничего не меняет: функция возвращает новое значение, и нужно писать Наименование = СокрЛП(Наименование). Вторая по частоте — использование СокрЛП там, где нужна обрезка по длине, и наоборот: функции не взаимозаменяемы.
Третья группа ошибок связана с пробелами внутри строки и с нестандартными символами. Разработчик ожидает, что СокрЛП сожмёт двойные пробелы между словами — этого не происходит. Или пытается удалить неразрывный пробел из выгрузки веб-сервиса — в современных версиях платформы он удаляется, но в старых релизах поведение отличалось, поэтому надёжнее дополнительно применять СтрЗаменить с символом неразрывного пробела.
Когда сокращения недостаточно: смежные инструменты
Если задача шире, чем обрезка, в арсенале есть другие функции. СтрЗаменить(Строка; Что; НаЧто) убирает или заменяет любые подстроки, включая пробелы внутри текста. СтрРазделить и СтрСоединить помогают разбить строку и собрать заново, отбросив лишнее. Для сложной очистки по шаблону в толстом клиенте и на сервере доступны регулярные выражения через COM-объект VBScript.RegExp на Windows.
При работе с запросами помните: в языке запросов 1С есть свои функции ПОДСТРОКА и возможность приведения к строке фиксированной длины, которая наоборот дополняет значение пробелами справа. Это частая причина «фантомных» пробелов в результатах запросов к строковым полям неограниченной длины, приведённым к фиксированной. Лечится всё тем же СокрЛП уже на стороне кода.
Выбор функции под задачу
Убрать пробелы и служебные символы по краям. Не трогает середину строки
Взять заданное число символов с начала или конца. Для усечения до лимита
Извлечь фрагмент из произвольной позиции, например часть артикула или кода
Удалить или заменить символы внутри строки, включая двойные пробелы
Что важно запомнить
СокрЛ, СокрП, СокрЛП убирают пробелы по краям строки, а Лев, Прав и Сред обрезают её по длине. Результат функции всегда нужно присваивать. Стандартная связка для очистки данных — СокрЛП плюс Лев с проверкой через СтрДлина.
Частые вопросы
Чем СокрЛП отличается от СокрЛ и СокрП?
СокрЛ удаляет пробелы только в начале строки, СокрП — только в конце, а СокрЛП — с обеих сторон сразу. В повседневной практике почти всегда применяют СокрЛП, а отдельные функции нужны лишь когда одна из сторон значима, например отступы в иерархическом тексте.
Как убрать двойные пробелы между словами?
СокрЛП здесь не поможет — она работает только с краями. Используйте цикл со СтрЗаменить: пока в строке находятся два пробела подряд, заменяйте их на один. Для разовой обработки достаточно нескольких итераций замены.
Что будет, если применить Лев к строке короче указанной длины?
Ошибки не произойдёт — функция просто вернёт всю строку целиком. Поэтому проверка через СтрДлина перед Лев нужна только если по логике задачи требуется по-разному обрабатывать длинные и короткие значения, например добавлять многоточие к усечённым.
Почему СокрЛП не убрала пробелы из строки, полученной с сайта?
Вероятно, в данных неразрывные пробелы или другие юникод-символы. В актуальных версиях платформы СокрЛП обрабатывает неразрывный пробел, но для надёжности можно предварительно заменить его через СтрЗаменить(Строка; Символ(160); " "), а затем применить СокрЛП.
Как обрезать строку прямо в запросе?
В языке запросов есть функция ПОДСТРОКА(Поле; Начало; Длина), аналогичная Сред. Учтите, что приведение к строке фиксированной длины в запросе дополняет значение пробелами справа, поэтому после выборки результат часто дополнительно обрабатывают СокрЛП в коде.
Меняет ли СокрЛП исходную переменную?
Нет. Все строковые функции в 1С возвращают новое значение, не изменяя переданное. Чтобы сохранить результат, его нужно присвоить: Строка = СокрЛП(Строка). Вызов без присвоения — самая частая ошибка новичков.