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

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

Как удалить первый символ в строке в 1С

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

Во встроенном языке 1С нет отдельной функции «удалить первый символ», поэтому задача решается через стандартные строковые функции: Сред(), Прав() и СтрДлина(). Чаще всего используют конструкцию Сред(Строка, 2) — она возвращает исходную строку начиная со второго символа, то есть фактически отрезает первый.

Такая операция нужна на практике чаще, чем кажется: очистка номеров документов от префикса, удаление служебного символа из штрихкода, обработка данных при загрузке из Excel или CSV, срезание ведущего знака «+» в телефоне или символа «№». Во всех этих случаях важно не только правильно вызвать функцию, но и убедиться, что строка не пустая и первый символ действительно тот, который нужно удалить.

Ниже разобраны основные способы, готовые примеры кода, проверки перед удалением и типичные ошибки, из-за которых результат получается пустым или искажённым.

Удаление первого символа через функцию Сред()

Функция Сред(Строка, НачальнаяПозиция, ЧислоСимволов) возвращает подстроку, начиная с указанной позиции. Если третий параметр не задан, берутся все символы до конца строки. Поэтому для удаления первого символа достаточно написать:

ИсходнаяСтрока = "А123456";

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

// Результат: "123456"

Нумерация символов в 1С начинается с единицы, а не с нуля — это важно для тех, кто пришёл из других языков. Позиция 2 означает «начиная со второго символа», то есть первый символ просто не попадает в результат.

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

bsl
Строка = "А123456";
Результат = Сред(Строка, 2); // "123456"

Альтернатива через Прав() и СтрДлина()

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

ИсходнаяСтрока = "А123456";

Результат = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1);

// Результат: "123456"

Этот способ даёт тот же результат, но требует дополнительного вычисления длины. Он удобен, когда в коде уже используется переменная с длиной строки или когда по смыслу алгоритма логичнее оперировать «хвостом» строки.

У подхода есть подводный камень: если строка пустая, СтрДлина() вернёт 0, и вызов Прав(Строка, -1) приведёт к ошибке, так как длина не может быть отрицательной. Поэтому перед таким вариантом проверка длины обязательна.

Сравнение вариантов

Сред(Строка, 2)

Основной способ: короткий, без вычисления длины, безопасен на строке из одного символа — вернёт пустую строку.

Прав(Строка, СтрДлина(Строка)-1)

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

СтрЗаменить по шаблону

Используется, когда нужно удалить конкретный известный символ в начале, а не любой первый.

Проверка строки перед удалением

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

Типовая безопасная обёртка выглядит так:

Функция УдалитьПервыйСимвол(Знач Строка)

Если СтрДлина(Строка) <= 1 Тогда

Возврат "";

КонецЕсли;

Возврат Сред(Строка, 2);

КонецФункции

Если нужно удалить первый символ только при совпадении с ожидаемым (например, префикс «№» или «+»), добавьте проверку через Лев():

Если Лев(Строка, 1) = "№" Тогда

Строка = Сред(Строка, 2);

КонецЕсли;

Порядок действий
  1. 1
    Убедитесь, что значение имеет тип Строка — при необходимости преобразуйте через Строка() или СокрЛП().
  2. 2
    Проверьте длину: СтрДлина(Строка) должна быть больше 1, иначе удалять нечего.
  3. 3
    При необходимости проверьте первый символ через Лев(Строка, 1).
  4. 4
    Выполните Результат = Сред(Строка, 2).
  5. 5
    Проверьте результат на тестовом примере: длина должна уменьшиться ровно на один символ.

Удаление нескольких первых символов и связанные задачи

Тот же приём работает для удаления любого числа начальных символов: Сред(Строка, 3) уберёт два первых символа, Сред(Строка, 4) — три. Общее правило: чтобы отрезать N первых символов, передайте начальную позицию N+1.

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

Префикс = "ORG-";

Если Лев(Строка, СтрДлина(Префикс)) = Префикс Тогда

Строка = Сред(Строка, СтрДлина(Префикс) + 1);

КонецЕсли;

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

Типичные ошибки и как их избежать

Самая распространённая ошибка — забыть присвоить результат функции. Вызов Сред(Строка, 2); без присваивания выполнится без ошибок, но переменная не изменится, и дальше по алгоритму пойдёт исходная строка с первым символом.

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

Третья ошибка — удаление первого символа там, где на самом деле нужно удалить префикс переменной длины. Например, в номерах «А-001» и «АБ-002» префиксы разной длины, и фиксированный срез одного символа даст некорректный результат для второго номера. В таких случаях ищите разделитель через СтрНайти() и отрезайте по его позиции.

Типичные ошибки
01
Вызов Сред(Строка, 2) без присваивания результата — переменная остаётся без изменений.
02
Применение Прав(Строка, СтрДлина(Строка)-1) к пустой строке — ошибка отрицательной длины.
03
Срезание первого символа без проверки его значения — теряются значимые данные при разнородных форматах.
04
Путаница с нумерацией: попытка начать с позиции 0, как в других языках, — в 1С позиции начинаются с 1.

Проверка результата

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

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

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

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

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

На 1 меньше исходной строки

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

Длина не изменилась — результат не присвоен

Строка из одного символа
Норма

Возвращается пустая строка

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

Ошибка исполнения или исходное значение

Пустая строка на входе
Норма

Возвращается пустая строка без ошибок

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

Ошибка отрицательной длины при варианте с Прав()

Первый символ результата
Норма

Совпадает со вторым символом исходной строки

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

Срезался лишний символ или не тот

FAQ

Как удалить первый символ, только если это конкретный знак, например «+»?

Используйте проверку через Лев(): Если Лев(Строка, 1) = "+" Тогда Строка = Сред(Строка, 2); КонецЕсли. Так вы не тронете строки, где первого символа-признака нет.

Что вернёт Сред(Строка, 2), если строка пустая?

Пустую строку, без ошибки исполнения. Однако логически это может быть нежелательно, поэтому в массовых обработках лучше явно проверять СтрДлина(Строка) > 1 перед срезанием.

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

Передайте в Сред() начальную позицию, равную количеству удаляемых символов плюс один: Сред(Строка, 4) удалит первые три символа. Перед этим убедитесь, что СтрДлина(Строка) > 3.

Можно ли удалить первый символ в запросе, а не в коде?

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

Почему после Сред(Строка, 2) переменная не изменилась?

Строковые функции в 1С возвращают новое значение и не меняют исходную переменную. Нужно явное присваивание: Строка = Сред(Строка, 2).

Чем удалить первый символ, если это неразрывный пробел из загруженного файла?

СокрЛ() убирает пробельные символы слева, включая неразрывный пробел. Если нужно удалить ровно один такой символ, сначала проверьте его код через КодСимвола(Строка, 1), а затем используйте Сред(Строка, 2).

Итог

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

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