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