К статье
Практический материал

Разработка и Конфигурация · 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) при нулевой позиции молча вернёт всю строку целиком — и логика обработки незаметно сломается.

Типичные ошибки
01
Не присвоить результат функции переменной: строка неизменяема, вызов Лев(Строка, 5) без присваивания ничего не меняет
02
Не проверить результат Найти()/СтрНайти(): при отсутствии разделителя возвращается 0, что приводит к ошибке или неверному результату
03
Путать нумерацию: в 1С позиции символов начинаются с 1, а не с 0, как во многих других языках
04
Искать последний разделитель через Найти(): функция находит первое вхождение, для последнего нужен цикл или разбор через СтрРазделить()

Обрезка строки до нужной длины и дополнение символами

В обменах данными и печатных формах часто требуется строка строго фиксированной длины: лишнее обрезать, недостающее — дополнить пробелами или нулями. Обрезка делается через Лев(), а для дополнения в типовых конфигурациях есть функции вроде СтроковыеФункцииКлиентСервер.ДополнитьСтроку() (БСП) или форматирование через Формат().

// Обрезать наименование до 50 символов

НаименованиеДляПечати = Лев(СокрЛП(Наименование), 50);

// Дополнить номер нулями слева до 11 символов

НомерСтрокой = Формат(Номер, "ЧЦ=11; ЧВН=");

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

Порядок действий при обрезке до фиксированной длины
  1. 1
    Очистите строку от лишних пробелов: СокрЛП(Значение)
  2. 2
    Проверьте длину через СтрДлина() — если строка короче лимита, обрезка не нужна
  3. 3
    Обрежьте через Лев(Строка, Лимит)
  4. 4
    При необходимости дополните строку до нужной длины через Формат() или функции БСП
  5. 5
    Проверьте результат на контрольном примере с самым длинным реальным значением

Альтернативные способы: СтрРазделить, СтрШаблон и запросы

Если строка содержит несколько разделителей (например, «Фамилия;Имя;Отчество»), удобнее не вычислять позиции вручную, а использовать СтрРазделить(Строка, ";") — функция вернёт массив частей. Это надёжнее цепочек Лев()/Сред(), особенно когда количество частей может меняться.

В запросах 1С тоже есть аналоги: оператор ПОДСТРОКА(Поле, Начало, Длина) позволяет обрезать строку прямо в тексте запроса, не выгружая данные в код. Это полезно при группировках по части строки — например, по первым символам артикула.

ВЫБРАТЬ

ПОДСТРОКА(Номенклатура.Артикул, 1, 3) КАК ПрефиксАртикула

ИЗ

Справочник.Номенклатура КАК Номенклатура

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

Сравнение способов обрезки

Лев/Прав/Сред

Универсальный вариант для кода; требует ручной проверки границ и позиций

СокрЛП

Только для пробельных символов по краям; не трогает середину и неразрывные пробелы

СтрРазделить

Лучший выбор при нескольких разделителях; возвращает массив, а не одну подстроку

ПОДСТРОКА в запросе

Для обработки в выборках и группировках; не подходит для логики вне запроса

Частые ошибки и проверка результата

Первая группа ошибок связана с неизменяемостью строк: разработчик пишет СокрЛП(Наименование); и ожидает, что переменная изменилась. Нет — нужно Наименование = СокрЛП(Наименование);. Вторая группа — работа без проверки длины и позиций: отрицательная длина в Лев() или позиция 0 в Сред() приводят к ошибкам или тихим сбоям логики.

Третья типичная проблема — обрезка строки, содержащей число, с последующим сравнением. Если вы обрезали код до 5 символов и сравниваете с другим кодом, убедитесь, что оба значения прошли одинаковую нормализацию: одинаковая длина, отсутствие пробелов, одинаковый регистр. Для сравнения без учёта регистра используйте ВРег() или НРег() на обеих сторонах.

Контрольные точки

Как проверить результат

Длина итоговой строки через СтрДлина()
Норма

Совпадает с ожидаемой или меньше лимита

Тревожный признак

Длина больше лимита или неожиданно мала — проверьте пробелы и служебные символы

Сравнение обрезанного значения с эталоном
Норма

Строки равны после СокрЛП и приведения регистра

Тревожный признак

Строки визуально одинаковы, но не равны — вероятны неразрывные пробелы (символ 160)

Поведение при отсутствии разделителя
Норма

Код обрабатывает случай Позиция = 0 без ошибки

Тревожный признак

Возникает ошибка выполнения или возвращается вся строка целиком

Для отладки удобно выводить промежуточные значения через Сообщить() или смотреть их в отладчике, обрамляя строку видимыми маркерами, например квадратными скобками: так сразу видны ведущие и хвостовые пробелы, которые иначе незаметны.

Итог

Что важно запомнить

Лев, Прав и Сред отрезают символы по позиции, СокрЛП убирает пробелы по краям, а обрезка до разделителя делается связкой Лев/Сред со СтрНайти с обязательной проверкой, что позиция больше нуля. Все функции возвращают новую строку — результат нужно присваивать переменной.

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

Как обрезать последние N символов строки?

Используйте связку Лев() и СтрДлина(): Результат = Лев(Строка, СтрДлина(Строка) - N);. Перед этим проверьте, что длина строки больше N, иначе получите ошибку из-за отрицательного второго параметра.

Как удалить все пробелы внутри строки, а не только по краям?

Через замену: СтрЗаменить(Строка, " ", ""). Если нужно убрать ещё и табуляции с неразрывными пробелами, добавьте замены для Символ(9) и Символ(160). Функции семейства Сокр для этого не подходят — они работают только с краями строки.

Почему СокрЛП не убирает пробел, который я вижу на экране?

Скорее всего, это неразрывный пробел (код символа 160) — он часто приходит из Excel, веб-страниц и скопированного текста. СокрЛП его не считает пробельным. Решение: Строка = СокрЛП(СтрЗаменить(Строка, Символ(160), " "));.

Как получить часть строки после последнего разделителя?

Функция СтрНайти() находит первое вхождение, поэтому для последнего разделителя проще использовать СтрРазделить(Строка, "/") и взять последний элемент полученного массива, либо организовать цикл поиска с запоминанием позиции.

Можно ли обрезать строку прямо в запросе 1С?

Да, оператором ПОДСТРОКА: ПОДСТРОКА(Поле, НачальнаяПозиция, Длина). Нумерация также начинается с 1. Это эффективнее, чем выгружать данные и резать их в цикле, особенно при группировках и отборах по части строки.

Что вернёт Лев(), если запросить больше символов, чем есть в строке?

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