К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как из полного ФИО сделать фамилию и инициалы в 1С

Как в 1С из полного ФИО получить фамилию с инициалами: функция ФИОВИнициалами, разбор строки запросом и кодом, типовые ошибки и проверка результата.

Задача преобразовать полное ФИО вида «Иванов Иван Иванович» в сокращённое «Иванов И. И.» возникает в 1С постоянно: в печатных формах договоров, в подписях документов, в отчётах и на этикетках. Хранить отдельно фамилию и инициалы в справочнике неудобно и избыточно — правильнее вычислять сокращение из полного значения в момент вывода.

Способ решения зависит от контекста. В типовых конфигурациях (БП, ЗУП, УТ, ERP) уже есть готовые функции общих модулей, и изобретать велосипед не нужно. В самописных конфигурациях и при работе с произвольными строками приходится разбирать ФИО вручную — кодом на встроенном языке или прямо в запросе.

Ниже разобраны оба подхода: использование типовых механизмов, самостоятельный разбор строки, вариант с запросом, а также обработка нестандартных случаев — двойных фамилий, незаполненных отчеств и лишних пробелов.

Как устроено ФИО в 1С и где оно хранится

Прежде чем сокращать ФИО, полезно понимать, откуда берётся строка. В типовых конфигурациях ФИО физического лица хранится не в самом справочнике «Физические лица», а в регистре сведений «ФИО физических лиц» — с историей изменений. Это позволяет получить фамилию, действовавшую на конкретную дату, например на дату подписания документа.

В более простых случаях ФИО — это строковый реквизит справочника «Сотрудники», «Контрагенты» или «Пользователи». Тогда сокращение выполняется над значением реквизита напрямую, без обращения к регистрам.

Важное следствие: если вы пишете универсальную процедуру, она должна принимать на вход именно строку, а не ссылку на справочник. Получение строки из ссылки — ответственность вызывающего кода, тогда функция сокращения останется простой и переиспользуемой.

Готовые функции типовых конфигураций

В конфигурациях на Библиотеке стандартных подсистем (БСП) есть общий модуль для работы с ФИО. В зависимости от версии библиотеки функция называется по-разному, чаще всего встречается ФизическиеЛицаКлиентСервер.ФамилияИнициалы() или методы модуля ФизическиеЛица. Функция принимает либо строку с полным ФИО, либо ссылку на физическое лицо, и возвращает готовое сокращение.

Типичный вызов в коде печатной формы выглядит так:

ФИОПолное = "Иванов Иван Иванович";

ФИОКраткое = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(ФИОПолное);

// Результат: "Иванов И. И."

Преимущество типовых функций в том, что они уже обрабатывают краевые случаи: отсутствие отчества, лишние пробелы между частями, ФИО в разном регистре. Кроме того, при обновлении конфигурации поведение функции остаётся согласованным с остальной системой.

Чтобы найти нужную функцию в конкретной конфигурации, откройте конфигуратор и выполните глобальный поиск по строке «Инициалы» в общих модулях. Обычно находится несколько вариантов — выбирайте тот, что работает со строкой, а не со ссылкой, если у вас уже есть готовое ФИО.

Ручной разбор ФИО кодом на встроенном языке

Если типовой функции нет или конфигурация самописная, сокращение делается в несколько строк кода. Основной инструмент — функция СтрРазделить(), которая разбивает строку по разделителю в массив.

Функция ФамилияИнициалы(ФИО) Экспорт

Части = СтрРазделить(СокрЛП(ФИО), " ", Ложь);

Если Части.Количество() = 0 Тогда

Возврат "";

КонецЕсли;

Результат = Части[0]; // фамилия

Если Части.Количество() > 1 Тогда

Результат = Результат + " " + Лев(Части[1], 1) + ".";

КонецЕсли;

Если Части.Количество() > 2 Тогда

Результат = Результат + " " + Лев(Части[2], 1) + ".";

КонецЕсли;

Возврат Результат;

КонецФункции

Обратите внимание на два приёма. Во-первых, СокрЛП() убирает пробелы по краям строки, а третий параметр Ложь в СтрРазделить() отбрасывает пустые элементы — так двойные пробелы внутри ФИО не сломают разбор. Во-вторых, проверки количества частей делают функцию устойчивой к ФИО без отчества и к пустой строке.

Такую функцию логично разместить в общем серверном модуле с признаком «Сервер» и «Вызов сервера», чтобы она была доступна и из модулей объектов, и из форм.

Порядок действий
  1. 1
    Определите, есть ли в конфигурации типовой общий модуль для работы с ФИО — поиском по слову «Инициалы» в конфигураторе.
  2. 2
    Если модуль есть — вызывайте его функцию, передавая полное ФИО строкой.
  3. 3
    Если модуля нет — добавьте собственную функцию с разбором через СтрРазделить() в общий серверный модуль.
  4. 4
    Подставьте вызов функции в печатную форму или отчёт вместо полного ФИО.
  5. 5
    Проверьте результат на тестовых ФИО: полном, без отчества, с двойной фамилией, с лишними пробелами.

Получение фамилии и инициалов в запросе

Когда сокращённое ФИО нужно в отчёте на СКД или в динамическом списке, вызывать функцию встроенного языка для каждой строки невозможно — запрос работает на уровне СУБД. Здесь есть два пути.

Первый — функция языка запросов ПОДСТРОКА() в сочетании с функцией РАЗНОСТЬДАТ не поможет, а вот сочетание ПОДСТРОКА и поиска пробела через ВЫРАЗИТЬ в чистом виде неудобно: язык запросов 1С не имеет функции поиска позиции подстроки. Поэтому на практике применяют второй путь — вычисляемое поле в СКД.

В СКД на закладке «Вычисляемые поля» добавьте поле «ФИОКраткое» и в выражении укажите вызов вашей функции из общего модуля:

ОбщегоНазначения.ФамилияИнициалы(ФИО)

Чтобы такой вызов работал, общий модуль должен быть серверным и доступным для вызова из выражений СКД. Это стандартный и самый надёжный способ получить инициалы в отчётах без изменения запроса.

Сравнение вариантов

Типовая функция БСП

Подходит для типовых конфигураций. Минимум кода, корректная обработка краевых случаев. Ограничение: имя и сигнатура зависят от версии библиотеки.

Собственная функция в общем модуле

Подходит для самописных конфигураций и доработок. Полный контроль над форматом. Ограничение: обработку нестандартных ФИО пишете и тестируете сами.

Вычисляемое поле СКД

Подходит для отчётов и динамических списков, где нельзя вызывать код построчно. Ограничение: требует серверного общего модуля и аккуратной настройки.

Нестандартные случаи: двойные фамилии, отсутствие отчества, регистр букв

Простой разбор по пробелам ломается на реальных данных чаще, чем кажется. Перечислим типичные ситуации и способы их обработки.

Двойная фамилия через дефис («Салтыков-Щедрин Михаил Евграфович») проблем не создаёт: дефис не является разделителем, фамилия остаётся одним элементом массива. А вот двойная фамилия через пробел («Гарсия Маркес Габриель») уже разобьётся неправильно — вторую часть фамилии алгоритм примет за имя. Полностью надёжного решения для таких данных без дополнительной структуры хранения нет; если такие ФИО встречаются, храните фамилию, имя и отчество в отдельных реквизитах.

Отсутствие отчества обрабатывается проверкой количества частей: выводится фамилия и один инициал. Регистр букв («ИВАНОВ ИВАН») при необходимости нормализуется функциями ВРег(), НРег() и ТРег() — последняя переводит строку в формат «Иванов Иван», что часто и требуется перед сокращением.

Сокращённые имена в источнике. Если ФИО уже хранится как «Иванов И.», повторное применение функции даст «Иванов И.» — это безопасно. Но если в базе встречается «Иванов И.И.» без пробела, разбор по пробелам увидит только две части. Добавьте предварительную нормализацию: замену «.» на «. » с последующим сжатием двойных пробелов.

Типичные ошибки
01
Разбор строки через СтрНайти и Лев без проверки количества частей — на ФИО без отчества получается ошибка или лишняя точка.
02
Игнорирование двойных пробелов — элементы массива смещаются, и инициал берётся не от той части ФИО.
03
Использование функции из чужой версии БСП без проверки сигнатуры — после обновления конфигурации код перестаёт компилироваться.
04
Попытка сократить ФИО прямо в тексте запроса — язык запросов 1С не имеет функции поиска позиции подстроки, решение переносится в вычисляемое поле СКД.
05
Хранение инициалов отдельным реквизитом и ручное их заполнение — данные расходятся с полным ФИО при его изменении.

Проверка результата и контроль качества

После внедрения функции проверьте её на реальных данных, а не только на «Иванов Иван Иванович». Отберите из справочника физических лиц или контрагентов записи с нестандартными ФИО: короткие, с дефисами, с одним словом, пустые. Удобно сделать это консолью кода или временной обработкой, которая выводит исходное и сокращённое значение рядом.

Отдельно проверьте печатные формы, где подставляется сокращение: подписи руководителя в приказах, расшифровки в актах, поля «Кому» в письмах. Требования к формату там разные — где-то нужен вид «Иванов И. И.», а где-то «И. И. Иванов» (инициалы перед фамилией). Для второго варианта понадобится отдельная функция или параметр порядка вывода.

Контрольные точки

Как проверить результат

ФИО без отчества
Норма

«Петров П.» — фамилия и один инициал, без лишней точки

Тревожный признак

«Петров П. .» или ошибка выполнения

Двойная фамилия через дефис
Норма

«Салтыков-Щедрин М. Е.» — фамилия сохранена целиком

Тревожный признак

Фамилия обрезана по дефису

Лишние пробелы в исходной строке
Норма

Пробелы схлопнуты, инициалы взяты из правильных частей

Тревожный признак

В результате пустые инициалы или сдвиг частей

Пустое ФИО
Норма

Возвращается пустая строка без ошибки

Тревожный признак

Исключение или вывод мусорных символов

Если сокращение используется в юридически значимых документах, сверьте формат с требованиями делопроизводства вашей организации: порядок инициалов и фамилии, наличие пробела между инициалами. Это не требование платформы, а организационный стандарт, и функция должна ему соответствовать.

Итог

Что важно запомнить

В типовых конфигурациях ищите готовую функцию в общих модулях БСП, в самописных — разбирайте строку через СтрРазделить() с обработкой пустого отчества и лишних пробелов. В отчётах СКД используйте вычисляемое поле с вызовом серверной функции. Нестандартные ФИО проверяйте на реальных данных до вывода в печатные формы.

Частые вопросы

Как вывести инициалы перед фамилией, а не после?

Соберите строку в обратном порядке: сначала первые буквы имени и отчества с точками, затем фамилия. Например: Лев(Имя,1) + ". " + Лев(Отчество,1) + ". " + Фамилия даст «И. И. Иванов». Удобно сделать это параметром одной общей функции, чтобы не плодить дубликаты кода.

Что делать, если ФИО хранится тремя отдельными полями?

Это самый удобный случай: разбирать строку не нужно. Возьмите реквизит «Фамилия» целиком и добавьте первые символы реквизитов «Имя» и «Отчество» через Лев(), проверив их на заполненность. Такой вариант надёжнее любого разбора строки.

Можно ли получить инициалы прямо в запросе без СКД?

В чистом языке запросов 1С это практически нереализуемо: нет функции поиска позиции пробела, а ПОДСТРОКА требует заранее известной позиции. Практичные варианты — вычисляемое поле СКД с вызовом функции общего модуля или предварительная обработка результата запроса в коде.

Как сократить ФИО физлица на конкретную дату документа?

Сначала получите ФИО из регистра сведений «ФИО физических лиц» срезом последних на дату документа — в типовых конфигурациях для этого есть функции модуля работы с физическими лицами. Затем передайте полученную строку в функцию сокращения. Так в старых документах останется фамилия, действовавшая на момент их создания.

Функция БСП возвращает не тот формат, который нужен. Что делать?

Не изменяйте типовой модуль — это усложнит обновления. Создайте собственную функцию-обёртку в своём общем модуле: вызовите типовую и доработайте результат (уберите пробел между инициалами, поменяйте порядок) или напишите разбор с нуля, если формат сильно отличается.

Опасно ли применять сокращение к наименованиям контрагентов?

Да, без проверки это рискованно: в наименованиях контрагентов встречаются организации («ООО Ромашка»), и функция превратит их в «ООО Р.». Применяйте сокращение только к реквизитам, где гарантированно хранится ФИО человека, либо проверяйте вид контрагента перед вызовом.