Как в 1С преобразовать Фамилию, Имя и Отчество в строку с инициалами?

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

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

В этой статье мы подробно разберем несколько способов решения этой задачи: от написания собственного алгоритма до использования мощных инструментов Библиотеки стандартных подсистем (БСП).

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

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

Рассмотрим использование функции в конфигурации Зарплата и управление персоналом 3.1. Здесь для получения инициалов удобнее всего использовать модуль ФизическиеЛицаЗарплатаКадрыКлиентСервер. Проанализируем пример кода:


// Пример для ЗУП 3.1
ПолноеИмя = "Иванов Виталий Николаевич";
ФамилияИО = ФизическиеЛицаЗарплатаКадрыКлиентСервер.ФамилияИнициалы(ПолноеИмя);
// Результат: "Иванов В.Н."

В конфигурациях Бухгалтерия предприятия 3.0 или Комплексная автоматизация часто используется общий модуль ОбщегоНазначения. Посмотрим на вызов соответствующей функции:


// Пример для БП 3.0 и КА 2
Результат = ОбщегоНазначения.ФамилияИнициалыФизЛица(Сотрудник.ФизЛицо);
// Если передана ссылка на справочник, функция сама извлечет наименование и сократит его

Важно помнить, что функция ФамилияИнициалыФизЛица универсальна: она может принимать как ссылку на объект (справочник Физические лица), так и готовую строку. Это делает её крайне удобной для разработчика.

Метод 2: Ручной разбор строки (Универсальный алгоритм)

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

Разберем по шагам, как реализовать такую функцию:

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

Посмотрим на пример реализации такой функции:


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

В этом коде мы использовали функцию СтрРазделить, которая появилась в платформе 8.3.6. Она значительно упрощает код по сравнению со старыми методами через Найти() и Сред().

Метод 3: Особенности работы в старых конфигурациях (УПП 1.3)

В конфигурациях на обычных формах (например, УПП 1.3 или Бухгалтерия 2.0) структура общих модулей иная. Выясним, какие инструменты доступны там. Одним из надежных способов является обращение к модулю регламентированной отчетности.

Рассмотрим пример получения структуры ФИО:


// Пример для УПП 1.3
Результат = РегламентированнаяОтчетность.ПолучитьФИОФизЛица(СсылкаНаФизЛицо);
// Теперь мы можем собрать строку как нам нужно
ФИО_Сокращенно = Результат.Фамилия + " " + Лев(Результат.Имя, 1) + "." + Лев(Результат.Отчество, 1) + ".";

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

Метод 4: Этикет и государственные стандарты (ГОСТ)

При разработке печатных форм важно не только «как технически сократить», но и «в каком порядке выводить». Существует ГОСТ Р 6.30-2003 (и более современные его итерации), который регламентирует правила оформления документов.

Проанализируем основные правила:

Посмотрим, как можно модифицировать нашу функцию для поддержки разных форматов:


Функция СформироватьФИОДляПечати(Фамилия, Имя, Отчество, ФорматПредставления = "ФамилияИО")
    
    И1 = ?(ПустаяСтрока(Имя), "", Лев(Имя, 1) + ".");
    О1 = ?(ПустаяСтрока(Отчество), "", Лев(Отчество, 1) + ".");
    
    Если ФорматПредставления = "ИОФамилия" Тогда
        Возврат И1 + О1 + " " + Фамилия;
    Иначе
        Возврат Фамилия + " " + И1 + О1;
    КонецЕсли;
    
КонецФункции

Сложные случаи: Двойные фамилии и склонение

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

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

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

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

← На главную