Оптимизация функции ПодставитьПараметрыВСтроку

В типовых конфигурациях часто используется функция ПодставитьПараметрыВСтроку. Если параметров несколько, эту функцию использовать достаточно удобно. Но работает она довольно медленно — еще бы, ведь в ней каждый раз выполняется полный перебор всех символов в стоке. При активной работе со строками падение производительности становится заметным.

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

На моем ноутбуке выполнение 10 000 раз стандартной функции занимает 37 секунд, оптимизированной — меньше секунды.

 
 Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
    Знач
Параметр1,    Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
    Знач
Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
    Знач
Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт

    Если СтрокаПодстановки = Неопределено ИЛИ СтрДлина(СтрокаПодстановки) = 0 Тогда
        Возврат
«»;
    КонецЕсли;

    Результат = «»;

    НачПозиция = 1;

    Позиция = Найти(СтрокаПодстановки, «%»);

    Пока Позиция > 0 Цикл
       
СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1);
        Если
СимволСтроки <> «%» Тогда
           
Позиция = Позиция + 1;
            Продолжить;
        КонецЕсли;
       
Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, Позиция НачПозиция);

        Позиция = Позиция + 1;
       
СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1);

        Если СимволСтроки = «1» Тогда
           
ЗначениеПараметра = Параметр1;
        ИначеЕсли
СимволСтроки = «2» Тогда
           
ЗначениеПараметра = Параметр2;
        ИначеЕсли
СимволСтроки = «3» Тогда
           
ЗначениеПараметра = Параметр3;
        ИначеЕсли
СимволСтроки = «4» Тогда
           
ЗначениеПараметра = Параметр4;
        ИначеЕсли
СимволСтроки = «5» Тогда
           
ЗначениеПараметра = Параметр5;
        ИначеЕсли
СимволСтроки = «6» Тогда
           
ЗначениеПараметра = Параметр6;
        ИначеЕсли
СимволСтроки = «7» Тогда
           
ЗначениеПараметра = Параметр7;
        ИначеЕсли
СимволСтроки = «8» Тогда
           
ЗначениеПараметра = Параметр8;
        ИначеЕсли
СимволСтроки = «9» Тогда
           
ЗначениеПараметра = Параметр9;
        ИначеЕсли
СимволСтроки = «%» Тогда
           
ЗначениеПараметра = «%»;
        Иначе
            ВызватьИсключение
НСтр(«ru=’Входная строка СтрокаПодстановки имеет неверный формат: %’;uk=’Вхідний рядок Строкаподстановки має невірний формат: %'» + ЗначениеПараметра);
        КонецЕсли;
        Если
ЗначениеПараметра = Неопределено Тогда
           
ЗначениеПараметра = «»;
        Иначе
           
ЗначениеПараметра = Строка(ЗначениеПараметра);
        КонецЕсли;
       
Результат = Результат + ЗначениеПараметра;
       
Позиция = Позиция + 1;
       
СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция);
       
Позиция = Найти(СтрокаПодстановки, «%»);
    КонецЦикла;

    Если (НачПозиция <= СтрДлина(СтрокаПодстановки)) Тогда       

        Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, СтрДлина(СтрокаПодстановки) — НачПозиция + 1);
    КонецЕсли;

    Возврат Результат;
КонецФункции

5 Comments

  1. Поручик

    (0) Это как понимать?

        Если (НачПозиция         Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, СтрДлина(СтрокаПодстановки) — НачПозиция + 1);
    КонецЕсли;
    Reply
  2. Lyns_owner

    Прикольная функция… а что так мало параметров принимает?)) Сделай хотя бы 500… xD

    Reply
  3. curdate

    (1) Поручик, Первый раз «Разукрашкой» пользовался, вот и накосячил чуть. Спасибо, сейчас исправлю.

    Reply
  4. ediks

    (2) Ну, самом деле функция очень часто используется в БСП (по крайней мере) и там действительно 9 параметров. Автор попытался оптимизировать ее, но неудачно выложил код, как верно заметил Поручик в (1)

    Reply
  5. Поручик

    (2) Для количества параметров более 9 надо усложнять алгоритм разбора, а на практике используется максимум 4-5.

    Reply

Leave a Comment

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