Конечно, можно пользоваться регулярными выражениями… Но с ними нужно разбираться, отлаживать. Поэтому я решил попросту оптимизировать существующую функцию. Первым делом откажемся от перебора — ведь в 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);
КонецЕсли;
Возврат Результат;
КонецФункции
(0) Это как понимать?
Прикольная функция… а что так мало параметров принимает?)) Сделай хотя бы 500… xD
(1) Поручик, Первый раз «Разукрашкой» пользовался, вот и накосячил чуть. Спасибо, сейчас исправлю.
(2) Ну, самом деле функция очень часто используется в БСП (по крайней мере) и там действительно 9 параметров. Автор попытался оптимизировать ее, но неудачно выложил код, как верно заметил Поручик в (1)
(2) Для количества параметров более 9 надо усложнять алгоритм разбора, а на практике используется максимум 4-5.