Как вывести ФИО в формате «Иванов И.И.» в 1С 8.3

· 9 мин

Содержание

Чтобы получить в 1С 8.3 фамилию с инициалами — строку вида Иванов И.И. — берут фамилию целиком и по первой букве от имени и отчества: Фамилия + " " + Лев(Имя, 1) + "." + Лев(Отчество, 1) + ".". Если ФИО хранится тремя отдельными полями (как в справочнике «Физические лица»), собрать инициалы можно одной строкой кода или прямо в запросе. Если ФИО лежит единой строкой в наименовании — его сначала разбирают функцией СтрРазделить.

Какой из способов выбрать, зависит от формата хранения: три отдельных поля читаются напрямую, единая строка требует разбора, массовая выборка быстрее всего собирается в запросе. Код работает на платформе 8.3 с интерфейсом «Такси» и подходит для ЗУП 3.1, Бухгалтерии 3.0 и Управления торговлей 11.

Где 1С хранит ФИО и почему от этого зависит способ

Способ получения инициалов зависит от того, как ФИО записано в базе. Вариантов два.

  • 👤 Три отдельных поля. В справочнике «Физические лица» (ЗУП, Бухгалтерия) есть реквизиты Фамилия, Имя, Отчество. Наименование элемента при этом собирается из них автоматически. Это удобный случай: инициалы берутся напрямую, без разбора строки.
  • 📝 Одна строка. У контрагента-физлица, у прочего справочника или в произвольном реквизите ФИО может лежать целиком в поле наименования: Иванов Иван Иванович. Тогда строку сначала делят на части по пробелу.

Проверить, как устроено хранилище, можно в карточке элемента: если видите три раздельных поля для фамилии, имени и отчества — у вас первый случай. Если ФИО набрано в одно поле — второй.

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

Готовая функция: собираем «Иванов И.И.» из трёх полей

Самый частый случай — ФИО в трёх реквизитах. Функция собирает фамилию с инициалами и корректно обрабатывает пустое отчество.

Функция ФамилияСИнициалами(Фамилия, Имя, Отчество) Экспорт
	Результат = СокрЛП(Фамилия);
	Если ЗначениеЗаполнено(Имя) Тогда
		Результат = Результат + " " + Лев(СокрЛП(Имя), 1) + ".";
	КонецЕсли;
	Если ЗначениеЗаполнено(Отчество) Тогда
		Результат = Результат + Лев(СокрЛП(Отчество), 1) + ".";
	КонецЕсли;
	Возврат Результат;
КонецФункции

Что здесь происходит по шагам:

  1. СокрЛП убирает пробелы по краям — иначе двойной пробел в данных испортит результат.
  2. Лев(Строка, 1) возвращает первый символ имени и отчества.
  3. Проверка ЗначениеЗаполнено не даёт поставить точку, если имя или отчество пустые.

Вызов и результат:

ФИО = ФамилияСИнициалами("Иванов", "Иван", "Иванович");
// ФИО = "Иванов И.И."

ФИО = ФамилияСИнициалами("Петрова", "Анна", "");
// ФИО = "Петрова А."

Функцию удобно разместить в общем модуле с флагами «Сервер», «Клиент (управляемое приложение)» и «Вызов сервера» — тогда она доступна и в формах, и в серверном коде. Реквизит Экспорт в объявлении обязателен для вызова из других модулей.

Два приёма, которые пригодятся на практике. Если имена в базу загрузили строчными буквами (иванов иван), первую букву инициала приводят к верхнему регистру функцией ВРег:

Инициал = ВРег(Лев(СокрЛП(Имя), 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) форматирование ФИО, как правило, уже написано — своё изобретать не обязательно. Функции лежат в общих модулях работы с физическими лицами.

Чтобы найти их, не трогая конфигурацию:

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

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

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

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

Выбор способа под вашу задачу

Как получить фамилию с инициалами в вашем случае?

Частые ошибки при форматировании ФИО

Ошибки при сборке инициалов повторяются из базы в базу. Вот те, что ломают результат чаще всего.

  • ❌ Лишняя точка при пустом отчестве. Если не проверять заполненность, строка превращается в Иванов И... Лечится проверкой ЗначениеЗаполнено (во встроенном языке) или ВЫБОР (в запросе).
  • ❌ Разбор двойной фамилии через пробел. СтрРазделить отдаёт «Водкин» в инициал имени. Решение — хранить и читать три поля, а не делить строку.
  • ❌ Двойные пробелы в данных. Между словами случайно оказалось два пробела — появляется пустой элемент массива. Параметр ВключатьПустые = Ложь и СокрЛП снимают проблему.
  • ❌ Склейка числа и строки в запросе. При конкатенации полей разных типов платформа выдаёт ошибку. Приводите поля к строке через ВЫРАЗИТЬ(… КАК СТРОКА(150)).
  • ❌ Обращение к реквизитам в цикле. Ссылка.Физлицо.Фамилия в цикле на сотни строк — это сотни запросов к базе. Для массовой обработки переходите на запрос.

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

Как получить инициалы с пробелами — «Иванов И. И.»?
Добавьте пробел между инициалами в строке сборки: + Лев(Имя, 1) + ". " + Лев(Отчество, 1) + ".". В запросе аналогично — вставьте + " " между подстроками имени и отчества.
Как вывести инициалы перед фамилией — «И.И. Иванов»?
Поменяйте порядок слагаемых: сначала соберите инициалы, затем через пробел добавьте фамилию. Логика первых букв та же, меняется только склейка результата.
Есть ли в 1С готовая функция для сокращённого ФИО?
В типовых конфигурациях на БСП — да, в общих модулях работы с физлицами. Найдите её глобальным поиском по текстам в Конфигураторе (подстрока «Инициал») и вызовите, если она экспортная.
Почему запрос выдаёт ошибку несовместимости типов при склейке полей?
Конкатенация в запросе требует, чтобы все слагаемые были строками. Оберните каждое поле в ВЫРАЗИТЬ(Поле КАК СТРОКА(150)) — тогда типы совпадут и склейка пройдёт.
Как сделать сокращённое ФИО в отчёте на СКД без правки макета?
Создайте вычисляемое поле и в его выражении соберите ФИО тем же способом, что в запросе: ПОДСТРОКА для первых букв плюс конструкция ВЫБОР для пустого отчества.