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