При разработке печатных форм (поможет обработка автоматического склонения ФИО и заполнения документов), отчетов или интерфейсных решений в 1С программисты часто сталкиваются с задачей преобразования полного имени сотрудника или контрагента (например, «Иванов Иван Иванович») в сокращенный формат — «Иванов И. И.». В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), для этого существуют готовые механизмы, однако в некоторых случаях приходится прибегать к ручному разбору строк или запросам к базе данных. В этой статье мы подробно рассмотрим все актуальные способы решения этой задачи.
Если вы работаете в современной конфигурации (ЗУП 3.1, БП 3.0, УТ 11, ERP 2), то наиболее правильным и надежным способом будет использование функций общих модулей. Эти функции уже учитывают множество нюансов: отсутствие отчества, наличие двойных имен или лишних пробелов.
Рассмотрим использование модуля ФизическиеЛицаКлиентСервер. Это универсальный модуль, доступный как на стороне сервера, так и на стороне клиента. В нем часто встречается функция ФамилияИнициалы.
// Пример для Управления торговлей 11 или ERP 2
ПолноеИмя = "Петров Петр Петрович";
// Сначала разбиваем строку на части (Фамилия, Имя, Отчество)
ЧастиИмени = ФизическиеЛицаКлиентСервер.ЧастиИмени(ПолноеИмя);
// Формируем фамилию с инициалами
Результат = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(ЧастиИмени);
// На выходе получим: Петров П. П.
В конфигурациях типа «Бухгалтерия предприятия» или «Зарплата и управление персоналом» часто используется другой метод, который обращается к истории ФИО физического лица. Это важно, так как фамилия могла меняться со временем.
// Пример из 1С:Комплексная автоматизация 2
ДатаСреза = ТекущаяДата(); // Или дата документа
Физик = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");
Результат = ФизическиеЛицаЛокализация.ФамилияИнициалыФизЛица(Физик, ДатаСреза);
Важный нюанс: В некоторых версиях БСП функция может называться ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица. Всегда проверяйте наличие методов через контекстную подсказку (Ctrl + Space), набрав имя модуля.
Данные о фамилии, имени и отчестве физических лиц в 1С хранятся в периодическом регистре сведений ФИОФизЛиц. Это самый надежный источник, так как в нем данные уже разделены по полям. Проанализируем, как составить запрос для получения инициалов напрямую из базы данных — для этого подойдёт консоль запросов и инструментов разработчика 1С.
ВЫБРАТЬ
ФИОФизЛицСрезПоследних.Фамилия КАК Фамилия,
ПОДСТРОКА(ФИОФизЛицСрезПоследних.Имя, 1, 1) + "." КАК ИнициалИ,
ПОДСТРОКА(ФИОФизЛицСрезПоследних.Отчество, 1, 1) + "." КАК ИнициалО
ИЗ
РегистрСведений.ФИОФизЛиц.СрезПоследних(&ДатаДокумента, ФизЛицо = &ФизЛицо) КАК ФИОФизЛицСрезПоследних
После выполнения запроса мы можем собрать строку в коде 1С. Рассмотрим подробнее, как это сделать правильно, чтобы избежать ошибок при отсутствии отчества:
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ФИО = Выборка.Фамилия;
Если ЗначениеЗаполнено(Выборка.ИнициалИ) Тогда
ФИО = ФИО + " " + Выборка.ИнициалИ;
Если ЗначениеЗаполнено(Выборка.ИнициалО) Тогда
ФИО = ФИО + Выборка.ИнициалО;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иногда нам нужно получить инициалы из произвольной строки (поможет инструмент извлечения ФИО и реквизитов с помощью ИИ), которая не связана с базой данных (например, из текстового поля ввода). В этом случае мы используем функции работы со строками. Разберем по шагам классический алгоритм с использованием метода СтрРазделить.
СокрЛП.Лев) от второго и третьего элементов массива.
Функция ПолучитьИнициалыИзСтроки(Знач ПолноеФИО)
МассивСлов = СтрРазделить(СокрЛП(ПолноеФИО), " ", Истина);
КоличествоСлов = МассивСлов.Количество();
Если КоличествоСлов = 0 Тогда
Возврат "";
ИначеЕсли КоличествоСлов = 1 Тогда
Возврат МассивСлов[0]; // Только фамилия
ИначеЕсли КоличествоСлов = 2 Тогда
Возврат МассивСлов[0] + " " + Лев(МассивСлов[1], 1) + ".";
Иначе
Возврат МассивСлов[0] + " " + Лев(МассивСлов[1], 1) + "." + Лев(МассивСлов[2], 1) + ".";
КонецЕсли;
КонецФункции
Внимание: Использование третьего параметра Истина в функции СтрРазделить критически важно. Он заставляет систему игнорировать пустые строки в массиве, если пользователь случайно ввел два пробела между словами.
При реализации вывода инициалов стоит учитывать правила типографики и требования законодательства, которые часто игнорируются при простом кодинге — задачу упростит конструктор печатных форм и документов без программирования.
Неразрывные пробелы. В печатных формах крайне нежелательно, чтобы фамилия осталась на одной строке, а инициалы перенеслись на другую — для этого подойдёт инструмент формирования документов Word по шаблонам из 1С. Чтобы этого избежать, используйте неразрывный пробел между фамилией и первой буквой имени. В 1С его можно добавить кодом символа 160 или системной константой.
// Пример использования неразрывного пробела
Результат = Фамилия + Символы.НПП + Инициалы;
Сложные фамилии и отчества. Если фамилия двойная (например, Мамин-Сибиряк), стандартный разбор по пробелу сработает корректно. Однако, если фамилия содержит пробелы (например, «фон Бисмарк»), алгоритм может посчитать «фон» фамилией, а «Бисмарк» — именем. Именно поэтому предпочтительнее использовать регистрационные данные из системы (Метод 2) или специализированные функции БСП (Метод 1), которые «знают» структуру справочника физических лиц.
Отсутствие отчества. В современной практике (особенно для иностранных граждан) отчество часто отсутствует. Ваш код всегда должен проверять заполненность этой части ФИО, чтобы не выводить «лишнюю» точку в конце строки.
Выясним, какой метод выбрать:
ФизическиеЛицаКлиентСервер). Это сэкономит время и обеспечит корректность данных.ПОДСТРОКА. Это обеспечит максимальную производительность.СтрРазделить.