Формирование инициалов Фамилия И.О. в 1С 8.3

· 9 мин

Содержание

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

Ниже — рабочая функция, её применение в макете печатной формы, в отчёте на СКД и в запросе, а также способ подключить такую функцию через расширение, не трогая типовую конфигурацию . Всё — для платформы 8.3 с интерфейсом «Такси».

Как устроен разбор строки ФИО

Когда ФИО хранится одной строкой вида Иванов Иван Иванович, его нужно разделить на части. В платформе 8.3.6 и новее для этого есть функция СтрРазделить:

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

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

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

  • 📌 что делать, если отчества нет (частый случай для иностранцев);
  • 📌 что считать результатом, если строка пустая.

Разберём на конкретной строке. Пусть на входе Петрова Анна Сергеевна с лишними пробелами по краям и двойным пробелом внутри. СокрЛП убирает пробелы по краям, СтрРазделить с параметром «не включать пустые» выбрасывает пустой элемент от двойного пробела. На выходе массив из трёх элементов: Петрова, Анна, Сергеевна. Фамилию берём целиком, от имени и отчества — по первой букве. Итог: Петрова А.С.

Если в базе ФИО уже лежит в трёх отдельных реквизитах (Фамилия, Имя, Отчество), разбор не нужен — сразу переходите к сборке результата. Такой вариант встречается в справочниках физических лиц и сотрудников типовых конфигураций.

Готовая функция для сокращения ФИО

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

Функция ИнициалыФИО(Фамилия, Имя = "", Отчество = "") Экспорт

    Результат = СокрЛП(Фамилия);

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

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

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

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

Для Фамилия = "Иванов", Имя = "Иван", Отчество = "Иванович" функция вернёт Иванов И.И.. Если отчество пустое — получится Иванов И. без лишней точки, потому что ветка с отчеством просто не выполнится.

Когда на входе одна строка, добавьте вторую функцию-обёртку, которая сначала разберёт её, а потом вызовет первую:

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

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

    Фамилия  = ?(Части.Количество() > 0, Части[0], "");
    Имя      = ?(Части.Количество() > 1, Части[1], "");
    Отчество = ?(Части.Количество() > 2, Части[2], "");

    Возврат ИнициалыФИО(Фамилия, Имя, Отчество);

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

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

Если известно, что отчество заполнено всегда, тело можно свернуть до одной строки через СтрШаблон:

Результат = СтрШаблон("%1 %2.%3.", Фамилия, Лев(Имя, 1), Лев(Отчество, 1));

Такой вариант короче, но не проверяет пустые значения: при отсутствии отчества получится висячая точка %3. без буквы. Поэтому для справочника физлиц, где отчество бывает пустым, надёжнее развёрнутая версия с проверками ПустаяСтрока.

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

Вывод инициалов в печатной форме

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

Порядок действий:

  1. В макете выделите ячейку, где должны быть инициалы.
  2. В палитре свойств ячейки задайте заполнение «Параметр» и впишите имя, например ФИОСокращенно.
  3. В модуле печати при заполнении области передайте в этот параметр результат функции:
Область = Макет.ПолучитьОбласть("Подписант");
Область.Параметры.ФИОСокращенно = ИнициалыФИО(Фамилия, Имя, Отчество);
ТабДокумент.Вывести(Область);

Если подписант хранится одной строкой ФИО, вызывайте ИнициалыИзСтроки(ФИО). Такой подход работает в любой печатной форме — от счёта до доверенности: в строке подписанта сразу появляется Петров П.С., а не полное ФИО.

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

Где лежит общий модуль с функцией, значения не имеет: главное, чтобы он был доступен там, где формируется печать. Если печать собирается на сервере, достаточно серверного флага; если инициалы нужны ещё и в форме на клиенте (например, для заголовка), поставьте оба флага — «Клиент» и «Сервер».

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

Инициалы в отчёте на СКД

В системе компоновки данных есть два рабочих пути, и выбор зависит от того, как лежит ФИО.

Если фамилия, имя и отчество — отдельные поля. Добавьте вычисляемое поле и в выражении соберите строку встроенными функциями СКД:

Фамилия + " " + Лев(Имя, 1) + "." + Лев(Отчество, 1) + "."

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

Фамилия + " " + Лев(Имя, 1) + "."
  + ВЫБОР КОГДА Отчество <> "" ТОГДА Лев(Отчество, 1) + "." ИНАЧЕ "" КОНЕЦ

Готовое поле затем перетаскивают в таблицу отчёта как обычную колонку. Заголовок поля задайте осмысленный, например «ФИО», иначе в шапке отчёта встанет имя вычисляемого поля.

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

Произвольную функцию общего модуля в обычном вычисляемом поле СКД вызвать нельзя — язык выражений ограничен фиксированным набором функций. Если логика сложная, формируйте поле до компоновки.

Формирование инициалов в запросе

Когда отчёт или выборка строятся запросом, а ФИО разложено на реквизиты, инициалы собираются прямо в тексте запроса функцией ПОДСТРОКА:

ВЫБРАТЬ
    Физлица.Фамилия + " "
        + ПОДСТРОКА(Физлица.Имя, 1, 1) + "."
        + ПОДСТРОКА(Физлица.Отчество, 1, 1) + "." КАК ФИОСокращенно
ИЗ
    Справочник.ФизическиеЛица КАК Физлица

ПОДСТРОКА(Строка, 1, 1) возвращает первый символ. Здесь есть две тонкости:

  • Если отчество пустое, в результат попадёт лишняя точка — при необходимости отрежьте её условием ВЫБОР.
  • Если реквизит может быть NULL, оберните его в ЕСТЬNULL(Физлица.Отчество, ""), иначе конкатенация с NULL обнулит всю строку.

Безопасная версия того же запроса с обеими проверками:

ВЫБРАТЬ
    Физлица.Фамилия + " "
        + ПОДСТРОКА(ЕСТЬNULL(Физлица.Имя, ""), 1, 1) + "."
        + ВЫБОР
            КОГДА ЕСТЬNULL(Физлица.Отчество, "") <> ""
                ТОГДА ПОДСТРОКА(Физлица.Отчество, 1, 1) + "."
            ИНАЧЕ ""
          КОНЕЦ КАК ФИОСокращенно
ИЗ
    Справочник.ФизическиеЛица КАК Физлица

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

Подключение функции через расширение конфигурации

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

Чтобы добавить функцию сокращения ФИО расширением:

  1. Создайте расширение: Конфигурация → Расширения конфигурации, добавьте новое и откройте его в отдельном окне конфигуратора.
  2. В расширении добавьте общий модуль, например ИнициалыРасширение, с флагами «Клиент» и «Сервер», и перенесите в него функции ИнициалыФИО и ИнициалыИзСтроки из разделов выше.
  3. Там же, в расширении, разместите собственную печатную форму или внешнюю обработку , которая вызывает эту функцию.

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

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

Плюс расширения в том, что при очередном обновлении типовой конфигурации ваш общий модуль с функцией инициалов останется на месте и ничего не затрёт.

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

Типичные ошибки при выводе «Фамилия И.О.»

Несколько мест, где формат ломается чаще всего:

СитуацияЧто происходитКак лечить
Пустое отчествоЛишняя точка Иванов И..Проверять ПустаяСтрока до добавления буквы
Два пробела в ФИОПустой элемент массива, инициал «уезжает»СтрРазделить(…, " ", Ложь)
NULL в реквизите запросаВся склеенная строка становится пустойОбернуть в ЕСТЬNULL(Поле, "")
Двойная фамилия через дефисРаботает корректно — дефис не пробелНичего не нужно
Вызов своей функции в поле СКДОшибка «функция не определена»Готовить поле в запросе или коде

Отдельно проверяйте фамилии с пробелом внутри («де Голль», «ван Бюрен»): разбор по пробелу примет частицу за имя. Если такие ФИО в базе есть, храните фамилию отдельным реквизитом, а не одной строкой.

Проверка функции инициалов перед внедрением
Выполнено: 0 / 5

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

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