Фамилия и инициалы в 1С: получаем из кода и запросом
Содержание
Фамилия и инициалы в формате Иванов И.И. берутся в 1С из справочника — у физического лица есть отдельные реквизиты Фамилия, Имя, Отчество, а инициалы вы собираете сами первой буквой имени и отчества. Готового реквизита «Фамилия И.О.» в типовых конфигурациях нет: Наименование хранит полное ФИО, а короткую форму формирует код.
Разберём по порядку: где лежат эти данные, как достать ФИО текущего пользователя и конкретного физлица, как собрать строку с инициалами без ошибок на пустых значениях и как выгрузить короткое ФИО пачкой через запрос. Код ниже рабочий и переносится в любую конфигурацию на платформе 8.3.
Где в 1С хранятся фамилия, имя и отчество
Источников данных о человеке в типовой базе обычно три, и путать их нельзя.
- 👤 Справочник
ФизическиеЛица— главный источник. Здесь лежат отдельные реквизитыФамилия,Имя,Отчество, аНаименование— это полное ФИО строкой. - 🧑💼 Справочник
Сотрудники(в ЗУП и Бухгалтерии с зарплатой) — не хранит ФИО сам по себе, а ссылается на физлицо через реквизитФизическоеЛицо. Один человек может быть сотрудником в нескольких организациях, но физлицо у него одно. - 🔑 Пользователь информационной базы — учётная запись для входа. У неё есть только
ПолноеИмяодной строкой, отдельных фамилии и имени там нет.
Отсюда простое правило: если нужны именно фамилия и инициалы раздельно — идите в физлицо. Если на входе строка целиком (как у пользователя ИБ) — её придётся разбирать.
Выбор источника определяет и надёжность. Раздельные реквизиты физлица — это данные, которые кадровик ввёл в чётко размеченные поля. Полное имя одной строкой — то, что кто-то когда-то набрал руками, с любым порядком слов и опечатками. Поэтому по возможности отталкивайтесь от физлица, а строку разбирайте только когда другого источника нет.
В большинстве типовых на Библиотеке стандартных подсистем справочник Пользователи тоже ссылается на физлицо через реквизит ФизическоеЛицо. Это мостик от учётной записи к нормальным ФИО.
Как получить ФИО текущего пользователя сеанса
Тут два разных «текущих пользователя», и от выбора зависит результат.
Пользователь информационной базы — это платформенный объект, одна строка с полным именем:
ТекущийИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ПолноеИмя = ТекущийИБ.ПолноеИмя; // строка вида "Иванов Иван Иванович"
ЛогинВхода = ТекущийИБ.Имя; // имя для входа, не ФИО
Обратите внимание: ПолноеИмя — это просто текст, который администратор ввёл при создании учётки. Он может быть любым, вплоть до «Бухгалтер №2». Разбирать его на фамилию и инициалы надёжно нельзя — порядок слов и их число не гарантированы.
Пользователь справочника (на БСП) даёт доступ к связанному физлицу, а значит к раздельным реквизитам:
ТекущийПользователь = Пользователи.ТекущийПользователь(); // СправочникСсылка.Пользователи
Физлицо = ТекущийПользователь.ФизическоеЛицо;
Если ЗначениеЗаполнено(Физлицо) Тогда
Фамилия = Физлицо.Фамилия;
Имя = Физлицо.Имя;
Отчество = Физлицо.Отчество;
КонецЕсли;
Всегда проверяйте ФизическоеЛицо на заполненность. У служебных и технических учёток физлицо часто пустое, и обращение Физлицо.Фамилия к пустой ссылке вернёт пустую строку, а не ошибку — но дальше в отчёте вы получите пустые строки вместо имён и не поймёте, почему.
Функция Пользователи.ТекущийПользователь() — из БСП. В самописной конфигурации без библиотеки её может не быть; тогда остаётся только платформенный ПользователиИнформационнойБазы.ТекущийПользователь() и связь с физлицом надо искать своими реквизитами.
Как собрать фамилию с инициалами из реквизитов
Когда фамилия, имя и отчество лежат раздельно, короткая форма Фамилия И.О. собирается в несколько строк. Главное — не уронить код на пустом отчестве или имени.
Функция ФамилияСИнициалами(Фамилия, Имя, Отчество) Экспорт
Результат = СокрЛП(Фамилия);
Если ЗначениеЗаполнено(Имя) Тогда
Результат = Результат + " " + Лев(СокрЛП(Имя), 1) + ".";
КонецЕсли;
Если ЗначениеЗаполнено(Отчество) Тогда
Результат = Результат + Лев(СокрЛП(Отчество), 1) + ".";
КонецЕсли;
Возврат Результат;
КонецФункции
Что здесь важно:
СокрЛПубирает случайные пробелы по краям — иначеЛев(Имя, 1)может взять пробел вместо буквы.Лев(..., 1)берёт первую букву. Для кириллицы работает корректно, регистр не трогаем.- Проверки
ЗначениеЗаполненооставляют корректный результат, если отчества нет: получитсяИванов И.без лишней точки.
Результат для Иванова Ивана Ивановича — Иванов И.И.. Для человека без отчества — Петров А..
Функцию с ключевым словом Экспорт логично положить в общий модуль (например, свой ОбщегоНазначенияКлиентСервер) и вызывать из любого места — из формы, из обработки, из печатной формы. Так короткое ФИО собирается по всей конфигурации одинаково, и правка формата (скажем, добавить пробел между инициалами) делается в одном месте, а не копируется по десяткам мест.
Если на входе одна строка (например, то самое ПолноеИмя пользователя ИБ), её сначала режут на части:
Части = СтрРазделить(СокрЛП(ПолноеИмя), " ", Ложь); // Ложь — пустые элементы отбрасываем
Фамилия = ?(Части.Количество() > 0, Части[0], "");
Имя = ?(Части.Количество() > 1, Части[1], "");
Отчество = ?(Части.Количество() > 2, Части[2], "");
КороткоеФИО = ФамилияСИнициалами(Фамилия, Имя, Отчество);
Разбор строки — это всегда допущение, что порядок «Фамилия Имя Отчество». Двойные фамилии через дефис он переживёт, а вот «Иван Иванов» (имя впереди) разберёт неправильно. Поэтому раздельные реквизиты физлица всегда надёжнее строки.
Готовые функции в типовых конфигурациях
В конфигурациях на БСП часто уже есть служебная функция формирования короткого ФИО — поищите в общих модулях обработки персональных данных по подстроке «Инициал» в конфигураторе (Правка → Глобальный поиск). Если нашли и она экспортная — используйте её вместо своей: она учитывает нюансы конкретной типовой. Если не нашли или сомневаетесь в составе параметров — своя функция выше работает в любой конфигурации.
ФИО сотрудника и физлица в кадровых конфигурациях
В ЗУП и в Бухгалтерии с зарплатой данные о человеке разнесены по двум справочникам, и важно брать реквизиты с правильного объекта.
| Что нужно | Откуда брать | Как обратиться |
|---|---|---|
| Полное ФИО строкой | Наименование физлица или сотрудника | Физлицо.Наименование |
| Раздельные Ф/И/О | Справочник ФизическиеЛица | Физлицо.Фамилия и т.д. |
| От сотрудника к физлицу | Реквизит сотрудника | Сотрудник.ФизическоеЛицо |
Типовой путь, когда на руках есть ссылка на сотрудника:
Физлицо = Сотрудник.ФизическоеЛицо;
Фамилия = Физлицо.Фамилия;
Имя = Физлицо.Имя;
Отчество = Физлицо.Отчество;
КороткоеФИО = ФамилияСИнициалами(Фамилия, Имя, Отчество);
Почему нельзя брать фамилию «прямо у сотрудника»: у справочника Сотрудники своих реквизитов Ф/И/О нет, его Наименование формируется от физлица. Если в кадрах сменили фамилию (замужество, ошибка ввода), правка идёт в карточке физлица, а все сотрудники по этому человеку подтягивают новое значение автоматически.
В конфигурациях без модуля зарплаты (чистая Управление торговлей, Розница) справочника Сотрудники в кадровом смысле нет. Там работайте от ФизическиеЛица либо от реквизита пользователя. Не переносите кадровую логику ЗУП на эти базы.
Пункты меню для проверки карточки физлица глазами зависят от конфигурации, но верхний раздел стабилен: в ЗУП это Кадры → Физические лица (или Сотрудники), в Бухгалтерии — Зарплата и кадры → Физические лица. Открыв карточку, вы увидите те самые реквизиты Фамилия / Имя / Отчество, с которыми работает код.
Как не уронить код на пустых реквизитах
Пустые значения — главная причина, по которой код получения ФИО падает или выдаёт мусор. Пройдёмся по типовым ловушкам.
- ❓ Пустая ссылка на физлицо.
ЗначениеЗаполнено(Физлицо)до любого обращения к реквизитам. Иначе получите тихие пустые строки. - ❓ Нет отчества. Проверка
ЗначениеЗаполнено(Отчество)в функции инициалов это уже закрывает — лишней точки не будет. - ❓ Значение
НеопределеноилиNull(приходит из запроса по левому соединению).СокрЛП(Строка(Значение))приводит к строке безопасно; наНеопределенодаст пустую строку. - ❓ Лишние пробелы и переносы в ручном вводе. Всегда
СокрЛПпередЛев.
Безопасный доступ к реквизитам, когда ссылка может прийти из запроса как Null, удобно обернуть в приведение:
Фамилия = СокрЛП(Строка(Выборка.Фамилия)); // Null и Неопределено дадут пустую строку
Собрать остальные проверки в одну диагностическую карту помогает такой разбор:
ФизическоеЛицо у пользователя или сотрудника — скорее всего реквизит не заполнен. Это не ошибка выполнения, а пустая ссылка.СокрЛП перед Лев.Сотрудники своих Фамилии/Имени нет, идите через .ФизическоеЛицо.Массовая выгрузка фамилий и инициалов запросом
Когда короткое ФИО нужно не для одного человека, а для списка (ведомость, печатная форма, выгрузка), цикл с чтением объектов — медленно. Берите данные запросом, а инициалы собирайте уже на выборке.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ФизЛица.Ссылка КАК Физлицо,
| ФизЛица.Фамилия КАК Фамилия,
| ФизЛица.Имя КАК Имя,
| ФизЛица.Отчество КАК Отчество
|ИЗ
| Справочник.ФизическиеЛица КАК ФизЛица
|ГДЕ
| НЕ ФизЛица.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КороткоеФИО = ФамилияСИнициалами(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество);
// ... пишем КороткоеФИО в таблицу, макет, файл
КонецЦикла;
Формировать инициалы можно и прямо в тексте запроса через ПОДСТРОКА. Для случая, когда все три реквизита заполнены, это выглядит так:
"ВЫБРАТЬ
| ФизЛица.Фамилия + "" "" +
| ПОДСТРОКА(ФизЛица.Имя, 1, 1) + ""."" +
| ПОДСТРОКА(ФизЛица.Отчество, 1, 1) + ""."" КАК КороткоеФИО
|ИЗ
| Справочник.ФизическиеЛица КАК ФизЛица"
Но как только отчество может быть пустым, в запросе приходится городить конструкции ВЫБОР КОГДА … ТОГДА, и текст разрастается. Для списка людей с разным составом ФИО читается хуже, чем функция на выборке. Держите правило: данные достаёт запрос, строку собирает код. Запрос — для скорости и фильтров, постобработку строк — на встроенный язык.
Если выгрузка идёт по сотрудникам организации, соедините справочники и сразу возьмите реквизиты физлица через точку в запросе:
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.ФизическоеЛицо.Фамилия КАК Фамилия,
| Сотрудники.ФизическоеЛицо.Имя КАК Имя,
| Сотрудники.ФизическоеЛицо.Отчество КАК Отчество
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Организация = &Организация"
Обращение через точку (Сотрудники.ФизическоеЛицо.Фамилия) платформа превращает в соединение автоматически. Для небольших справочников это удобно; на больших объёмах явное ЛЕВОЕ СОЕДИНЕНИЕ со справочником физлиц работает предсказуемее.
Проверьте себя на типичных ошибках выборки:
Частые вопросы
Можно ли получить фамилию и инициалы одной встроенной функцией платформы?
Почему у пользователя ИБ есть только ПолноеИмя, а раздельных реквизитов нет?
ФизическоеЛицо у справочника Пользователи, если конфигурация на БСП.Как вывести инициалы перед фамилией — «И.И. Иванов»?
Лев(Имя,1) + "." + Лев(Отчество,1) + ".", затем пробел и фамилия. Логика проверок на пустые значения остаётся прежней.Что вернёт код, если у человека нет отчества?
Иванов И. — без лишней точки. Это обеспечивает проверка ЗначениеЗаполнено(Отчество): пустое отчество просто не добавляется к результату.