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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача модификации строковых данных: артикулов, номеров документов, кодов маркировки или штрихкодов. Рассмотрим типичную ситуацию, когда в строке фиксированного формата (например, 111111111-11) необходимо заменить символ на определенной позиции на другой (например, 6-й символ заменить на 0), получив в результате 111110111-11.

Разберем, почему стандартная функция СтрЗаменить не подходит для позиционной замены, а также подробно проанализируем правильные способы решения этой задачи во встроенном языке и в запросах 1С.

Почему не подходит функция СтрЗаменить

Функция СтрЗаменить выполняет поиск и замену всех вхождений указанной подстроки во всем тексте. Она не принимает индекс символа. Если артикул состоит из повторяющихся символов, функция заменит все найденные совпадения, что приведет к искажению данных. Для точечной замены символа по его порядковому номеру следует использовать позиционное разделение строки или регулярные выражения.

Особенности индексации строк в платформе 1С

Прежде чем перейти к коду, проанализируем важные правила работы со строками в платформе 1С:Предприятие:

  1. Нумерация с единицы: В отличие от массивов или многих других языков программирования, нумерация символов в строках 1С начинается с 1. Первый символ строки имеет индекс 1, шестой — индекс 6.
  2. Строки фиксированной длины: Если реквизит в метаданных имеет фиксированную длину, платформа дополняет значение пробелами справа. Перед позиционной обработкой рекомендуется применять функцию СокрЛП() или СокрП(), чтобы избежать смещения позиций.
  3. Контроль длины строки: Перед обращением к позиции полезно проверять фактическую длину строки с помощью СтрДлина(), чтобы убедиться, что заменяемый индекс действительно существует.

Способ 1. Базовый вариант с функциями Лев и Сред

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

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

Посмотрим на пример универсальной процедуры:


// Исходные данные
Артикул = СокрЛП("111111111-11");
НовыйСимвол = "0";
Позиция = 6;

// Проверяем корректность длины строки
Если СтрДлина(Артикул) >= Позиция И Позиция > 0 Тогда
    ЛеваяЧасть = Лев(Артикул, Позиция - 1);
    ПраваяЧасть = Сред(Артикул, Позиция + 1);
    Результат = ЛеваяЧасть + НовыйСимвол + ПраваяЧасть;
Иначе
    Результат = Артикул;
КонецЕсли;

Способ 2. Использование функции СтрШаблон

Для повышения читаемости кода и избавления от множественной конкатенации оператором + можно применить функцию СтрШаблон. Посмотрим, как выглядит такой вариант:


Артикул = СокрЛП("111111111-11");
Если СтрДлина(Артикул) >= 6 Тогда
    Результат = СтрШаблон("%1%2%3", Лев(Артикул, 5), "0", Сред(Артикул, 7));
КонецЕсли;

Способ 3. Использование регулярных выражений (платформа 8.3.23 и выше)

Начиная с версии платформы 8.3.23, во встроенном языке доступна функция СтрЗаменитьПоРегулярномуВыражению. С ее помощью можно заменить 6-й символ через группы захвата регулярного выражения:


Артикул = "111111111-11";
// Заменяем 6-й символ на 0, сохраняя первые 5 символов и остаток строки
Результат = СтрЗаменитьПоРегулярномуВыражению(Артикул, "^(.{5}).(.*)$", "$10$2");

Способ 4. Позиционная замена в тексте запроса

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

Разберем пример текста запроса:


ВЫБРАТЬ
    ПОДСТРОКА(Таблица.Артикул, 1, 5) + "0" + ПОДСТРОКА(Таблица.Артикул, 7, 50) КАК НовыйАртикул
ИЗ
    Справочник.Номенклатура КАК Таблица
ГДЕ
    Таблица.Артикул ПОДОБНО "__________%"

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

← На главную