Разработка и Конфигурация · 11 мин
Как в 1С обрезать строку: функции и примеры кода
Как обрезать строку в 1С: функции Лев, Прав, Сред, СокрЛП и СтрДлина. Примеры кода, обрезка по символу, удаление пробелов, типичные ошибки и ответы на вопросы.
Обрезка строк — одна из самых частых операций при работе с данными в 1С: нужно убрать лишние пробелы в наименовании, взять первые символы артикула, отрезать префикс номера документа или извлечь часть строки после разделителя. Встроенный язык 1С для этого предоставляет набор функций: Лев(), Прав(), Сред(), СокрЛ(), СокрП(), СокрЛП() и СтрДлина().
Выбор функции зависит от задачи: если нужно отрезать фиксированное количество символов с края — используются Лев() и Прав(), если из середины — Сред(), если убрать пробелы — семейство Сокр*. Для обрезки «по условию», например до первой запятой, функции комбинируются с Найти() (в новых версиях платформы — СтрНайти()).
Результат нужно присваивать переменной, иначе обрезка «потеряется» — это одна из самых распространённых ошибок начинающих разработчиков.
Функции Лев() и Прав(): обрезка с краёв строки
Функция Лев(Строка, ЧислоСимволов) возвращает указанное количество первых символов строки. Например, Лев("Артикул-12345", 7) вернёт «Артикул». Если запрошенное количество символов больше длины строки, функция просто вернёт строку целиком — ошибки не будет.
Функция Прав(Строка, ЧислоСимволов) работает зеркально — берёт символы с конца. Так, Прав("0000000123", 4) вернёт «0123». Это удобно для извлечения последних цифр номера, суффиксов и кодов.
Артикул = "ТР-000457-ОПТ";
КодГруппы = Лев(Артикул, 2); // "ТР"
Суффикс = Прав(Артикул, 3); // "ОПТ"
Обе функции безопасны при выходе за границы строки, но не защищают от отрицательных чисел — передача отрицательной длины вызовет ошибку выполнения. Если длина вычисляется динамически, перед вызовом стоит проверить, что она больше нуля.
Функция Сред(): извлечение части из середины строки
Сред(Строка, НачальнаяПозиция, ЧислоСимволов) извлекает подстроку, начиная с указанной позиции. Нумерация символов в 1С начинается с единицы, а не с нуля — это важно для тех, кто пришёл из других языков программирования.
Строка = "Префикс-Данные-Суффикс";
Часть = Сред(Строка, 9, 6); // "Данные"
Третий параметр можно опустить — тогда функция вернёт всё от начальной позиции до конца строки. Это удобный способ «отрезать начало»: Сред(Строка, 5) удалит первые четыре символа.
Если начальная позиция больше длины строки, Сред() вернёт пустую строку. Если позиция меньше единицы — поведение зависит от версии платформы и режима совместимости, поэтому полагаться на это не стоит: лучше явно контролировать границы через СтрДлина().
Удаление пробелов: СокрЛ, СокрП и СокрЛП
Отдельный класс задач — обрезка не значащих символов. Функции СокрЛ(), СокрП() и СокрЛП() удаляют пробельные символы (пробелы, табуляции, переносы строк) соответственно слева, справа и с обеих сторон. Содержимое середины строки они не трогают.
Наименование = " Кресло офисное ";
Чистое = СокрЛП(Наименование); // "Кресло офисное"
На практике почти всегда используется именно СокрЛП(): данные из файлов Excel, CSV и внешних систем часто содержат лишние пробелы, которые ломают сравнение строк и поиск в базе. Строка «Товар » с пробелом на конце не равна строке «Товар», и запрос по такому значению ничего не найдёт.
Для удаления неразрывного пробела используется замена: СтрЗаменить(Строка, Символ(160), " "), после чего можно применить СокрЛП(). Символ с кодом 160 визуально неотличим от обычного пробела, поэтому при «необъяснимых» ошибках сравнения строк проверяйте в первую очередь его.
Обрезка строки до определённого символа или после него
Часто нужно отрезать не фиксированное число символов, а часть строки до разделителя: до запятой, до дефиса, до первого пробела. Для этого Лев() и Сред() комбинируются с функцией поиска позиции — Найти() или СтрНайти().
Строка = "Иванов Иван Иванович, менеджер";
Позиция = СтрНайти(Строка, ",");
Если Позиция > 0 Тогда
ФИО = Лев(Строка, Позиция - 1); // "Иванов Иван Иванович"
КонецЕсли;
Для получения части после разделителя используется Сред():
НомерДок = "БП-000123";
Позиция = СтрНайти(НомерДок, "-");
НомерБезПрефикса = Сред(НомерДок, Позиция + 1); // "000123"
Обязательно проверяйте, что разделитель найден: СтрНайти() возвращает 0, если подстрока не обнаружена. Если пропустить проверку, Лев(Строка, -1) вызовет ошибку, а Сред(Строка, 1) при нулевой позиции молча вернёт всю строку целиком — и логика обработки незаметно сломается.
Обрезка строки до нужной длины и дополнение символами
В обменах данными и печатных формах часто требуется строка строго фиксированной длины: лишнее обрезать, недостающее — дополнить пробелами или нулями. Обрезка делается через Лев(), а для дополнения в типовых конфигурациях есть функции вроде СтроковыеФункцииКлиентСервер.ДополнитьСтроку() (БСП) или форматирование через Формат().
// Обрезать наименование до 50 символов
НаименованиеДляПечати = Лев(СокрЛП(Наименование), 50);
// Дополнить номер нулями слева до 11 символов
НомерСтрокой = Формат(Номер, "ЧЦ=11; ЧВН=");
При обрезке до фиксированной длины учитывайте, что вместе с видимыми символами в строке могут быть служебные: переносы строк, табуляции. Перед обрезкой полезно очистить значение через СокрЛП() и при необходимости заменить переводы строк на пробелы, иначе итоговая длина и отображение в печатной форме могут отличаться от ожидаемых.
- 1Очистите строку от лишних пробелов: СокрЛП(Значение)
- 2Проверьте длину через СтрДлина() — если строка короче лимита, обрезка не нужна
- 3Обрежьте через Лев(Строка, Лимит)
- 4При необходимости дополните строку до нужной длины через Формат() или функции БСП
- 5Проверьте результат на контрольном примере с самым длинным реальным значением
Альтернативные способы: СтрРазделить, СтрШаблон и запросы
Если строка содержит несколько разделителей (например, «Фамилия;Имя;Отчество»), удобнее не вычислять позиции вручную, а использовать СтрРазделить(Строка, ";") — функция вернёт массив частей. Это надёжнее цепочек Лев()/Сред(), особенно когда количество частей может меняться.
В запросах 1С тоже есть аналоги: оператор ПОДСТРОКА(Поле, Начало, Длина) позволяет обрезать строку прямо в тексте запроса, не выгружая данные в код. Это полезно при группировках по части строки — например, по первым символам артикула.
ВЫБРАТЬ
ПОДСТРОКА(Номенклатура.Артикул, 1, 3) КАК ПрефиксАртикула
ИЗ
Справочник.Номенклатура КАК Номенклатура
Выбор между кодом и запросом простой: если обрезка нужна для выборки, отбора или группировки большого объёма данных — делайте её в запросе, чтобы не перебирать записи в цикле. Если обрабатывается одно значение в форме или при записи объекта — достаточно функций встроенного языка.
Сравнение способов обрезки
Универсальный вариант для кода; требует ручной проверки границ и позиций
Только для пробельных символов по краям; не трогает середину и неразрывные пробелы
Лучший выбор при нескольких разделителях; возвращает массив, а не одну подстроку
Для обработки в выборках и группировках; не подходит для логики вне запроса
Частые ошибки и проверка результата
Первая группа ошибок связана с неизменяемостью строк: разработчик пишет СокрЛП(Наименование); и ожидает, что переменная изменилась. Нет — нужно Наименование = СокрЛП(Наименование);. Вторая группа — работа без проверки длины и позиций: отрицательная длина в Лев() или позиция 0 в Сред() приводят к ошибкам или тихим сбоям логики.
Третья типичная проблема — обрезка строки, содержащей число, с последующим сравнением. Если вы обрезали код до 5 символов и сравниваете с другим кодом, убедитесь, что оба значения прошли одинаковую нормализацию: одинаковая длина, отсутствие пробелов, одинаковый регистр. Для сравнения без учёта регистра используйте ВРег() или НРег() на обеих сторонах.
Как проверить результат
Совпадает с ожидаемой или меньше лимита
Длина больше лимита или неожиданно мала — проверьте пробелы и служебные символы
Строки равны после СокрЛП и приведения регистра
Строки визуально одинаковы, но не равны — вероятны неразрывные пробелы (символ 160)
Код обрабатывает случай Позиция = 0 без ошибки
Возникает ошибка выполнения или возвращается вся строка целиком
Для отладки удобно выводить промежуточные значения через Сообщить() или смотреть их в отладчике, обрамляя строку видимыми маркерами, например квадратными скобками: так сразу видны ведущие и хвостовые пробелы, которые иначе незаметны.
Что важно запомнить
Лев, Прав и Сред отрезают символы по позиции, СокрЛП убирает пробелы по краям, а обрезка до разделителя делается связкой Лев/Сред со СтрНайти с обязательной проверкой, что позиция больше нуля. Все функции возвращают новую строку — результат нужно присваивать переменной.
Частые вопросы
Как обрезать последние N символов строки?
Используйте связку Лев() и СтрДлина(): Результат = Лев(Строка, СтрДлина(Строка) - N);. Перед этим проверьте, что длина строки больше N, иначе получите ошибку из-за отрицательного второго параметра.
Как удалить все пробелы внутри строки, а не только по краям?
Через замену: СтрЗаменить(Строка, " ", ""). Если нужно убрать ещё и табуляции с неразрывными пробелами, добавьте замены для Символ(9) и Символ(160). Функции семейства Сокр для этого не подходят — они работают только с краями строки.
Почему СокрЛП не убирает пробел, который я вижу на экране?
Скорее всего, это неразрывный пробел (код символа 160) — он часто приходит из Excel, веб-страниц и скопированного текста. СокрЛП его не считает пробельным. Решение: Строка = СокрЛП(СтрЗаменить(Строка, Символ(160), " "));.
Как получить часть строки после последнего разделителя?
Функция СтрНайти() находит первое вхождение, поэтому для последнего разделителя проще использовать СтрРазделить(Строка, "/") и взять последний элемент полученного массива, либо организовать цикл поиска с запоминанием позиции.
Можно ли обрезать строку прямо в запросе 1С?
Да, оператором ПОДСТРОКА: ПОДСТРОКА(Поле, НачальнаяПозиция, Длина). Нумерация также начинается с 1. Это эффективнее, чем выгружать данные и резать их в цикле, особенно при группировках и отборах по части строки.
Что вернёт Лев(), если запросить больше символов, чем есть в строке?
Функция вернёт всю строку целиком, ошибки не будет. А вот отрицательное значение длины вызовет ошибку выполнения, поэтому при вычисляемой длине всегда проверяйте, что она положительная.