Замена i-го токена
Как-то в процессе реализации задачи по подарочным сертификатам столкнулся с необходимостью поменять 58-й токен в строке, разделенной запятыми для выгрузки на Фронтол.
Для подарочных сертификатов нужно было «2» заменить на «1»:
Можно было по рабоче-крестьянски сделать изменения в типовой код, но мне претит такая насильственная модификация кода.
Поэтому я не менял типовой код, а сделал пост-обработку. Уже полученную строку я обработал следующим кодом:
Вот код функции, которую пришлось набросать для этого незатейливого дела:
Функция ЗаменитьВПозиции(Знач Строка, Разделитель, Позиция, Замена) Экспорт
//Осипов ПодарочныеСертификаты 2020-11-23
//Ищет в строке позицию, считая разделители
ТекСтрока = Строка;
РезСтрока = «»;
ТекПозиция = 1;
Последний = ложь;
Пока Истина Цикл
ПозицияРазделителя = Найти(ТекСтрока, Разделитель);
Если ПозицияРазделителя = 0 Тогда
ТекАтом = ТекСтрока;
Последний = истина;
Иначе
ТекАтом = Сред(ТекСтрока, 1, ПозицияРазделителя — 1);
ТекСтрока = Сред(ТекСтрока, ПозицияРазделителя + 1);
КонецЕсли;
Если Позиция = ТекПозиция Тогда
ТекАтом = Замена;
КонецЕсли;
ТекПозиция = ТекПозиция + 1;
РезСтрока = РезСтрока + ТекАтом + ?(Последний, «», Разделитель);
Если Последний Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат РезСтрока;
КонецФункции
ох уж эти велосипедостроители
Есть такая функция СтрРазделить
Что будем делать, когда разделитель попадет внутри токена? «Товар, который имеет запятую в своем названии»
я бы такой код на ревью не пропустил )
во-первых, он не эффективный (из-за того, что там внутри жопалиард раз вызывается «сред» и «+» на строке, хотя можно было бы вычислить рендж токена и потом его один раз заменить в конце)
во-вторых, то же самое можно сделать проще (кстати, этот код все равно будет эффективней того, что ты написал)
parts = split(str, sep)
parts[i] = x
str = parts.join(sep)