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