Как преобразовать регистр строки и изменить формат наименования города в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции данных, обработке банковских выписок или импорте адресных сведений часто возникает задача нормализации строковых реквизитов. Типичный пример — преобразование строки вида «Г. МОСКВА» в компактный и визуально аккуратный вид «г.Москва». Для решения этой задачи требуется не просто изменить регистр букв, но и корректно обработать префикс типа населенного пункта и пробелы. Разберем по шагам, как решить эту задачу в 1С различными способами.

Вариант 1. Базовый разбор строки с помощью встроенных функций 1С

Проанализируем простейший способ, основанный на функциях работы со строками: Лев(), Сред(), НРег() (нижний регистр) и ТРег() (титульный регистр, когда первая буква каждого слова становится заглавной).

Посмотрим на пример кода, предложенный для случая, когда входная строка всегда начинается с префикса «Г. »:


БукваГ = Лев(СокрЛП(Реквизиты.БанкГород), 1);
Если БукваГ = "Г" Тогда
    НижняяГ = НРег(БукваГ);
КонецЕсли;

НазваниеГорода = Сред(СокрЛП(Реквизиты.БанкГород), 4);
Город = ТРег(НазваниеГорода);
ВсеВместе = НижняяГ + "." + Город;

В этом примере мы отделяем первый символ, переводим его в нижний регистр с помощью функции НРег(), затем с 4-й позиции отсекаем префикс с точкой и пробелом, переводим название города в титульный регистр через ТРег() и соединяем итоговую строку.

Ограничения и потенциальные проблемы ручного разбора

Выясним причину, почему жесткая привязка к индексам символов может привести к ошибкам в реальной базе данных:

  1. Жесткая позиция символов: Если во входной строке после точки нет пробела (например, «Г.МОСКВА») или содержится несколько пробелов подряд, функция Сред(..., 4) обрежет первую букву города или оставит лишние пробелы.
  2. Особенности функции ТРег(): Функция переводит в верхний регистр первую букву каждого слова, ориентируясь на знаки пунктуации и дефисы. Поэтому составные названия (например, «Ростов-на-Дону») превратятся в «Ростов-На-Дону», что нарушает правила правописания служебных предлогов.
  3. Регистр и кодировка символов: Проверка БукваГ = "Г" может не сработать, если на вход поступит латинская буква «G» или строчная «г».

Вариант 2. Динамический поиск разделителя и безопасное форматирование

Чтобы сделать код более устойчивым к разному количеству пробелов и форматам входных данных, рассмотрим вариант с поиском позиции точки через СтрНайти():


ИсходнаяСтрока = СокрЛП(Реквизиты.БанкГород);
ПозицияТочки = СтрНайти(ИсходнаяСтрока, ".");

Если ПозицияТочки > 0 Тогда
    Префикс = НРег(СокрЛП(Лев(ИсходнаяСтрока, ПозицияТочки)));
    НазваниеГорода = СокрЛП(Сред(ИсходнаяСтрока, ПозицияТочки + 1));
    Результат = Префикс + ТРег(НазваниеГорода);
Иначе
    Результат = ТРег(ИсходнаяСтрока);
КонецЕсли;

Разберем логику работы этого алгоритма:

  1. Определяем позицию точки с помощью функции СтрНайти().
  2. Все символы до точки (включая саму точку) переводим в нижний регистр через НРег().
  3. Остаток строки очищаем от ведущих пробелов с помощью функции СокрЛП() и приводим к титульному регистру с помощью ТРег().
  4. Если точка не найдена, строка форматируется целиком без разделения на префикс.

Вариант 3. Использование регулярных выражений

Для универсального разбора строк со сложными префиксами («г.», «гор.», «город») на платформе под управлением Windows можно использовать COM-объект VBScript.RegExp. Посмотрим на пример реализации:


Регулярка = Новый COMОбъект("VBScript.RegExp");
Регулярка.Pattern = "^[гГ]\.?\s*(.+)$";
Регулярка.IgnoreCase = Истина;

Если Регулярка.Test(Реквизиты.БанкГород) Тогда
    Совпадения = Регулярка.Execute(Реквизиты.БанкГород);
    ЧистоеНазвание = Совпадения.Item(0).SubMatches.Item(0);
    Результат = "г." + ТРег(СокрЛП(ЧистоеНазвание));
КонецЕсли;

Регулярное выражение позволяет точно выделить значащую часть названия населенного пункта независимо от наличия точки или пробелов после сокращения.

Вариант 4. Использование функций БСП и адресного классификатора

Если конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), для работы со строками рекомендуется использовать функции общего модуля СтроковыеФункцииКлиентСервер. При обработке адресных реквизитов оптимальным подходом является использование встроенных механизмов адресного классификатора (ФИАС / ГАР), где правила написания сокращений и наименований населенных пунктов стандартизированы автоматически.

← На главную