В практике разработки на платформе 1С:Предприятие задача преобразования полного имени физического лица в формат с инициалами (например, «Иванов Иван Иванович» в «Иванов И. И.») встречается повсеместно: от печатных форм приказов до формирования реестров и отчетов. Несмотря на кажущуюся простоту, эта задача имеет множество нюансов, связанных с двойными фамилиями, правилами делового этикета и особенностями различных конфигураций.
В этой статье мы подробно разберем несколько способов решения этой задачи: от написания собственного алгоритма до использования мощных инструментов Библиотеки стандартных подсистем (БСП).
Если вы работаете в современных конфигурациях, таких как 1С:Бухгалтерия 3.0, ЗУП 3.1 или ERP 2, вам не нужно изобретать велосипед. В состав Библиотеки стандартных подсистем уже включены оптимизированные функции, которые учитывают ошибки ввода и пустые строки.
Рассмотрим использование функции в конфигурации Зарплата и управление персоналом 3.1. Здесь для получения инициалов удобнее всего использовать модуль ФизическиеЛицаЗарплатаКадрыКлиентСервер. Проанализируем пример кода:
// Пример для ЗУП 3.1
ПолноеИмя = "Иванов Виталий Николаевич";
ФамилияИО = ФизическиеЛицаЗарплатаКадрыКлиентСервер.ФамилияИнициалы(ПолноеИмя);
// Результат: "Иванов В.Н."
В конфигурациях Бухгалтерия предприятия 3.0 или Комплексная автоматизация часто используется общий модуль ОбщегоНазначения. Посмотрим на вызов соответствующей функции:
// Пример для БП 3.0 и КА 2
Результат = ОбщегоНазначения.ФамилияИнициалыФизЛица(Сотрудник.ФизЛицо);
// Если передана ссылка на справочник, функция сама извлечет наименование и сократит его
Важно помнить, что функция ФамилияИнициалыФизЛица универсальна: она может принимать как ссылку на объект (справочник Физические лица), так и готовую строку. Это делает её крайне удобной для разработчика.
Бывают ситуации, когда вы работаете в старой конфигурации или на сильно кастомизированной базе, где нет доступа к стандартным модулям БСП. В этом случае нам поможет ручной разбор строки. Рассмотрим наиболее надежный алгоритм, который разделяет строку по пробелам и собирает результат.
Разберем по шагам, как реализовать такую функцию:
СокрЛП.Посмотрим на пример реализации такой функции:
Функция ПревратитьФИОВИнициалы(ПолноеИмя) Экспорт
// Используем современный метод платформы для разделения строки
МассивСлов = СтрРазделить(СокрЛП(ПолноеИмя), " ", Ложь);
КоличествоСлов = МассивСлов.Количество();
Если КоличествоСлов = 0 Тогда
Возврат "";
КонецЕсли;
Фамилия = МассивСлов[0];
ИмяИнициал = ?(КоличествоСлов > 1, " " + Лев(МассивСлов[1], 1) + ".", "");
ОтчествоИнициал = ?(КоличествоСлов > 2, Лев(МассивСлов[2], 1) + ".", "");
Возврат Фамилия + ИмяИнициал + ОтчествоИнициал;
КонецФункции
В этом коде мы использовали функцию СтрРазделить, которая появилась в платформе 8.3.6. Она значительно упрощает код по сравнению со старыми методами через Найти() и Сред().
В конфигурациях на обычных формах (например, УПП 1.3 или Бухгалтерия 2.0) структура общих модулей иная. Выясним, какие инструменты доступны там. Одним из надежных способов является обращение к модулю регламентированной отчетности.
Рассмотрим пример получения структуры ФИО:
// Пример для УПП 1.3
Результат = РегламентированнаяОтчетность.ПолучитьФИОФизЛица(СсылкаНаФизЛицо);
// Теперь мы можем собрать строку как нам нужно
ФИО_Сокращенно = Результат.Фамилия + " " + Лев(Результат.Имя, 1) + "." + Лев(Результат.Отчество, 1) + ".";
Преимущество этого метода в том, что системная процедура ПолучитьФИОФизЛица часто обращается не просто к наименованию справочника, а к регистру сведений ФИОФизическихЛиц. Это позволяет корректно обрабатывать ситуацию, когда сотрудник сменил фамилию, и нам нужно вывести в документ ту фамилию, которая была актуальна на дату документа.
При разработке печатных форм важно не только «как технически сократить», но и «в каком порядке выводить». Существует ГОСТ Р 6.30-2003 (и более современные его итерации), который регламентирует правила оформления документов.
Проанализируем основные правила:
А.А. Борисов).Посмотрим, как можно модифицировать нашу функцию для поддержки разных форматов:
Функция СформироватьФИОДляПечати(Фамилия, Имя, Отчество, ФорматПредставления = "ФамилияИО")
И1 = ?(ПустаяСтрока(Имя), "", Лев(Имя, 1) + ".");
О1 = ?(ПустаяСтрока(Отчество), "", Лев(Отчество, 1) + ".");
Если ФорматПредставления = "ИОФамилия" Тогда
Возврат И1 + О1 + " " + Фамилия;
Иначе
Возврат Фамилия + " " + И1 + О1;
КонецЕсли;
КонецФункции
Рассмотрим ситуацию с двойными фамилиями, например, «Салтыков-Щедрин Михаил Евграфович». Стандартный алгоритм разделения по пробелу отработает корректно, так как дефис не является разделителем слов в данном контексте. Однако, если фамилия содержит частицы (например, «фон Бисмарк»), ручной алгоритм может дать сбой, приняв «фон» за фамилию.
Для решения таких сложных задач, а также для автоматического склонения (например, «Выдать Иванову И.И.»), рекомендуется использовать встроенные сервисы 1С или внешние компоненты, такие как NameDecl.dll. В современных версиях БСП для этого существует модуль СклонениеФИО, который работает через облачный сервис 1С или локальные алгоритмы.
Важный совет: При получении данных для печати всегда старайтесь извлекать ФИО на конкретную дату. В 1С это реализуется через срез последних регистра сведений ФИОФизическихЛиц. Это застрахует вас от юридических ошибок в документах прошлых периодов.
Подводя итог, мы видим, что наиболее правильным путем для разработчика 1С является использование функций общего назначения БСП. Это гарантирует стабильность кода и корректную обработку данных в соответствии с логикой платформы.