Как получить Фамилию и инициалы (сокращенное ФИО) в 1С: несколько способов реализации

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

При разработке печатных форм, отчетов или интерфейсов часто возникает задача отображения данных физического лица в сокращенном виде: Фамилия И. О.. В типовых конфигурациях 1С для этого предусмотрены готовые механизмы, однако в самописных решениях или при необходимости специфической логики разработчики прибегают к разным методам. В этой статье мы подробно разберем, как получить инициалы через запрос, с помощью встроенных функций БСП и методом прямого разбора строки.

Способ 1. Получение сокращенного ФИО через запрос

Этот метод актуален, когда данные нужно получить массово (например, для построения списка сотрудников) или когда мы работаем в системе, где не подключена Библиотека стандартных подсистем (БСП). Основная логика заключается в использовании функции ПОДСТРОКА для выделения первых букв имени и отчества.

Рассмотрим пример функции, которая обращается к регистру сведений ФИОФизическихЛиц:


&НаСервере
Функция ПолучитьФИО_ФЛ(ФизЛицо)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Фамилия, """") + "" "" + 
        |   ПОДСТРОКА(ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Имя, """"), 1, 1) + "". "" + 
        |   ПОДСТРОКА(ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Отчество, """"), 1, 1) + ""."" КАК ФИО
        |ИЗ
        |   РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&ДатаСреза, ФизическоеЛицо = &ФизическоеЛицо) КАК ФИОФизическихЛицСрезПоследних";
    
    Запрос.УстановитьПараметр("ДатаСреза", ТекущаяДата());
    Запрос.УстановитьПараметр("ФизическоеЛицо", ФизЛицо);
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат Строка(ФизЛицо); // Если данных в регистре нет, возвращаем наименование ссылки
    Иначе
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.ФИО;
    КонецЕсли;
КонецФункции

Важный нюанс: при использовании этого метода следует помнить, что в некоторых СУБД функция ПОДСТРОКА от пустой строки или NULL может вернуть неожиданный результат. Поэтому использование ЕСТЬNULL внутри функции формирования строки обязательно. Также обратите внимание на пробелы: по правилам русского языка между инициалами должен стоять пробел (И. И.), что и реализовано в коде выше.

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

Если ваша конфигурация построена на базе БСП (например, 1С:Бухгалтерия, ЗУП, ERP, УТ 11), писать запросы вручную для такой задачи — плохой тон. В системе уже есть протестированные функции, а для их поиска отлично подойдет Справочник по методам БСП с примерами использования.

Проанализируем основные варианты вызова функций в разных модулях.

  1. Универсальный метод: ФизическиеЛицаКлиентСервер.ФамилияИнициалы(ФИО). Этот метод принимает на вход полную строку (например, "Иванов Иван Иванович") и возвращает готовую строку с инициалами.
  2. Для конфигураций с зарплатным блоком (ЗУП, БП): может использоваться ФизическиеЛицаЗарплатаКадрыКлиентСервер.ФамилияИнициалы(ФИО).
  3. Старые версии БСП: часто встречается функция ОбщегоНазначения.ФамилияИнициалыФизЛица.

Рассмотрим, как это выглядит в коде формы при выборе физического лица:


&НаКлиенте
Процедура ФизЛицоОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
        // Получаем ФИО через стандартную функцию
        ФИОСокращенно = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(ВыбранноеЗначение.Наименование);
        Сообщить(ФИОСокращенно);
    КонецЕсли;
КонецПроцедуры

Способ 3. Гибкое форматирование через БСП (ФорматФИО)

В современных редакциях БСП существует более мощный инструмент — функция ФизическиеЛицаКлиентСервер.ФорматФИО. Она позволяет не просто обрезать строки, а задавать конкретный шаблон вывода.

Разберем примеры использования шаблонов:

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

Разбор сложных ситуаций при формировании инициалов

Проанализируем типичные проблемы, с которыми сталкиваются разработчики при ручном разборе строк ФИО:

  1. Отсутствие отчества: У иностранных граждан или в определенных документах отчество может отсутствовать. Стандартные функции БСП корректно обрабатывают такие случаи.
  2. Двойные фамилии: Фамилии типа "Салтыков-Щедрин" требуют особого внимания. Если вы используете метод Найти(Строка, " "), вы рискуете неправильно определить границы фамилии.
  3. Склонение ФИО: Инициалы часто нужны не только в именительном падеже. В 1С рекомендуется сначала просклонять полное ФИО с помощью системных функций.

Ручной разбор строки (если нет доступа к БСП)

Если вам все же необходимо реализовать разбор строки "на лету" без обращения к базе данных и БСП, рассмотрим следующий алгоритм.


Функция СократитьФИО(ПолноеФИО)
    МассивЧастей = СтрРазделить(СокрЛП(ПолноеФИО), " ", Ложь);
    Количество = МассивЧастей.Количество();
    
    Если Количество = 0 Тогда
        Возврат "";
    ИначеЕсли Количество = 1 Тогда
        Возврат МассивЧастей[0]; // Только фамилия
    ИначеЕсли Количество = 2 Тогда
        Возврат МассивЧастей[0] + " " + Лев(МассивЧастей[1], 1) + ".";
    Иначе
        Возврат МассивЧастей[0] + " " + Лев(МассивЧастей[1], 1) + ". " + Лев(МассивЧастей[2], 1) + ".";
    КонецЕсли;
КонецФункции

Выясним причину, почему этот код лучше, чем использование функций Найти и Сред. Использование СтрРазделить позволяет сразу получить массив всех слов, исключая проблемы с лишними пробелами между фамилией и именем. Мы анализируем количество полученных частей, что защищает нас от ошибок в случае отсутствия отчества.

Подведем итог: для большинства задач в современных конфигурациях 1С лучшим выбором будет использование функции ФизическиеЛицаКлиентСервер.ФамилияИнициалы. Если же вам требуется особая гибкость или работа в запросе, используйте конструкцию ПОДСТРОКА с обязательной проверкой на пустые значения.

← На главную