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