Стрзаменить() – как грамотно использовать?
Появилась на днях проблема: перестали выгружаться в клиент-банк выписки из-за ошибки недопустимых символов в назначении платежа. Пользователи каким то образом стали вставлять специальные символы “«“, “»“, “ϒ” (спец. символы в данном примере взяты из головы). С полным набором символов Юникода можете ознакомиться на следующем сайте.
Любой программист 1с способен быстро решить данную проблему использую функцию глобального контекста СтрЗаменить():
1 2 3 4 5 6 7 8 9 |
&НаКлиенте Процедура ЗаменитьСтрорка(Команда) // Вставить содержимое обработчика. СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "«" , """"); СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "»" , """"); СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "ϒ" , "!"); КонецПроцедуры |
Казалось бы проблема решена и все довольно! Но что-то мне все равно не нравилось в данном решение: получается чем больше специальных символов придется заменять, тем больше будет строчек кода, что меня не совсем устраивало.
Я решил посмотреть решения в типовых конфигурациях – ведь по-хорошему все уже написано до нас и порой очень грамотно. И верно, я нашел отличное решение в виде одной функции ‘ЗаменитьОдниСимволыДругими’, которое полностью меня устроило. В итоге вместо множества строчек кода мы вызываем всего лишь одну функцию и радуемся:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
&НаКлиенте Процедура ЗаменитьСтрорка(Команда) // Вставить содержимое обработчика. //СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "«" , """"); //СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "»" , """"); //СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "ϒ" , "!"); СтрокаКомментарий = ЗаменитьОдниСимволыДругими("«»ϒ" , СтрокаКомментарий, """""!"); КонецПроцедуры // Выполняет замену символов в строке. // // Параметры: // ЗаменяемыеСимволы - Строка - строка символов, каждый из которых требует замены; // Строка - Строка - исходная строка, в которой требуется замена символов; // СимволыЗамены - Строка - строка символов, на каждый из которых нужно заменить символы параметра // ЗаменяемыеСимволы. // // Возвращаемое значение: // Строка - строка после замены символов. // // Примечание: функция предназначена для простых случаев, например, для замены латиницы на похожие кириллические // символы. // Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Строка, СимволыЗамены) Результат = Строка; Для НомерСимвола = 1 По СтрДлина(ЗаменяемыеСимволы) Цикл Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, НомерСимвола, 1), Сред(СимволыЗамены, НомерСимвола, 1)); КонецЦикла; Возврат Результат; КонецФункции |
Все работает как и надо! Данную функцию можно немного модифицировать и сделать более универсальной:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
&НаКлиенте Процедура ЗаменитьСтрорка(Команда) // Вставить содержимое обработчика. //СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "«" , """"); //СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "»" , """"); //СтрокаКомментарий = СтрЗаменить(СтрокаКомментарий, "ϒ" , "!"); //СтрокаКомментарий = ЗаменитьОдниСимволыДругими("«»ϒ" , СтрокаКомментарий, """""!"); МассивЗаменяемыхСимволов = Новый Массив; МассивЗаменяемыхСимволов.Добавить("«"); МассивЗаменяемыхСимволов.Добавить("»"); МассивЗаменяемыхСимволов.Добавить("ϒ"); МассивСимволовЗамены = Новый Массив; МассивСимволовЗамены.Добавить(""""); МассивСимволовЗамены.Добавить(""""); МассивСимволовЗамены.Добавить("Супер замена!!!!"); СтрокаКомментарий = ЗаменитьЗначенияВСтроке(МассивЗаменяемыхСимволов, СтрокаКомментарий, МассивСимволовЗамены); КонецПроцедуры Функция ЗаменитьЗначенияВСтроке(МассивЗаменяемыхСимволов, Строка, МассивСимволовЗамены) Результат = Строка; Если НЕ МассивЗаменяемыхСимволов.Количество() = МассивСимволовЗамены.Количество() Тогда Возврат Результат; КонецЕсли; Для НомерСимвола = 0 По МассивЗаменяемыхСимволов.Количество() - 1 Цикл Результат = СтрЗаменить(Результат, МассивЗаменяемыхСимволов[НомерСимвола], МассивСимволовЗамены[НомерСимвола]); КонецЦикла; Возврат Результат; КонецФункции |
Ну и как верно замечено в комментариях – можно еще интереснее выкрутиться через ‘соответствие’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
&НаКлиенте Процедура ЗаменитьСтрорка(Команда) // Вставить содержимое обработчика. СоответствиеЗначений = Новый Соответствие; СоответствиеЗначений.Вставить("«", """"); СоответствиеЗначений.Вставить("»", """"); СоответствиеЗначений.Вставить("ϒ", "!"); СтрокаКомментарий = ЗаменитьЗначенияВСтроке(СоответствиеЗначений, СтрокаКомментарий); КонецПроцедуры Функция ЗаменитьЗначенияВСтроке(СоответствиеЗначений, Строка) Результат = Строка; Для Каждого Элемент Из СоответствиеЗначений Цикл Результат = СтрЗаменить(Результат, Элемент.Ключ, Элемент.Значение); КонецЦикла; Возврат Результат; КонецФункции |
Вот так использую типовую функцию СтрЗаменить() мы можем писать более читаемые и удобные алгоритмы!
Вариант с двумя массивами плохой в плане кода, еще и требует проверки на количество элементов.
Для таких ситуаций правильнее использовать объект Соответствие, элементы которого и перебирать в цикле.
Знаю, есть такой вариант: но на 100 процентов не уверен примет ли ключ соответствия любой спец. символ! А так да, тоже хороший вариант!
Все верно, так тоже работает!