В процессе разработки часто возникает задача модификации строковых данных: артикулов, номеров документов, кодов маркировки или штрихкодов. Рассмотрим типичную ситуацию, когда в строке фиксированного формата (например, 111111111-11) необходимо заменить символ на определенной позиции на другой (например, 6-й символ заменить на 0), получив в результате 111110111-11.
Разберем, почему стандартная функция СтрЗаменить не подходит для позиционной замены, а также подробно проанализируем правильные способы решения этой задачи во встроенном языке и в запросах 1С.
Функция СтрЗаменить выполняет поиск и замену всех вхождений указанной подстроки во всем тексте. Она не принимает индекс символа. Если артикул состоит из повторяющихся символов, функция заменит все найденные совпадения, что приведет к искажению данных. Для точечной замены символа по его порядковому номеру следует использовать позиционное разделение строки или регулярные выражения.
Прежде чем перейти к коду, проанализируем важные правила работы со строками в платформе 1С:Предприятие:
СокрЛП() или СокрП(), чтобы избежать смещения позиций.СтрДлина(), чтобы убедиться, что заменяемый индекс действительно существует.Разберем классический и наиболее производительный подход. Для замены символа на позиции N мы делим исходную строку на две части:
N - 1), получаемые функцией Лев().N + 1 и до конца строки, получаемые функцией Сред().Посмотрим на пример универсальной процедуры:
// Исходные данные
Артикул = СокрЛП("111111111-11");
НовыйСимвол = "0";
Позиция = 6;
// Проверяем корректность длины строки
Если СтрДлина(Артикул) >= Позиция И Позиция > 0 Тогда
ЛеваяЧасть = Лев(Артикул, Позиция - 1);
ПраваяЧасть = Сред(Артикул, Позиция + 1);
Результат = ЛеваяЧасть + НовыйСимвол + ПраваяЧасть;
Иначе
Результат = Артикул;
КонецЕсли;
Для повышения читаемости кода и избавления от множественной конкатенации оператором + можно применить функцию СтрШаблон. Посмотрим, как выглядит такой вариант:
Артикул = СокрЛП("111111111-11");
Если СтрДлина(Артикул) >= 6 Тогда
Результат = СтрШаблон("%1%2%3", Лев(Артикул, 5), "0", Сред(Артикул, 7));
КонецЕсли;
Начиная с версии платформы 8.3.23, во встроенном языке доступна функция СтрЗаменитьПоРегулярномуВыражению. С ее помощью можно заменить 6-й символ через группы захвата регулярного выражения:
Артикул = "111111111-11";
// Заменяем 6-й символ на 0, сохраняя первые 5 символов и остаток строки
Результат = СтрЗаменитьПоРегулярномуВыражению(Артикул, "^(.{5}).(.*)$", "$10$2");
Если требуется обработать массив артикулов непосредственно при выборке из базы данных, операцию можно перенести на уровень СУБД. В языке запросов 1С используется функция ПОДСТРОКА. Обратите внимание: в запросах у функции ПОДСТРОКА третий параметр (длина) является обязательным в отличие от функции Сред во встроенном языке.
Разберем пример текста запроса:
ВЫБРАТЬ
ПОДСТРОКА(Таблица.Артикул, 1, 5) + "0" + ПОДСТРОКА(Таблица.Артикул, 7, 50) КАК НовыйАртикул
ИЗ
Справочник.Номенклатура КАК Таблица
ГДЕ
Таблица.Артикул ПОДОБНО "__________%"
Таким образом, для точечной замены символа по индексу оптимально использовать комбинацию функций Лев() и Сред() с предварительным удалением крайних пробелов через СокрЛП().