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

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

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

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

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

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

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

Базовый способ: Сред() и конкатенация

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

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

НоваяСтрока = "Б" + Сред(ИсходнаяСтрока, 2);

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

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

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

bsl
ИсходнаяСтрока = "А12345";
НоваяСтрока = "Б" + Сред(ИсходнаяСтрока, 2);
Сообщить(НоваяСтрока); // Б12345

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

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

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

НоваяСтрока = "Б" + Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1);

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

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

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

Замена с проверками и по условию

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

Процедура ЗаменитьПервыйСимвол(ИсходнаяСтрока, НовыйСимвол)

Если СтрДлина(ИсходнаяСтрока) = 0 Тогда

Возврат; // нечего заменять

КонецЕсли;

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

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

Иначе

Результат = ИсходнаяСтрока; // условие не выполнено — оставляем как есть

КонецЕсли;

КонецПроцедуры

Типичный сценарий условной замены — смена регистра первой буквы. Для этого используют функции ВРег() и НРег() применительно к первому символу:

Строка = "номенклатура";

СтрокаСЗаглавной = ВРег(Лев(Строка, 1)) + Сред(Строка, 2);

// Результат: "Номенклатура"

Порядок действий
  1. 1
    Проверьте, что строка не пустая: СтрДлина(Строка) > 0
  2. 2
    При необходимости проверьте текущий первый символ через Лев(Строка, 1)
  3. 3
    Сформируйте результат: НовыйСимвол + Сред(Строка, 2)
  4. 4
    Присвойте результат переменной или реквизиту объекта
  5. 5
    Проверьте результат через Сообщить() или отладчик

Замена первого символа в реквизитах объектов

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

Товар = СсылкаНаТовар.ПолучитьОбъект();

Если СтрДлина(Товар.Артикул) > 0 Тогда

Товар.Артикул = "X" + Сред(Товар.Артикул, 2);

Товар.Записать();

КонецЕсли;

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

Особую осторожность проявляйте с кодами и номерами: если на них завязана синхронизация с другими системами (сайт, складская программа, ЭДО), изменение первого символа может привести к рассинхронизации и дублям при следующем обмене.

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

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

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

НоваяСтрока = "NEW" + Сред(ИсходнаяСтрока, 4);

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

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

Позиция = 3;

ИсходнаяСтрока = "АБВГД";

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

// Результат: "АБХГД"

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

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

Сред(Строка, 2) + конкатенация

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

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

Даёт тот же результат, но длиннее и падает с ошибкой на пустой строке без предварительной проверки.

СтрЗаменить()

Подходит для замены всех вхождений символа, но не для точечной замены именно первой позиции.

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

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

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

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

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

После замены убедитесь, что результат соответствует ожиданиям. Быстрый способ — вывести значение через Сообщить() или посмотреть переменную в отладчике, поставив точку останова после строки с заменой.

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

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

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

Совпадает с новым символом: Лев(Результат, 1) = НовыйСимвол

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

Остался старый символ или появился пробел

Длина строки
Норма

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

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

Длина изменилась — лишний символ или потерян хвост

Остаток строки
Норма

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

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

Хвост строки искажён или обрезан

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

Итог

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

Замена первого символа в 1С выполняется конструкцией НовыйСимвол + Сред(Строка, 2). Перед заменой проверяйте длину строки и текущий первый символ, результат обязательно присваивайте, а массовые изменения в данных делайте только после резервного копирования.

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

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

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

Можно ли заменить первый символ через СтрЗаменить()?

Технически можно, но СтрЗаменить() заменит все вхождения указанного символа в строке, а не только первое. Для точечной замены первой позиции используйте НовыйСимвол + Сред(Строка, 2).

Как заменить первый символ только если он цифра?

Проверьте первый символ условием, например: Если Лев(Строка, 1) >= "0" И Лев(Строка, 1) <= "9" Тогда, либо через СтрНайти("0123456789", Лев(Строка, 1)) > 0. Если условие выполняется — применяйте стандартную замену через Сред().

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

Используйте комбинацию: ВРег(Лев(Строка, 1)) + Сред(Строка, 2). Функция ВРег() переводит первый символ в верхний регистр, остальная часть строки остаётся без изменений.

Нумерация символов в 1С начинается с 0 или с 1?

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

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

Сделайте выборку элементов запросом или методом Выбрать(), в цикле получайте объект, меняйте реквизит через НовыйСимвол + Сред(Реквизит, 2) и записывайте. Перед запуском обязательно создайте резервную копию базы и проверьте обработку на нескольких элементах.