К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить фамилию с инициалами в 1С

Как получить фамилию с инициалами в 1С: функция ФамилияИнициалыФизЛица, разбор строки, вывод в печатные формы и отчёты. Примеры кода и типичные ошибки.

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

Главная задача — не «срезать» строку вручную, а получить инициалы корректно: с учётом двойных фамилий, отсутствия отчества и того, что ФИО может храниться как единая строка, как отдельные поля или в регистре сведений с историей изменений. От того, где лежат данные, зависит и способ обработки.

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

Где в 1С хранится ФИО и почему это важно

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

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

Типовой способ: функция ФамилияИнициалыФизЛица

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

Пример вызова со строкой:

ФИО = "Иванов Иван Иванович";

Результат = ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица(ФИО);

// Результат: "Иванов И. И."

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

Самостоятельный разбор строки ФИО

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

Функция ФамилияСИнициалами(ФИО) Экспорт

Части = СтрРазделить(СокрЛП(ФИО), " ", Ложь);

Если Части.Количество() = 0 Тогда

Возврат "";

КонецЕсли;

Результат = Части[0];

Если Части.Количество() > 1 Тогда

Результат = Результат + " " + Лев(Части[1], 1) + ".";

КонецЕсли;

Если Части.Количество() > 2 Тогда

Результат = Результат + " " + Лев(Части[2], 1) + ".";

КонецЕсли;

Возврат Результат;

КонецФункции

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

Обратите внимание на защитные проверки: если отчество отсутствует (два слова), функция вернёт «Иванов И.» без лишней точки, а при пустой строке — пустой результат вместо ошибки. Такие ситуации встречаются в реальных базах постоянно, особенно после загрузок из внешних источников.

bsl
Части = СтрРазделить(СокрЛП(ФИО), " ", Ложь); Результат = Части[0] + " " + Лев(Части[1], 1) + ".";

Получение инициалов из отдельных полей и регистра ФИО

Если данные хранятся в отдельных полях (например, в регистре сведений «ФИО физических лиц» или в реквизитах справочника), сборка результата проще и надёжнее разбора строки:

Инициалы = ?(ПустаяСтрока(Имя), "", " " + Лев(СокрЛП(Имя), 1) + ".")

+ ?(ПустаяСтрока(Отчество), "", " " + Лев(СокрЛП(Отчество), 1) + ".");

Результат = СокрЛП(Фамилия) + Инициалы;

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

В запросах инициалы можно собрать прямо в тексте запроса через ПОДСТРОКА и конкатенацию — это удобно для СКД и отчётов, где нет возможности вызвать серверную функцию:

ВЫБРАТЬ

ФИО.Фамилия + " " + ПОДСТРОКА(ФИО.Имя, 1, 1) + ". "

+ ПОДСТРОКА(ФИО.Отчество, 1, 1) + "." КАК ФамилияИнициалы

ИЗ

РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&Дата, ) КАК ФИО

Порядок действий для вывода в отчёт
  1. 1
    Определите, где хранится ФИО: строка, отдельные поля или регистр сведений
  2. 2
    Проверьте наличие типовой функции глобальным поиском по «ФамилияИнициалы»
  3. 3
    Если функции нет — добавьте собственную в общий серверный модуль
  4. 4
    Для регистра ФИО используйте срез последних на нужную дату
  5. 5
    Проверьте результат на записи без отчества и на двойной фамилии

Вывод фамилии с инициалами в печатных формах

В макетах печатных форм (табличный документ) фамилия с инициалами выводится как обычный параметр. В модуле менеджера документа или в процедуре печати перед заполнением макета вычислите значение и передайте его в параметр:

ОбластьПодпись.Параметры.Руководитель =

ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица(ОтветственныеЛица.РуководительФИО);

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

Для внешних печатных форм принцип тот же: значение вычисляется в функции Печать или при формировании табличного документа и подставляется в параметр макета. Не храните фамилию с инициалами в реквизитах документа «про запас» — вычисляйте её в момент печати, иначе после смены фамилии сотрудника в старых документах останутся устаревшие данные.

Сравнение способов

Типовая функция БСП

Подходит для типовых конфигураций; учитывает большинство нюансов. Ограничение — зависит от версии БСП и может отсутствовать.

Разбор строки по пробелам

Универсально и просто; работает в любой конфигурации. Ограничение — ошибки на двойных фамилиях и нестандартном порядке слов.

Сборка из отдельных полей

Самый надёжный вариант при наличии полей Фамилия/Имя/Отчество. Ограничение — нужен доступ к структуре данных, а не только к строке.

Вычисление в запросе

Удобно для отчётов и СКД без вызова кода. Ограничение — громоздкий текст запроса и сложная обработка пустых значений.

Проверка результата и частые ошибки

После внедрения проверьте преобразование на проблемных данных: записи без отчества, двойные фамилии через дефис («Салтыков-Щедрин»), фамилии с пробелами («де Ливрон»), ФИО с лишними пробелами в начале и конце. Именно на таких записях простой разбор строки даёт неожиданные результаты.

Типичная ошибка — применение СтрРазделить без флага включения пустых частей и без предварительного СокрЛП: двойные пробелы внутри строки порождают пустые элементы, и инициал берётся от пустой строки. Другая частая ошибка — использование текущей фамилии вместо фамилии на дату документа при выводе старых приказов и актов.

Типичные ошибки
01
Разбор строки без СокрЛП и обработки двойных пробелов — инициал берётся от пустого элемента, результат «Иванов . .»
02
Игнорирование истории смены фамилии — в старых документах печатается новая фамилия вместо действовавшей на дату документа
03
Отсутствие проверки на пустое отчество — лишняя точка и пробел в конце строки
04
Хранение фамилии с инициалами в реквизите документа — данные устаревают и расходятся со справочником
05
Копирование вызова типовой функции без проверки её наличия и состава параметров — ошибка выполнения в другой версии конфигурации
Контрольные точки

Как проверить результат

Запись без отчества («Петров Пётр»)
Норма

Выводится «Петров П.» без лишних точек

Тревожный признак

«Петров П. .» или ошибка обращения к элементу массива

Двойная фамилия через дефис
Норма

Фамилия выводится целиком с дефисом

Тревожный признак

Фамилия обрезана или разорвана

Старый документ после смены фамилии
Норма

Печатается фамилия на дату документа

Тревожный признак

Печатается текущая фамилия

Пустое ФИО
Норма

Пустая строка без ошибки

Тревожный признак

Исключение или строка из точек

Когда стоит привлечь специалиста

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

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

Итог

Что важно запомнить

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

Частые вопросы

Как получить инициалы перед фамилией («И. И. Иванов»)?

Поменяйте порядок конкатенации: сначала инициалы имени и отчества, затем фамилия. Например: Лев(Имя,1) + ". " + Лев(Отчество,1) + ". " + Фамилия. Такой формат используется в некоторых кадровых документах и списках.

Функция ФамилияИнициалыФизЛица не найдена — что делать?

Выполните глобальный поиск по строке «ФамилияИнициалы» в конфигураторе: функция могла быть переименована или перенесена в другой модуль. Если её нет совсем (самописная конфигурация), реализуйте разбор строки самостоятельно по алгоритму из статьи.

Как вывести фамилию с инициалами в СКД без изменения запроса?

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

Что делать с двойными фамилиями при разборе строки?

Фамилии через дефис («Салтыков-Щедрин») разбор по пробелам обрабатывает корректно, так как дефис не является разделителем. Проблему создают фамилии с пробелом («де Ливрон») — для них надёжнее хранить фамилию в отдельном поле, а не разбирать строку.

Можно ли получить инициалы на клиенте без вызова сервера?

Да, если на клиенте есть строка ФИО — разбор строки работает и в клиентском контексте, а функция ФизическиеЛицаКлиентСервер доступна и на клиенте. Если нужны данные из регистра сведений или справочника, потребуется серверный вызов, так как прямой доступ к данным с клиента невозможен.

Почему в старом документе печатается новая фамилия сотрудника?

Потому что ФИО берётся из текущего наименования справочника, а не из регистра с историей на дату документа. Используйте срез последних регистра «ФИО физических лиц» на дату документа — тогда в старых приказах и актах будет печататься фамилия, действовавшая на тот момент.