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

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

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

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

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

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

Способ 1: функция Сред() — основной вариант

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

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

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

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

Это самый читаемый и короткий вариант. Конструкция Сред(Строка, 2) буквально читается как «всё, начиная со второго символа», то есть первый символ отбрасывается. Функция не изменяет исходную переменную — она возвращает новое значение, которое нужно присвоить переменной или использовать в выражении.

Важная особенность: если передать в Сред() начальную позицию больше длины строки, функция вернёт пустую строку, а не ошибку. Это значит, что Сред("А", 2) корректно вернёт "", и код не упадёт на строке из одного символа.

bsl
Результат = Сред(ИсходнаяСтрока, 2); // удалить первый символ

Способ 2: функция Прав() в сочетании со СтрДлина()

Второй вариант — взять правую часть строки длиной «вся строка минус один символ»:

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

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

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

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

На пустой строке выражение СтрДлина(Строка) - 1 даст -1. Функция Прав() при отрицательной или нулевой длине возвращает пустую строку, поэтому аварийного завершения не произойдёт. Тем не менее способ через Сред() предпочтительнее: он короче и не требует лишнего вычисления.

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

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

Рекомендуемый вариант: короткий, читаемый, безопасен на пустых и односимвольных строках.

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

Даёт тот же результат, но длиннее. Подходит, если в коде уже используется Прав() или нужна явная проверка длины.

Удаление первого символа только при определённом условии

На практике редко нужно срезать первый символ безусловно. Чаще требуется удалить его, только если это конкретный знак — например, префикс «#», служебный символ из штрихкода или лишний пробел в начале. Для этого первый символ проверяют через Лев():

Если Лев(ИсходнаяСтрока, 1) = "#" Тогда

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

Иначе

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

КонецЕсли;

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

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

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

Тот же приём работает для любого количества начальных символов. Чтобы убрать первые три символа, передайте начальную позицию 4:

ИсходнаяСтрока = "PRE-98765";

Результат = Сред(ИсходнаяСтрока, 5); // убрать "PRE-"

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

Если длина префикса хранится в переменной, позицию вычисляют как ДлинаПрефикса + 1. Например, при обрезке известного префикса документа:

Префикс = "ОРД-";

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

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

КонецЕсли;

Такая конструкция универсальна: она не привязана к конкретной длине префикса и продолжит работать, если префикс изменится. Перед срезанием полезно убедиться, что строка вообще длиннее префикса — иначе результатом будет пустая строка, что не всегда допустимо по логике обработки.

Граничные случаи: пустые и короткие строки

Безопасность строковых операций зависит от того, что может прийти на вход. Разберём типовые ситуации:

  • Пустая строка. Сред("", 2) вернёт пустую строку — ошибки не будет.
  • Строка из одного символа. Сред("А", 2) вернёт "". Если по логике задачи пустой результат недопустим, добавьте проверку СтрДлина(Строка) > 1.
  • Неопределено вместо строки. Если переменная может содержать Неопределено (например, реквизит не заполнен), сначала преобразуйте значение: Строка = Строка(Значение) или проверьте тип через ТипЗнч().
  • Строка из пробелов. Визуально «пустая» строка может содержать пробелы. Проверяйте её через ПустаяСтрока(СокрЛП(Значение)).

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

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

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

Обычная строка с префиксом
Норма

Первый символ удалён, остальное без изменений

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

Потеряно два символа или строка не изменилась

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

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

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

Ошибка выполнения или непредусмотренное значение

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

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

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

Исключение или обращение к несуществующей позиции

Строка без ожидаемого префикса
Норма

При условном удалении значение осталось исходным

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

Первый символ удалён у корректных данных

Типичные ошибки при срезании первого символа

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

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

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

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

Где применяется на практике

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

Второй сценарий — загрузка данных из Excel или CSV, где значения могут начинаться с апострофа или другого знака, добавленного для принудительного текстового формата. Третий — нормализация номеров документов при обмене между базами с разными префиксами, когда префикс нужно снять перед сопоставлением.

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

Итог

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

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

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

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

В языке запросов есть функция ПОДСТРОКА(Строка, Начало, Длина). Чтобы убрать первый символ, укажите начало 2, а длиной можно задать заведомо большое число, например ПОДСТРОКА(Поле, 2, 1000). Учтите, что фиксированная длина должна покрывать максимально возможную длину значения.

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

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

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

В обоих случаях функция вернёт пустую строку без ошибки выполнения. Если пустой результат недопустим по логике обработки, добавьте проверку СтрДлина(Строка) > 1 перед срезанием.

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

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

Как убрать первые несколько символов, например префикс из трёх знаков?

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

Чем удалить ведущие пробелы вместо ручного срезания?

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