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