При разработке печатных форм, отчетов или при заполнении текстовых полей в конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как 1С:Управление торговлей 11, программисты часто сталкиваются с необходимостью изменить стандартный вывод ФИО. По умолчанию большинство типовых функций возвращают строку в формате «Фамилия И. О.», однако для официальных документов часто требуется формат «И. О. Фамилия». Разберем, как реализовать эту задачу наиболее эффективно, используя штатные механизмы и собственные доработки.
Рассмотрим ситуацию, когда у нас уже есть строка с полным ФИО и нам нужно быстро преобразовать ее. В типовых конфигурациях для этого лучше всего подходит общий модуль ФизическиеЛицаКлиентСервер. Проанализируем пример функции, которая корректно обрабатывает входящую строку и собирает результат в нужном порядке.
Основная идея заключается в том, чтобы не просто разрезать строку пробелами (что может привести к ошибкам при наличии двойных фамилий), а использовать профессиональный инструмент разбора имени. Посмотрим на пример кода:
Функция ИнициалыФамилия(Знач ФамилияИмяОтчество) Экспорт
// Проверяем, является ли входящее значение строкой.
// Если да — используем типовой механизм для разбора ФИО на составляющие.
Если ТипЗнч(ФамилияИмяОтчество) = Тип("Строка") Тогда
ЧастиИмени = ФизическиеЛицаКлиентСервер.ЧастиИмени(ФамилияИмяОтчество);
Иначе
// Если передана структура, используем ее напрямую
ЧастиИмени = ФамилияИмяОтчество;
КонецЕсли;
Фамилия = ЧастиИмени.Фамилия;
Имя = ЧастиИмени.Имя;
Отчество = ЧастиИмени.Отчество;
// Если имя не заполнено, возвращаем только фамилию
Если ПустаяСтрока(Имя) Тогда
Возврат Фамилия;
КонецЕсли;
// Если нет отчества, выводим только инициал имени и фамилию
Если ПустаяСтрока(Отчество) Тогда
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1. %2", Лев(Имя, 1), Фамилия);
КонецЕсли;
// Полный формат: И. О. Фамилия
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2. %3", Лев(Имя, 1), Лев(Отчество, 1), Фамилия);
КонецФункции
В данном примере мы используем функцию Лев(Строка, 1), чтобы получить первый символ имени и отчества. Обратите внимание на использование СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку — это стандарт БСП для сборки строк, который делает код более читаемым, чем обычная конкатенация через «+».
Если задача стоит шире и вам нужно получить инициалы не из произвольной строки, а из данных конкретного сотрудника или кассира, хранящихся в базе, следует использовать возможности серверных модулей. Выясним, почему это важно: ФИО физического лица может меняться со временем, и типовые механизмы позволяют получить данные на конкретную дату.
В конфигурации УТ 11 существует специфический модуль ФизическиеЛицаУТ. В нем реализована функция ФамилияИнициалыФизЛица, однако, как отмечают разработчики, она часто возвращает фамилию впереди инициалов. Если нам нужен обратный порядок, мы можем скомбинировать получение данных и форматирование.
Проанализируем шаги для получения данных из справочника:
ФизическиеЛица.ДанныеФизическихЛиц или ФизическиеЛицаУТ.ДанныеФизЛицДляПечати, чтобы получить ФИО на нужную дату (например, дату документа).Фамилия, Имя, Отчество) передаем в нашу функцию форматирования.Если вы работаете на современной платформе (8.3.10 и выше), вместо функции ПодставитьПараметрыВСтроку рекомендуется использовать встроенный метод СтрШаблон. Это работает быстрее и выглядит лаконичнее. Рассмотрим, как переписать финальную сборку строки:
Результат = СтрШаблон("%1.%2. %3",
Лев(ЧастиИмени.Имя, 1),
Лев(ЧастиИмени.Отчество, 1),
ЧастиИмени.Фамилия);
Важный нюанс: при работе с инициалами всегда стоит проверять наличие отчества. В некоторых культурах или при некорректном заполнении базы отчество может отсутствовать. В коде выше мы предусмотрели проверку ПустаяСтрока(Отчество), чтобы избежать появления двойных точек или лишних пробелов (например, «И.. Иванов»).
Может возникнуть соблазн использовать простую функцию СтрРазделить(ФИО, " "). Однако мы крайне не рекомендуем этот метод для задач, связанных с именами. Выясним причины:
СтрРазделить создаст пустые элементы массива, что сломает логику получения инициалов.ФизическиеЛицаКлиентСервер.ЧастиИмени уже содержит в себе все необходимые регулярные выражения и правила обработки подобных исключений, поэтому использование готового метода БСП — это признак качественного кода.Для реализации формата «Инициалы Фамилия» в 1С:УТ 11 оптимальным решением будет создание небольшой экспортной функции в вашем общем модуле (например, КастомныеФункцииСервер). Внутри этой функции обязательно используйте ФизическиеЛицаКлиентСервер.ЧастиИмени() для разбора входящих данных. Это гарантирует стабильную работу системы даже при нестандартных входных строках.