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

Разработка и Конфигурация · 10 мин

Как уменьшить строку в 1С: обрезка, сокращение и удаление лишних символов

Как уменьшить строку в 1С: функции СокрЛП, Лев, Прав, Сред, СтрЗаменить. Примеры кода, обрезка до нужной длины, типичные ошибки и ответы на вопросы.

Задача уменьшить строку в 1С возникает постоянно: нужно убрать лишние пробелы из наименования контрагента, обрезать длинный комментарий до лимита поля, извлечь часть кода или номера документа. Встроенный язык 1С:Предприятия предоставляет для этого набор функций работы со строками, и выбор конкретной зависит от того, что именно нужно сделать — удалить пробелы, взять часть строки или заменить фрагмент.

Основные инструменты — функции СокрЛП(), Лев(), Прав(), Сред(), СтрЗаменить() и СтрДлина(). Они доступны во всех современных версиях платформы (8.2, 8.3) и работают одинаково в тонком, толстом и веб-клиенте. Ниже разобраны практические сценарии с примерами кода, ограничениями и типичными ошибками.

Удаление пробелов: СокрЛ, СокрП и СокрЛП

Самая частая причина «лишней длины» строки — незначащие пробелы и служебные символы (табуляция, перенос строки) в начале и в конце. Такое случается при загрузке данных из Excel, при копировании наименований, при обмене с другими системами.

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

Наименование = СокрЛП(НаименованиеИзФайла);

// " ООО Ромашка " превратится в "ООО Ромашка"

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

Обрезка строки до нужной длины: Лев, Прав, Сред

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

Лев() — взять начало строки

Лев(Строка, ЧислоСимволов) возвращает указанное количество символов с начала строки. Это стандартный способ обрезать длинный текст:

КраткоеОписание = Лев(СокрЛП(ПолноеОписание), 100);

Если СтрДлина(ПолноеОписание) > 100 Тогда

КраткоеОписание = КраткоеОписание + "...";

КонецЕсли;

Если строка короче указанного числа, функция вернёт её целиком без ошибки — отдельная проверка длины для Лев() не обязательна, но нужна, если вы добавляете многоточие или иную пометку об обрезке.

Прав() — взять конец строки

Прав(Строка, ЧислоСимволов) возвращает символы с конца. Типичный пример — получить последние цифры номера документа без префикса:

ХвостНомера = Прав(СокрЛП(НомерДокумента), 6);

Сред() — извлечь фрагмент из середины

Сред(Строка, НачальнаяПозиция, ЧислоСимволов) берёт подстроку с указанной позиции. Нумерация символов в 1С начинается с 1, а не с 0 — это частая ошибка у тех, кто пришёл из других языков:

// Из строки "ПРФ-000123" взять только цифры

ЦифрыНомера = Сред(Номер, 5); // с 5-й позиции до конца

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

bsl
Исходная = "  Очень длинное наименование товара с лишними пробелами  ";
Чистая = СокрЛП(Исходная);
Короткая = Лев(Чистая, 30);
Сообщить("[" + Короткая + "] длина: " + СтрДлина(Короткая));

Уменьшение строки через замену: СтрЗаменить

Если нужно не обрезать строку, а убрать из неё конкретные символы или фрагменты — разделители, префиксы, лишние пробелы внутри — применяется СтрЗаменить(Строка, ЧтоИскать, НаЧтоЗаменить). Чтобы удалить фрагмент, его заменяют на пустую строку:

// Убрать префикс "УТ-" из номера

НомерБезПрефикса = СтрЗаменить(Номер, "УТ-", "");

// Убрать все пробелы из строки

БезПробелов = СтрЗаменить(Строка, " ", "");

СтрЗаменить заменяет все вхождения, а не только первое. Это удобно для удаления символов, но опасно, если искомая подстрока встречается в данных, которые трогать не нужно. Например, замена "00" на "" в номере может выкинуть значащие нули из середины.

Для удаления повторяющихся двойных пробелов внутри текста используйте цикл:

Пока СтрНайти(Текст, "  ") > 0 Цикл

Текст = СтрЗаменить(Текст, " ", " ");

КонецЦикла;

Проверка длины и безопасная обрезка

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

Максимум = 50;

Результат = СокрЛП(ИсходнаяСтрока);

Если СтрДлина(Результат) > Максимум Тогда

Результат = Лев(Результат, Максимум);

КонецЕсли;

Такой шаблон стоит применять при записи данных в поля с ограничением длины: если строка не влезет, платформа либо молча усечёт её (что скроет проблему), либо выдаст ошибку при записи объекта в зависимости от контекста. Явная обрезка с проверкой делает поведение предсказуемым.

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

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

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

ВЫБРАТЬ

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

ИЗ

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

Учтите ограничение: ПОДСТРОКА не работает со строками неограниченной длины напрямую — их нужно предварительно привести к строке фиксированной длины через ВЫРАЗИТЬ(Поле КАК СТРОКА(1000)), иначе запрос вернёт ошибку. Также в запросе нет аналога СокрЛП, поэтому пробелы лучше удалять уже в коде после выборки.

Типичные ошибки при уменьшении строк

Большинство проблем связано не с самими функциями, а с невнимательностью к данным и контексту их применения.

Типичные ошибки
01
Вызов СокрЛП(Строка) без присваивания результата — строка остаётся неизменной, а разработчик считает, что очистка выполнена
02
Использование Сред() с нулевой начальной позицией по привычке из других языков — в 1С нумерация символов начинается с 1
03
СтрЗаменить для удаления фрагмента, который встречается в значащей части данных — удаляется больше, чем планировалось
04
Обрезка строки, содержащей переносы строк, без учёта того, что Символы.ПС тоже считается в СтрДлина()
05
Применение ПОДСТРОКА в запросе к полю неограниченной длины без ВЫРАЗИТЬ — запрос падает с ошибкой

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

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

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

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

Длина результата
Норма

СтрДлина() возвращает значение не больше заданного лимита

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

Длина больше лимита или результат пуст при непустом входе

Края строки
Норма

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

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

При выводе в квадратных скобках [строка] видны отступы

Содержимое
Норма

Удалены только целевые символы, значащие данные на месте

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

Пропали цифры номера, части наименования или префиксы, которые нужно было сохранить

Выбор подходящей функции

Маршрут решения

Как выбрать действие

Лишние пробелы или переносы в начале и в конце строкиИспользуйте СокрЛП() — этого достаточно в большинстве случаев загрузки данных
Строку нужно уложить в фиксированный лимит символовПроверьте СтрДлина() и обрежьте через Лев(), при необходимости добавьте пометку об усечении
Нужно убрать конкретный префикс, суффикс или символы внутри строкиПримените СтрЗаменить() с заменой на пустую строку и проверьте, что фрагмент не встречается в значащих данных
Обрезка нужна в отчёте или выборке без кодаИспользуйте ПОДСТРОКА() в запросе, предварительно приведя поле через ВЫРАЗИТЬ
Итог

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

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

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

Как убрать переносы строк из строки в 1С?

Используйте СтрЗаменить с константой Символы.ПС (и при необходимости Символы.ВК): Строка = СтрЗаменить(Строка, Символы.ПС, " "). Переносы заменяют на пробел, а не на пустую строку, чтобы слова на стыке не склеились.

Почему СокрЛП не убирает пробел внутри строки?

Так задумано: функция удаляет незначащие символы только слева и справа. Пробелы внутри текста считаются значащими. Для их удаления применяйте СтрЗаменить — одиночные пробелы целиком или двойные в цикле до полной очистки.

Что вернёт Лев(), если строка короче указанного числа символов?

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

Как обрезать строку неограниченной длины в запросе?

Сначала приведите поле к фиксированной длине: ВЫРАЗИТЬ(Поле КАК СТРОКА(1000)), а затем примените ПОДСТРОКА к результату. Без приведения запрос завершится ошибкой, так как ПОДСТРОКА не принимает строки неограниченной длины.

Можно ли уменьшить строку без написания кода, например в отчёте СКД?

Да. В схеме компоновки данных на закладке «Наборы данных» в запросе используйте ПОДСТРОКА, либо задайте выражение в вычисляемом поле. Для простых отчётов этого достаточно, код писать не потребуется.

Опасно ли массово обрезать наименования в справочнике?

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