Замена i-го токена

Как-то в процессе реализации задачи по подарочным сертификатам столкнулся с необходимостью поменять 58-й токен в строке, разделенной запятыми для выгрузки на Фронтол.

Для подарочных сертификатов нужно было «2» заменить на «1»:

Можно было по рабоче-крестьянски сделать изменения в типовой код, но мне претит такая насильственная модификация кода.

Поэтому я не менял типовой код, а сделал пост-обработку. Уже полученную строку я обработал следующим кодом:

Вот код функции, которую пришлось набросать для этого незатейливого дела:

Функция ЗаменитьВПозиции(Знач Строка, Разделитель, Позиция, Замена) Экспорт
   
//Осипов ПодарочныеСертификаты 2020-11-23
    //Ищет в строке позицию, считая разделители
   
ТекСтрока = Строка;
   
РезСтрока = «»;
   
ТекПозиция = 1;
   
Последний = ложь;

    Пока Истина Цикл
       
ПозицияРазделителя = Найти(ТекСтрока, Разделитель);
        Если
ПозицияРазделителя = 0 Тогда
           
ТекАтом = ТекСтрока;
           
Последний = истина;
        Иначе
           
ТекАтом = Сред(ТекСтрока, 1, ПозицияРазделителя 1);
           
ТекСтрока = Сред(ТекСтрока, ПозицияРазделителя + 1);
        КонецЕсли;

        Если
Позиция = ТекПозиция Тогда
           
ТекАтом = Замена;
        КонецЕсли;

       
ТекПозиция = ТекПозиция + 1;

       
РезСтрока = РезСтрока + ТекАтом + ?(Последний, «», Разделитель);

        Если
Последний Тогда
            Прервать;
        КонецЕсли;

    КонецЦикла;

    Возврат
РезСтрока;

КонецФункции

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. naf2000:

    ох уж эти велосипедостроители
    Есть такая функция СтрРазделить
    Что будем делать, когда разделитель попадет внутри токена? «Товар, который имеет запятую в своем названии»

  2. fajij28770:

    я бы такой код на ревью не пропустил )

    во-первых, он не эффективный (из-за того, что там внутри жопалиард раз вызывается «сред» и «+» на строке, хотя можно было бы вычислить рендж токена и потом его один раз заменить в конце)
    во-вторых, то же самое можно сделать проще (кстати, этот код все равно будет эффективней того, что ты написал)

    parts = split(str, sep)
    parts[i] = x
    str = parts.join(sep)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *