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