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