Как получить фамилию и инициалы из полного ФИО в 1С?

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

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

Метод 1: Использование типовых функций БСП

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

Рассмотрим использование модуля ФизическиеЛицаКлиентСервер. Это универсальный модуль, доступный как на стороне сервера, так и на стороне клиента. В нем часто встречается функция ФамилияИнициалы.


// Пример для Управления торговлей 11 или ERP 2
ПолноеИмя = "Петров Петр Петрович";
// Сначала разбиваем строку на части (Фамилия, Имя, Отчество)
ЧастиИмени = ФизическиеЛицаКлиентСервер.ЧастиИмени(ПолноеИмя);
// Формируем фамилию с инициалами
Результат = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(ЧастиИмени);
// На выходе получим: Петров П. П.

В конфигурациях типа «Бухгалтерия предприятия» или «Зарплата и управление персоналом» часто используется другой метод, который обращается к истории ФИО физического лица. Это важно, так как фамилия могла меняться со временем.


// Пример из 1С:Комплексная автоматизация 2
ДатаСреза = ТекущаяДата(); // Или дата документа
Физик = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");
Результат = ФизическиеЛицаЛокализация.ФамилияИнициалыФизЛица(Физик, ДатаСреза);

Важный нюанс: В некоторых версиях БСП функция может называться ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица. Всегда проверяйте наличие методов через контекстную подсказку (Ctrl + Space), набрав имя модуля.

Метод 2: Получение ФИО через запрос к регистру сведений

Данные о фамилии, имени и отчестве физических лиц в 1С хранятся в периодическом регистре сведений ФИОФизЛиц. Это самый надежный источник, так как в нем данные уже разделены по полям. Проанализируем, как составить запрос для получения инициалов напрямую из базы данных — для этого подойдёт консоль запросов и инструментов разработчика 1С.


ВЫБРАТЬ
    ФИОФизЛицСрезПоследних.Фамилия КАК Фамилия,
    ПОДСТРОКА(ФИОФизЛицСрезПоследних.Имя, 1, 1) + "." КАК ИнициалИ,
    ПОДСТРОКА(ФИОФизЛицСрезПоследних.Отчество, 1, 1) + "." КАК ИнициалО
ИЗ
    РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаДокумента, ФизЛицо = &ФизЛицо) КАК ФИОФизЛицСрезПоследних

После выполнения запроса мы можем собрать строку в коде 1С. Рассмотрим подробнее, как это сделать правильно, чтобы избежать ошибок при отсутствии отчества:


Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ФИО = Выборка.Фамилия;
    Если ЗначениеЗаполнено(Выборка.ИнициалИ) Тогда
        ФИО = ФИО + " " + Выборка.ИнициалИ;
        Если ЗначениеЗаполнено(Выборка.ИнициалО) Тогда
            ФИО = ФИО + Выборка.ИнициалО;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Метод 3: Алгоритмический разбор строки (ручной метод)

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

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

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

Внимание: Использование третьего параметра Истина в функции СтрРазделить критически важно. Он заставляет систему игнорировать пустые строки в массиве, если пользователь случайно ввел два пробела между словами.

Особенности и нюансы форматирования

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

Неразрывные пробелы. В печатных формах крайне нежелательно, чтобы фамилия осталась на одной строке, а инициалы перенеслись на другую — для этого подойдёт инструмент формирования документов Word по шаблонам из 1С. Чтобы этого избежать, используйте неразрывный пробел между фамилией и первой буквой имени. В 1С его можно добавить кодом символа 160 или системной константой.


// Пример использования неразрывного пробела
Результат = Фамилия + Символы.НПП + Инициалы;

Сложные фамилии и отчества. Если фамилия двойная (например, Мамин-Сибиряк), стандартный разбор по пробелу сработает корректно. Однако, если фамилия содержит пробелы (например, «фон Бисмарк»), алгоритм может посчитать «фон» фамилией, а «Бисмарк» — именем. Именно поэтому предпочтительнее использовать регистрационные данные из системы (Метод 2) или специализированные функции БСП (Метод 1), которые «знают» структуру справочника физических лиц.

Отсутствие отчества. В современной практике (особенно для иностранных граждан) отчество часто отсутствует. Ваш код всегда должен проверять заполненность этой части ФИО, чтобы не выводить «лишнюю» точку в конце строки.

Резюме

Выясним, какой метод выбрать:

← На главную