При интеграции данных, обработке банковских выписок или импорте адресных сведений часто возникает задача нормализации строковых реквизитов. Типичный пример — преобразование строки вида «Г. МОСКВА» в компактный и визуально аккуратный вид «г.Москва». Для решения этой задачи требуется не просто изменить регистр букв, но и корректно обработать префикс типа населенного пункта и пробелы. Разберем по шагам, как решить эту задачу в 1С различными способами.
Проанализируем простейший способ, основанный на функциях работы со строками: Лев(), Сред(), НРег() (нижний регистр) и ТРег() (титульный регистр, когда первая буква каждого слова становится заглавной).
Посмотрим на пример кода, предложенный для случая, когда входная строка всегда начинается с префикса «Г. »:
БукваГ = Лев(СокрЛП(Реквизиты.БанкГород), 1);
Если БукваГ = "Г" Тогда
НижняяГ = НРег(БукваГ);
КонецЕсли;
НазваниеГорода = Сред(СокрЛП(Реквизиты.БанкГород), 4);
Город = ТРег(НазваниеГорода);
ВсеВместе = НижняяГ + "." + Город;
В этом примере мы отделяем первый символ, переводим его в нижний регистр с помощью функции НРег(), затем с 4-й позиции отсекаем префикс с точкой и пробелом, переводим название города в титульный регистр через ТРег() и соединяем итоговую строку.
Выясним причину, почему жесткая привязка к индексам символов может привести к ошибкам в реальной базе данных:
Сред(..., 4) обрежет первую букву города или оставит лишние пробелы.ТРег(): Функция переводит в верхний регистр первую букву каждого слова, ориентируясь на знаки пунктуации и дефисы. Поэтому составные названия (например, «Ростов-на-Дону») превратятся в «Ростов-На-Дону», что нарушает правила правописания служебных предлогов.БукваГ = "Г" может не сработать, если на вход поступит латинская буква «G» или строчная «г».Чтобы сделать код более устойчивым к разному количеству пробелов и форматам входных данных, рассмотрим вариант с поиском позиции точки через СтрНайти():
ИсходнаяСтрока = СокрЛП(Реквизиты.БанкГород);
ПозицияТочки = СтрНайти(ИсходнаяСтрока, ".");
Если ПозицияТочки > 0 Тогда
Префикс = НРег(СокрЛП(Лев(ИсходнаяСтрока, ПозицияТочки)));
НазваниеГорода = СокрЛП(Сред(ИсходнаяСтрока, ПозицияТочки + 1));
Результат = Префикс + ТРег(НазваниеГорода);
Иначе
Результат = ТРег(ИсходнаяСтрока);
КонецЕсли;
Разберем логику работы этого алгоритма:
СтрНайти().НРег().СокрЛП() и приводим к титульному регистру с помощью ТРег().Для универсального разбора строк со сложными префиксами («г.», «гор.», «город») на платформе под управлением Windows можно использовать COM-объект VBScript.RegExp. Посмотрим на пример реализации:
Регулярка = Новый COMОбъект("VBScript.RegExp");
Регулярка.Pattern = "^[гГ]\.?\s*(.+)$";
Регулярка.IgnoreCase = Истина;
Если Регулярка.Test(Реквизиты.БанкГород) Тогда
Совпадения = Регулярка.Execute(Реквизиты.БанкГород);
ЧистоеНазвание = Совпадения.Item(0).SubMatches.Item(0);
Результат = "г." + ТРег(СокрЛП(ЧистоеНазвание));
КонецЕсли;
Регулярное выражение позволяет точно выделить значащую часть названия населенного пункта независимо от наличия точки или пробелов после сокращения.
Если конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), для работы со строками рекомендуется использовать функции общего модуля СтроковыеФункцииКлиентСервер. При обработке адресных реквизитов оптимальным подходом является использование встроенных механизмов адресного классификатора (ФИАС / ГАР), где правила написания сокращений и наименований населенных пунктов стандартизированы автоматически.