Как получить Имя и Отчество из полного ФИО в 1С:Предприятие

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

При разработках в 1С часто возникает задача преобразования формата имени контактного лица или физического лица. Например, из полной строки «Иванов Иван Иванович» требуется выделить только имя и отчество — «Иван Иванович». Рассмотрим различные способы решения этой задачи, выясним особенности каждого алгоритма и проанализируем возможные крайние случаи.

Вариант 1. Разделение строки через СтрРазделить() (современный встроенный метод)

Начиная с версии платформы 8.3.6, в языке 1С появилась встроенная функция СтрРазделить(), которая работает значительно быстрее традиционных методов обработки строк. Перед разложением строки в массив рекомендуется удалить возможные повторяющиеся пробелы с помощью функции СтрСжатьПробелы().

Проанализируем по шагам пример кода:


ИсходноеФИО = Объект.Партнер.CRM_ОсновноеКонтактноеЛицо;

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

Вариант 2. Получение подстроки после первого пробела через Сред() и Найти()

Если в системе принято, что фамилия всегда идет первым словом, а все последующие слова составляют имя и отчество (включая приставки «оглы», «паша» или составные отчества), то задача упрощается. Нам достаточно отсечь первое слово до первого пробела.

Рассмотрим, как записать такой алгоритм:


ИсходноеФИО = СокрЛП(Объект.Партнер.CRM_ОсновноеКонтактноеЛицо);
ПозицияПервогоПробела = Найти(ИсходноеФИО, " ");

Если ПозицияПервогоПробела > 0 Тогда
    // Функция Сред возвращает всю оставшуюся часть строки начиная с заданной позиции
    РезультатИО = СокрЛП(Сред(ИсходноеФИО, ПозицияПервогоПробела + 1));
Иначе
    // Если пробелов нет, значит введено только одно слово (фамилия)
    РезультатИО = "";
КонецЕсли;

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

В конфигурациях, использующих Библиотеку Стандартных Подсистем (БСП), существуют готовые механизмы для работы с ФИО физических лиц. В частности, модуль ФизическиеЛицаКлиентСервер содержит функцию ЧастиИмени(), а модуль СтроковыеФункцииКлиентСервер содержит функцию РазложитьСтрокуВМассивПодстрок().

Посмотрим на пример работы с функцией БСП:


ИсходноеФИО = Объект.Партнер.CRM_ОсновноеКонтактноеЛицо;

// Метод БСП автоматически разбивает строку и возвращает структуру
СтруктураФИО = ФизическиеЛицаКлиентСервер.ЧастиИмени(ИсходноеФИО);

// Извлекаем Имя и Отчество из структуры
Результат = СокрЛП(СтруктураФИО.Имя + " " + СтруктураФИО.Отчество);

Если требуется просто разбить строку на массив в старых конфигурациях без СтрРазделить(), применяют функцию из подсистемы строковых функций:


МассивЧастей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходноеФИО, " ");

Вариант 4. Замена пробелов на переносы строк (СтрЗаменить и СтрПолучитьСтроку)

Это классический приём, позволяющий работать с разделенной строкой как с многострочным текстом. Однако при его использовании обязательно следует контролировать количество полученных строк, чтобы избежать вывода некорректных данных или ошибок обращения по несуществующему индексу.


Если ЗначениеЗаполнено(Объект.Партнер.CRM_ОсновноеКонтактноеЛицо) Тогда
    // Заменяем все пробелы на символ перевода строки
    СтрокиФИО = СтрЗаменить(СокрЛП(Объект.Партнер.CRM_ОсновноеКонтактноеЛицо), " ", Символы.ПС);
    
    // Получаем имя (2-я строка) и отчество (3-я строка)
    Имя = СтрПолучитьСтроку(СтрокиФИО, 2);
    Отчество = СтрПолучитьСтроку(СтрокиФИО, 3);
    
    Результат = СокрЛП(Имя + " " + Отчество);
КонецЕсли;

Критические ошибки и рекомендации по обработке ФИО

При реализации любого из способов следует учитывать специфику ввода текстовой информации пользователями:

  1. Проверка длины массива или количества строк: Обращение к 2-му или 3-му элементу массива напрямую без проверки длины приведёт к ошибке «Индекс находится за границами массива», если в строке было введено только одно слово.
  2. Сдвоенные пробелы: Случайные двойные пробелы между словами могут привести к созданию пустых элементов массива. Используйте функцию СтрСжатьПробелы() перед началом обработки.
  3. Составные отчества и приставки: В именах типа «Мамед оглы» или при наличии нескольких слов в отчестве фиксированное взятие только 3-го слова приведёт к потере части данных. В таких случаях надежнее брать всю подстроку после первого пробела (Вариант 2).
← На главную