Разработка и Конфигурация · 10 мин
Как заменить первый символ в строке 1С
Разбираем, как заменить первый символ в строке 1С: функции Лев, Сред, Прав, СтрДлина, готовые примеры кода, типичные ошибки и проверка результата.
Замена первого символа в строке — типовая задача при разработке на платформе 1С:Предприятие. Она возникает при формировании номеров документов, нормализации артикулов, преобразовании регистра первой буквы, маскировании данных в отчётах и при обмене с внешними системами, где формат строки жёстко регламентирован.
Во встроенном языке 1С нет отдельной функции «заменить символ по позиции», поэтому задача решается комбинацией строковых функций: Лев(), Сред(), Прав() и СтрДлина(). Базовый приём — отрезать первый символ и подставить новый в начало строки.
Ниже разобраны рабочие варианты кода для разных сценариев: простая замена, замена с проверками, замена по условию, обработка нескольких строк и частые ошибки, которые приводят к потере данных или искажению значений.
Базовый способ: Сред() и конкатенация
Самый простой и надёжный вариант — отсечь первый символ функцией Сред() и добавить новый символ в начало оператором конкатенации «+». Функция Сред(Строка, 2) возвращает подстроку, начиная со второго символа и до конца строки.
ИсходнаяСтрока = "А12345";
НоваяСтрока = "Б" + Сред(ИсходнаяСтрока, 2);
// Результат: "Б12345"
Этот подход работает для строк любой длины, включая односимвольные: если в строке один символ, Сред(Строка, 2) вернёт пустую строку, и результатом будет просто новый символ. Это ожидаемое поведение, но его стоит учитывать, если пустой хвост для вас недопустим.
Обратите внимание: строки в 1С неизменяемы в том смысле, что функции не модифицируют исходную переменную, а возвращают новое значение. Поэтому результат всегда нужно присваивать — либо в новую переменную, либо обратно в ту же самую.
ИсходнаяСтрока = "А12345";
НоваяСтрока = "Б" + Сред(ИсходнаяСтрока, 2);
Сообщить(НоваяСтрока); // Б12345Альтернативный вариант через Прав() и СтрДлина()
Тот же результат можно получить через функцию Прав(), которая возвращает указанное количество символов с конца строки. Чтобы отбросить первый символ, нужно взять СтрДлина(Строка) - 1 символов справа.
ИсходнаяСтрока = "А12345";
НоваяСтрока = "Б" + Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока) - 1);
// Результат: "Б12345"
Этот вариант длиннее и требует дополнительного вызова СтрДлина(), поэтому в повседневной практике чаще используют Сред(). Однако Прав() удобна, когда вы одновременно решаете смежную задачу — например, уже работаете с окончанием строки и хотите единообразно оформить код.
Важный нюанс: если строка пустая, СтрДлина() вернёт 0, и выражение Прав(Строка, -1) вызовет ошибку выполнения. Поэтому вариант с Прав() обязательно требует предварительной проверки длины, тогда как Сред(ПустаяСтрока, 2) просто вернёт пустую строку.
Замена с проверками и по условию
В реальном коде замена почти никогда не выполняется «в лоб». Сначала нужно убедиться, что строка не пустая, а иногда — что первый символ действительно тот, который вы ожидаете заменить. Иначе можно незаметно испортить данные: например, заменить префикс в номере, где префикса уже нет.
Процедура ЗаменитьПервыйСимвол(ИсходнаяСтрока, НовыйСимвол)
Если СтрДлина(ИсходнаяСтрока) = 0 Тогда
Возврат; // нечего заменять
КонецЕсли;
Если Лев(ИсходнаяСтрока, 1) = "А" Тогда
Результат = НовыйСимвол + Сред(ИсходнаяСтрока, 2);
Иначе
Результат = ИсходнаяСтрока; // условие не выполнено — оставляем как есть
КонецЕсли;
КонецПроцедуры
Типичный сценарий условной замены — смена регистра первой буквы. Для этого используют функции ВРег() и НРег() применительно к первому символу:
Строка = "номенклатура";
СтрокаСЗаглавной = ВРег(Лев(Строка, 1)) + Сред(Строка, 2);
// Результат: "Номенклатура"
- 1Проверьте, что строка не пустая: СтрДлина(Строка) > 0
- 2При необходимости проверьте текущий первый символ через Лев(Строка, 1)
- 3Сформируйте результат: НовыйСимвол + Сред(Строка, 2)
- 4Присвойте результат переменной или реквизиту объекта
- 5Проверьте результат через Сообщить() или отладчик
Замена первого символа в реквизитах объектов
На практике строка чаще всего хранится не в переменной, а в реквизите справочника или документа — например, в коде, наименовании или артикуле. Принцип тот же, но добавляется работа с объектом и его записью.
Товар = СсылкаНаТовар.ПолучитьОбъект();
Если СтрДлина(Товар.Артикул) > 0 Тогда
Товар.Артикул = "X" + Сред(Товар.Артикул, 2);
Товар.Записать();
КонецЕсли;
Если замену нужно выполнить массово — например, сменить префикс у всех элементов справочника, — обход делается через запрос или выборку. В запросе строковые функции ограничены, поэтому обычно выбирают ссылки, а замену выполняют в цикле на встроенном языке.
Особую осторожность проявляйте с кодами и номерами: если на них завязана синхронизация с другими системами (сайт, складская программа, ЭДО), изменение первого символа может привести к рассинхронизации и дублям при следующем обмене.
Замена нескольких первых символов и смежные задачи
Если нужно заменить не один, а несколько первых символов (например, префикс из трёх букв), логика сохраняется — меняется только позиция начала подстроки в Сред():
ИсходнаяСтрока = "OLD-98765";
НоваяСтрока = "NEW" + Сред(ИсходнаяСтрока, 4);
// Результат: "NEW-98765"
Для замены символа не в начале, а в произвольной позиции, комбинируют Лев() и Сред(): берут часть до позиции, добавляют новый символ и присоединяют остаток после позиции.
Позиция = 3;
ИсходнаяСтрока = "АБВГД";
Результат = Лев(ИсходнаяСтрока, Позиция - 1) + "Х" + Сред(ИсходнаяСтрока, Позиция + 1);
// Результат: "АБХГД"
Если задача — заменить не конкретную позицию, а все вхождения определённого символа (или только первое вхождение), удобнее использовать СтрЗаменить(). Но учтите: она заменяет все вхождения подстроки, а не только первое, поэтому для точечной замены первого символа связка Сред() + конкатенация остаётся предпочтительной.
Сравнение вариантов
Основной способ. Короткий, безопасен для пустых и односимвольных строк, не требует вычисления длины.
Даёт тот же результат, но длиннее и падает с ошибкой на пустой строке без предварительной проверки.
Подходит для замены всех вхождений символа, но не для точечной замены именно первой позиции.
Типичные ошибки и как их избежать
Первая распространённая ошибка — забыть присвоить результат. Строковые функции возвращают новое значение, и вызов Сред(Строка, 2) без присваивания ничего не меняет. Второй типичный промах — неверная позиция: Сред(Строка, 1) вернёт всю строку целиком, а не «без первого символа», потому что нумерация символов в 1С начинается с единицы.
Третья группа ошибок связана с пробелами и невидимыми символами. Если строка пришла из файла или формы, в начале может оказаться пробел, неразрывный пробел или символ переноса. Тогда вы замените не ту букву, которую видите, а служебный символ. Перед заменой полезно применить СокрЛ() или СокрЛП(), если лишние пробелы недопустимы.
Проверка результата
После замены убедитесь, что результат соответствует ожиданиям. Быстрый способ — вывести значение через Сообщить() или посмотреть переменную в отладчике, поставив точку останова после строки с заменой.
Как проверить результат
Совпадает с новым символом: Лев(Результат, 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) и записывайте. Перед запуском обязательно создайте резервную копию базы и проверьте обработку на нескольких элементах.