Как получить ФИО в формате Инициалы Фамилия в 1С:УТ 11

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

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

Метод 1: Использование пользовательской функции и модуля ФизическиеЛицаКлиентСервер

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

Основная идея заключается в том, чтобы не просто разрезать строку пробелами (что может привести к ошибкам при наличии двойных фамилий), а использовать профессиональный инструмент разбора имени. Посмотрим на пример кода:


Функция ИнициалыФамилия(Знач ФамилияИмяОтчество) Экспорт
    
    // Проверяем, является ли входящее значение строкой. 
    // Если да — используем типовой механизм для разбора ФИО на составляющие.
    Если ТипЗнч(ФамилияИмяОтчество) = Тип("Строка") Тогда
        ЧастиИмени = ФизическиеЛицаКлиентСервер.ЧастиИмени(ФамилияИмяОтчество);
    Иначе
        // Если передана структура, используем ее напрямую
        ЧастиИмени = ФамилияИмяОтчество;
    КонецЕсли;
    
    Фамилия  = ЧастиИмени.Фамилия;
    Имя      = ЧастиИмени.Имя;
    Отчество = ЧастиИмени.Отчество;
    
    // Если имя не заполнено, возвращаем только фамилию
    Если ПустаяСтрока(Имя) Тогда
        Возврат Фамилия;
    КонецЕсли;
    
    // Если нет отчества, выводим только инициал имени и фамилию
    Если ПустаяСтрока(Отчество) Тогда
        Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1. %2", Лев(Имя, 1), Фамилия);
    КонецЕсли;
    
    // Полный формат: И. О. Фамилия
    Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2. %3", Лев(Имя, 1), Лев(Отчество, 1), Фамилия);
    
КонецФункции

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

Метод 2: Работа со ссылками на справочники (Физические лица)

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

В конфигурации УТ 11 существует специфический модуль ФизическиеЛицаУТ. В нем реализована функция ФамилияИнициалыФизЛица, однако, как отмечают разработчики, она часто возвращает фамилию впереди инициалов. Если нам нужен обратный порядок, мы можем скомбинировать получение данных и форматирование.

Проанализируем шаги для получения данных из справочника:

  1. Используем функцию ФизическиеЛица.ДанныеФизическихЛиц или ФизическиеЛицаУТ.ДанныеФизЛицДляПечати, чтобы получить ФИО на нужную дату (например, дату документа).
  2. Полученную структуру (где есть поля Фамилия, Имя, Отчество) передаем в нашу функцию форматирования.

Метод 3: Современный подход через СтрШаблон

Если вы работаете на современной платформе (8.3.10 и выше), вместо функции ПодставитьПараметрыВСтроку рекомендуется использовать встроенный метод СтрШаблон. Это работает быстрее и выглядит лаконичнее. Рассмотрим, как переписать финальную сборку строки:


Результат = СтрШаблон("%1.%2. %3", 
    Лев(ЧастиИмени.Имя, 1), 
    Лев(ЧастиИмени.Отчество, 1), 
    ЧастиИмени.Фамилия);

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

Почему не стоит использовать СтрРазделить?

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

Резюме по реализации

Для реализации формата «Инициалы Фамилия» в 1С:УТ 11 оптимальным решением будет создание небольшой экспортной функции в вашем общем модуле (например, КастомныеФункцииСервер). Внутри этой функции обязательно используйте ФизическиеЛицаКлиентСервер.ЧастиИмени() для разбора входящих данных. Это гарантирует стабильную работу системы даже при нестандартных входных строках.

← На главную