При разработке на платформе 1С часто возникают задачи по обработке строковых данных. Одной из таких типовых задач является замена определенного символа в строке, например разделителя /, но с важным условием: заменить нужно только самое первое его вхождение, оставив остальные символы без изменений. Стандартная функция СтрЗаменить() заменяет все найденные вхождения, поэтому нам потребуется более гибкий подход. Для гибкого поиска и выборочной замены текста по шаблонам подойдёт подсистема для работы с регулярными выражениями в 1С.
Функция СтрЗаменить(Строка, "/", "_") обрабатывает всю строку целиком. Если в названии номенклатуры или пути к файлу встречается несколько слешей, они все будут превращены в знаки подчеркивания. Это не всегда соответствует логике бизнес-задачи, где, например, первая часть строки должна быть отделена от остальной части уникальным разделителем.
Разберем универсальный способ, который будет работать практически в любой версии платформы 1С, включая те, где еще не было современных методов вроде СтрНайти(). Основная идея заключается в разделении строки на две части относительно первого найденного разделителя.
Для реализации алгоритма выполним следующие шаги:
Найти().
// Пример реализации функции для замены первого вхождения
Функция ЗаменитьПервыйСимвол(ИсходнаяСтрока, СимволДляПоиска, СимволЗамены)
Позиция = Найти(ИсходнаяСтрока, СимволДляПоиска);
Если Позиция > 0 Тогда
ЛеваяЧасть = Лев(ИсходнаяСтрока, Позиция - 1);
ПраваяЧасть = Сред(ИсходнаяСтрока, Позиция + 1);
Возврат ЛеваяЧасть + СимволЗамены + ПраваяЧасть;
Иначе
// Если символ не найден, возвращаем исходную строку
Возврат ИсходнаяСтрока;
КонецЕсли;
КонецФункции
В более новых версиях платформы (начиная с 8.3.6) появились функции СтрНайти(), СтрРазделить() и другие. Однако при работе с типовыми конфигурациями важно обращать внимание на Режим совместимости. Если он установлен на версию ниже 8.3.6, использование современных функций вызовет ошибку Процедура или функция с указанным именем не определена.
Поэтому всегда проверяйте настройки конфигурации:
Режим совместимости. Если там указана версия 8.2 или ранняя 8.3, используйте классические функции: Найти(), Лев(), Сред(), Прав().Если вам нужно обработать строку, где символ может стоять в самом начале, можно воспользоваться функцией ?() (тернарный оператор) для проверки первого символа:
// Если нужно заменить только если слэш стоит первым
Результат = ?(Лев(МояСтрока, 1) = "/", Замена + Сред(МояСтрока, 2), МояСтрока);
Этот метод эффективно справляется с очисткой путей или некорректно сформированных строк, где лишний разделитель находится в начале пути.
При написании подобных функций важно учитывать крайние случаи:
Найти(). Если она возвращает 0, значит символ не найден. Не пытайтесь сразу выполнять Лев() или Сред() от 0, так как это приведет к ошибке вычисления выражения.Сред() без указания третьего параметра забирает строку до самого конца, что удобно для «правой» части кода.Найти() в 1С по умолчанию не чувствительна к регистру, однако для специфических символов (как /) это не критично.Использование описанных методов позволит вам гибко управлять строковыми данными, обеспечивая чистоту кода и стабильную работу приложения независимо от используемой версии платформы.