Разработка и Конфигурация · 12 мин
Как вырезать часть строки в 1С: функции и примеры
Как вырезать часть строки в 1С: функции Лев, Прав, Сред, СтрНайти и СтрЗаменить. Примеры кода, типичные ошибки и способы проверки результата.
Задача вырезать часть строки в 1С возникает постоянно: извлечь номер из наименования документа, убрать префикс, отделить часть артикула, обрезать длинное описание. Встроенный язык 1С предоставляет для этого несколько базовых функций — Лев(), Прав(), Сред(), СтрНайти() и СтрЗаменить(), — которых достаточно для подавляющего большинства практических сценариев.
Ключевой момент, который нужно понять сразу: в 1С нумерация символов строки начинается с единицы, а не с нуля, как во многих других языках. Это частая причина ошибок «на один символ» у разработчиков, пришедших из других сред. Также
Выбор конкретной функции зависит от того, известна ли позиция вырезаемого фрагмента заранее или её нужно вычислять по содержимому строки. Ниже разобраны все основные приёмы с примерами кода и указанием типичных ошибок.
Функция Лев(): вырезать начало строки
Функция Лев(Строка, ЧислоСимволов) возвращает указанное количество символов с начала строки. Это самый простой способ обрезать строку до нужной длины или взять фиксированный префикс.
Артикул = "ПРФ-10245-СИН";
Префикс = Лев(Артикул, 3); // "ПРФ"
Описание = "Очень длинный текст описания товара, который не помещается";
Краткое = Лев(Описание, 30); // первые 30 символов
Если запрошенное число символов больше длины строки, функция вернёт всю строку целиком без ошибки. Это удобно: не нужно заранее проверять длину при простом обрезании. Однако если требуется добавить многоточие к сокращённому тексту, проверку длины придётся выполнить вручную через СтрДлина().
Если СтрДлина(Описание) > 30 Тогда
Краткое = Лев(Описание, 30) + "..";
Иначе
Краткое = Описание;
КонецЕсли;
Функция Прав(): вырезать конец строки
Функция Прав(Строка, ЧислоСимволов) работает зеркально: возвращает указанное количество символов с конца строки. Типовой сценарий — извлечение номера или суффикса фиксированной длины.
Код = "ТОВ-000345";
ПоследниеЦифры = Прав(Код, 6); // "000345"
Частая задача — убрать из строки хвост известной длины, например расширение файла. Здесь Прав() комбинируется с Лев() и СтрДлина():
ИмяФайла = "Отчет_продажи.xlsx";
ДлинаРасширения = 5; // ".xlsx" — 5 символов
БезРасширения = Лев(ИмяФайла, СтрДлина(ИмяФайла) - ДлинаРасширения); // "Отчет_продажи"
Будьте внимательны: если длина строки меньше вычитаемого значения, во второй параметр Лев() уйдёт отрицательное число, что приведёт к ошибке выполнения. Перед такой операцией стоит убедиться, что строка действительно заканчивается ожидаемым суффиксом.
Функция Сред(): вырезать фрагмент из середины строки
Функция Сред(Строка, НачальнаяПозиция, ЧислоСимволов) — универсальный инструмент: она извлекает фрагмент начиная с указанной позиции. Третий параметр можно опустить, тогда вернётся всё от начальной позиции до конца строки.
Строка = "АБВ-12345-ГДЕ";
Фрагмент = Сред(Строка, 5, 5); // "12345"
Хвост = Сред(Строка, 5); // "12345-ГДЕ"
Классическая задача — убрать префикс известной длины. Для этого достаточно взять Сред() с позиции, следующей за префиксом:
НомерДокумента = "00БП-004521";
БезПрефикса = Сред(НомерДокумента, 5); // "004521"
Если начальная позиция больше длины строки, функция вернёт пустую строку. Если позиция равна нулю или отрицательна — поведение зависит от версии платформы и может привести к ошибке, поэтому вычисляемые позиции всегда стоит контролировать.
СтрНайти(): вырезать фрагмент по содержимому, а не по позиции
На практике позиция нужного фрагмента редко известна заранее. Функция СтрНайти(Строка, ПодстрокаПоиска) возвращает позицию первого вхождения подстроки или 0, если подстрока не найдена. В связке с Лев(), Прав() и Сред() это позволяет вырезать текст до разделителя, после него или между двумя разделителями.
ПолноеИмя = "Иванов Сергей Петрович";
ПозицияПробела = СтрНайти(ПолноеИмя, " ");
Фамилия = Лев(ПолноеИмя, ПозицияПробела - 1); // "Иванов"
Остаток = Сред(ПолноеИмя, ПозицияПробела + 1); // "Сергей Петрович"
Вырезать текст между двумя разделителями
Когда нужен фрагмент между двумя маркерами, сначала находится позиция первого разделителя, затем от неё ищется второй. Параметр НаправлениеПоиска и начальная позиция в СтрНайти() позволяют искать не с начала строки, а с нужного места.
Строка = "Товар [АРТ: 45678] складской";
ПозНач = СтрНайти(Строка, "[");
ПозКон = СтрНайти(Строка, "]");
Если ПозНач > 0 И ПозКон > ПозНач Тогда
Внутри = Сред(Строка, ПозНач + 1, ПозКон - ПозНач - 1); // "АРТ: 45678"
КонецЕсли;
Обратите внимание на проверку условий: без неё, если разделителей в строке не окажется, вы получите либо ошибку, либо непредсказуемый фрагмент. Такой защитный код обязателен при обработке данных, пришедших из внешних источников — файлов обмена, веб-сервисов, ввода пользователя.
- 1Найдите позицию разделителя через СтрНайти() и сохраните её в переменную
- 2Проверьте, что позиция больше 0 — иначе подстрока не найдена
- 3Вычислите нужный фрагмент через Лев(), Прав() или Сред() с учётом длины самого разделителя
- 4Проверьте результат на тестовых строках: с разделителем, без него и с несколькими вхождениями
СтрЗаменить(): удалить подстроку из строки
Если требуется не извлечь фрагмент, а именно вырезать (удалить) известную подстроку, проще всего использовать СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены) с пустой строкой в качестве замены.
Наименование = "Товар (УСТАРЕЛ) позиция";
Чистое = СтрЗаменить(Наименование, "(УСТАРЕЛ) ", ""); // "Товар позиция"
Важная особенность: СтрЗаменить() заменяет все вхождения подстроки, а не только первое. Если нужно удалить только одно вхождение, придётся комбинировать СтрНайти() со сцепкой левой и правой частей:
Строка = "один; два; три";
Поз = СтрНайти(Строка, "; ");
Если Поз > 0 Тогда
Результат = Лев(Строка, Поз - 1) + Сред(Строка, Поз + 2); // "один три"
КонецЕсли;
Удаление непечатаемых символов
При загрузке данных из файлов в строках часто встречаются переносы строк, табуляции и неразрывные пробелы. Их убирают через СтрЗаменить() с символами из Символы:
Текст = СтрЗаменить(Текст, Символы.ПС, " ");
Текст = СтрЗаменить(Текст, Символы.Таб, " ");
Текст = СтрЗаменить(Текст, Символ(160), " "); // неразрывный пробел
Текст = СокрЛП(Текст);
Дополнительные приёмы: СокрЛП, СтрРазделить и регулярные выражения
Функции СокрЛ(), СокрП() и СокрЛП() вырезают пробельные символы с начала, с конца или с обеих сторон строки. Это самый безопасный способ очистки пользовательского ввода, и его стоит применять почти всегда перед дальнейшей обработкой.
Когда строку нужно разрезать сразу на несколько частей по разделителю, удобнее СтрРазделить(): функция возвращает массив подстрок, из которого берутся нужные элементы по индексу (индексация массива — с нуля).
Части = СтрРазделить("Иванов;Сергей;Петрович", ";");
Фамилия = Части[0]; // "Иванов"
Имя = Части[1]; // "Сергей"
В управляемых приложениях и на сервере доступны и регулярные выражения через COM-объект VBScript.RegExp (на Windows) — для сложных шаблонов вроде «вырезать всё, кроме цифр». Однако для типовых задач это избыточно: связка базовых строковых функций работает быстрее и читается проще.
Сравнение способов вырезания
Подходят, когда позиция или длина фрагмента известны заранее. Ограничение: требуют ручного расчёта позиций и проверок
Универсальный вариант, когда позиция определяется содержимым строки. Требует обязательной проверки на 0
Лучший способ удалить известную подстроку целиком. Заменяет все вхождения, что не всегда нужно
Удобен, когда строку нужно разрезать на несколько частей сразу. Не подходит для удаления фрагмента из середины
Проверка результата и границы применения
После написания кода проверьте его минимум на четырёх вариантах входных данных: нормальная строка, строка без искомого разделителя, пустая строка и строка, где разделитель стоит в самом начале или конце. Эти четыре случая покрывают почти все ошибки, встречающиеся в реальной эксплуатации.
Признак корректной работы — функция возвращает ожидаемый фрагмент для всех контрольных примеров, а для «плохих» входных данных возвращает либо пустую строку, либо исходное значение без падения с ошибкой. Если код падает с сообщением о неверном параметре — почти наверняка в Сред() или Лев() ушёл ноль или отрицательное число.
Для отладки удобно выводить промежуточные значения через Сообщить() или использовать консоль кода на управляемых формах: введите тестовую строку, выполните преобразование, проверьте результат. Это быстрее, чем отладка в контексте реального документа.
Как проверить результат
Значение больше 0, фрагмент вырезается корректно
Возвращён 0 — подстрока не найдена, дальнейшие вычисления дадут ошибку
Соответствует ожидаемой, крайние символы не обрезаны и не лишние
Результат сдвинут на символ — вероятно, перепутана нумерация с 1
Возвращается пустая строка без ошибки
Исключение или неопределённое значение
Что важно запомнить
Начало строки вырезают через Лев(), конец — через Прав(), произвольный фрагмент — через Сред(), позицию ищут через СтрНайти(), удаляют подстроку через СтрЗаменить(). Нумерация символов начинается с 1, результат всегда возвращается новой строкой, а вычисляемые позиции обязательно проверяются на 0.
Частые вопросы
Как удалить первые N символов строки в 1С?
Используйте Сред(Строка, N + 1) — функция вернёт всё от позиции N+1 до конца строки. Например, Сред("АБВГД", 3) даст "ВГД", то есть удалит первые два символа. Альтернатива — Прав(Строка, СтрДлина(Строка) - N), но первый вариант короче и надёжнее при коротких строках.
Как вырезать последние N символов из строки?
Для удаления хвоста используйте Лев(Строка, СтрДлина(Строка) - N). Если нужно наоборот получить последние N символов — примените Прав(Строка, N). Перед удалением убедитесь, что длина строки больше N, иначе параметр уйдёт в минус.
Почему СтрНайти возвращает 0 и что с этим делать?
Ноль означает, что искомая подстрока в строке не найдена. Это нормальная ситуация, а не ошибка: проверяйте результат условием «Если Позиция > 0 Тогда» и только внутри ветки выполняйте вырезание. Иначе Сред() с позицией 0 приведёт к неверному результату или исключению.
Как вырезать из строки только цифры или только буквы?
Готовой функции нет — нужен цикл по символам строки с проверкой каждого символа. Проще всего перебрать строку посимвольно через Сред(Строка, Позиция, 1) и собирать результат, проверяя вхождение символа в строку "0123456789" через СтрНайти. Для сложных шаблонов на сервере под Windows можно использовать регулярные выражения через COM-объект.
Чем отличается СтрНайти от Найти в 1С?
Найти() — устаревший метод, сохранённый для совместимости со старым кодом; в новых разработках платформа рекомендует СтрНайти(). Поведение при поиске с начала строки у них одинаковое, но СтрНайти поддерживает расширенные параметры: направление поиска, начальную позицию и номер вхождения.
Как вырезать часть строки в запросе 1С, а не в коде?
В языке запросов доступны функции ПОДСТРОКА(Строка, Начало, Длина) — аналог Сред(), а также ЛЕВ() и ПРАВ() отсутствуют, их заменяет та же ПОДСТРОКА с позиции 1. Учтите, что работа со строками в запросе медленнее и ограниченнее: сложную обработку лучше выполнять уже в коде после выгрузки результата.