Разработка и Конфигурация · 9 мин
Как убрать первый символ из строки в 1С
Как убрать первый символ из строки в 1С через Сред() и Прав(), проверка пустой строки, обрезка нескольких символов, типовые ошибки и готовые примеры кода.
Задача убрать первый символ из строки в 1С возникает постоянно: при обработке номеров документов с префиксом, при разборе данных из файлов обмена, при очистке значений, загруженных из Excel или внешних систем. Во встроенном языке 1С нет отдельной функции «удалить первый символ», но задача решается одной строкой кода через функции работы со строками — Сред() или Прав().
Основной способ — функция Сред(Строка, 2): она возвращает подстроку начиная со второго символа и до конца, то есть фактически отрезает первый символ. Альтернатива — Прав(Строка, СтрДлина(Строка) - 1), которая берёт нужное количество символов справа. Оба варианта дают одинаковый результат, но ведут себя по-разному на граничных случаях.
Прежде чем обрезать строку, важно убедиться, что она непустая и что первый символ действительно нужно удалять. Обрезка «вслепую» — частая причина испорченных номеров документов и потери данных при обмене. Ниже разобраны рабочие примеры кода, проверки и типичные ошибки.
Функция Сред() — основной способ убрать первый символ
Функция Сред() извлекает подстроку, начиная с указанной позиции. Синтаксис: Сред(Строка, НачальнаяПозиция, ЧислоСимволов). Если третий параметр не указан, возвращается всё от начальной позиции до конца строки. Нумерация символов в 1С начинается с единицы, поэтому позиция 2 — это второй символ.
Чтобы убрать первый символ, достаточно написать:
ИсходнаяСтрока = "А123456";
Результат = Сред(ИсходнаяСтрока, 2);
// Результат: "123456"
Такой приём работает для строк любой длины. Если строка состоит из одного символа, Сред(Строка, 2) вернёт пустую строку — ошибки не будет, но результат нужно контролировать. Если строка пустая изначально, результат тоже будет пустым, без исключения.
Результат = Сред(ИсходнаяСтрока, 2); // убирает первый символ строкиАльтернатива через Прав() и СтрДлина()
Второй вариант — взять строку справа, отбросив один символ слева. Для этого вычисляется длина строки функцией СтрДлина(), из неё вычитается единица, и результат передаётся в Прав():
ИсходнаяСтрока = "А123456";
Результат = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1);
// Результат: "123456"
Этот способ длиннее и требует дополнительного вычисления, поэтому на практике чаще используют Сред(). Однако у Прав() есть особенность: если строка пустая, СтрДлина(Строка) - 1 даст отрицательное число, и поведение функции на отрицательной длине может отличаться в зависимости от версии платформы. Поэтому вариант с Прав() обязательно требует предварительной проверки длины.
Сравнение способов
Короткая запись, безопасна для пустых и односимвольных строк. Рекомендуемый вариант в большинстве случаев.
Даёт тот же результат, но требует проверки длины: при пустой строке вычисление уходит в минус. Подходит, когда логика уже построена на Прав().
Подходит, только если нужно убрать конкретный известный символ (например, префикс), а не любой первый символ подряд.
Обязательные проверки перед обрезкой строки
Самая частая ошибка — обрезать первый символ без проверки, а нужно ли это делать. Если строка пришла из внешнего источника, префикса в ней может и не быть, и тогда вы потеряете значащий символ. Например, номер «000123» без буквы после обрезки превратится в «00123» — данные испорчены.
Минимальный безопасный шаблон выглядит так:
Если СтрДлина(ИсходнаяСтрока) > 1 Тогда
Результат = Сред(ИсходнаяСтрока, 2);
Иначе
Результат = ИсходнаяСтрока;
КонецЕсли;
Если первый символ должен быть конкретным (например, буква префикса), проверяйте его через Лев():
Если Лев(ИсходнаяСтрока, 1) = "А" Тогда
Результат = Сред(ИсходнаяСтрока, 2);
Иначе
Результат = ИсходнаяСтрока;
КонецЕсли;
Как убрать несколько первых символов
Если нужно удалить не один, а несколько символов с начала строки, меняется только начальная позиция в Сред(). Например, чтобы убрать три первых символа:
ИсходнаяСтрока = "ПРФ-00125";
Результат = Сред(ИсходнаяСтрока, 4);
// Результат: "00125"
Правило простое: начальная позиция = количество удаляемых символов + 1. При этом проверка длины становится ещё важнее: если строка короче, чем число удаляемых символов, результат будет пустым. Для надёжности сравнивайте СтрДлина(Строка) с пороговым значением до обрезки.
- 1Проверьте, что строка непустая: СтрДлина(Строка) > 0.
- 2При необходимости убедитесь, что первый символ — ожидаемый префикс: Лев(Строка, 1).
- 3Выполните обрезку: Результат = Сред(Строка, 2).
- 4Проверьте результат: выведите его в сообщение или журнал перед записью в базу.
- 5При массовой обработке сначала запустите код в тестовом режиме без записи данных.
Практические сценарии: номера документов и данные обмена
Удаление префикса из номера документа
Типовая задача — получить числовую часть номера документа, отбросив буквенный префикс. Если префикс всегда односимвольный, достаточно Сред(Номер, 2). Если длина префикса различается, надёжнее найти позицию разделителя через СтрНайти() и взять подстроку после него:
Номер = "ПРФ-00125";
Позиция = СтрНайти(Номер, "-");
Если Позиция > 0 Тогда
Результат = Сред(Номер, Позиция + 1);
Иначе
Результат = Номер;
КонецЕсли;
// Результат: "00125"
Очистка строк при загрузке из файлов
При загрузке из CSV, DBF или Excel в начало значений иногда попадают служебные символы: кавычки, маркеры кодировки, неразрывные пробелы. Перед обрезкой полезно применить СокрЛП(), чтобы убрать пробельные символы по краям, — иначе «первым символом» может оказаться пробел, и вы удалите не то, что планировали.
Типичные ошибки и как их избежать
Первая ошибка — забыть, что нумерация символов в 1С начинается с 1, а не с 0. Запись Сред(Строка, 1) вернёт строку целиком, а Сред(Строка, 0) приведёт к непредсказуемому результату. Правильная позиция для удаления первого символа — 2.
Вторая ошибка — обрезка строки, полученной из реквизита неограниченной длины или из результата запроса, где значение может быть NULL. Значение NULL из запроса нельзя передать в строковые функции напрямую — сначала проверьте его или приведите к строке.
Проверка результата и отладка
После обрезки убедитесь, что результат соответствует ожиданиям. В отладчике конфигуратора поставьте точку останова после строки с Сред() и посмотрите значение переменной в табло. Для массовых обработок полезно выводить пары «было — стало» через Сообщить() до включения записи в базу.
Как проверить результат
На 1 меньше длины исходной строки
Длина не изменилась или строка стала пустой при непустом входе
Совпадает со вторым символом исходной строки
Совпадает с первым — обрезка не сработала
Остались без изменений благодаря проверке Лев()
Потеряли первый символ — проверка отсутствует
Если обработка работает в цикле по большому объёму данных, протестируйте её на копии базы или на ограниченной выборке. Логировать результаты удобно через запись в текстовый файл или в журнал регистрации — так проще найти строки, где обрезка дала неожиданный результат.
Что важно запомнить
Первый символ строки в 1С убирается одной командой: Сред(Строка, 2). Перед обрезкой проверяйте длину строки и при необходимости сам первый символ через Лев(). Для префиксов с разделителем надёжнее использовать СтрНайти(). Массовую обработку всегда сначала запускайте в тестовом режиме без записи.
Частые вопросы
Как убрать первый символ, только если это буква?
Проверьте первый символ через Лев(Строка, 1) и сравните его с нужным значением или диапазоном. Например: Если Лев(Строка, 1) = "А" Тогда Результат = Сред(Строка, 2). Для проверки «любая буква» можно использовать СтрНайти() по строке допустимых символов или регулярные выражения через внешние компоненты.
Что вернёт Сред(Строка, 2), если строка пустая?
Вернётся пустая строка, ошибки выполнения не произойдёт. Однако логически это может быть проблемой: если дальше результат записывается в обязательный реквизит, проверку на пустоту лучше добавить явно.
Как убрать первый символ у каждой строки в цикле или таблице значений?
Обойдите коллекцию в цикле и присвойте обрезанное значение обратно: Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл СтрокаТЗ.Код = Сред(СтрокаТЗ.Код, 2); КонецЦикла. Перед циклом убедитесь, что колонка имеет строковый тип достаточной длины.
Можно ли убрать первый символ в запросе 1С?
Да, в языке запросов есть функция ПОДСТРОКА(Выражение, Начало, Длина). Записав ПОДСТРОКА(Номер, 2, 100), вы получите строку без первого символа прямо в выборке. Учтите, что третий параметр (длина) в запросе обязателен — укажите заведомо достаточное значение.
Чем отличается Сред() от Прав() при удалении первого символа?
Результат одинаковый, но Сред(Строка, 2) короче и безопаснее: она корректно работает с пустыми и односимвольными строками. Прав(Строка, СтрДлина(Строка) - 1) требует проверки длины, так как при пустой строке аргумент длины становится отрицательным.