Формат «Фамилия И.О.» в 1С: код, печатные формы и отчёты

· 9 мин

Содержание

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

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

Где лежит ФИО и в каком виде его обычно показывают

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

  • 📄 Одна строка. В справочниках Контрагенты, Пользователи, у физлица-контакта ФИО часто лежит целиком в реквизите Наименование: «Иванов Иван Иванович». Разбивать на части придётся самому.
  • 🗂 Три отдельных поля. В кадровых конфигурациях (ЗУП 3.1, кадровый блок БП 3.0) у физического лица фамилия, имя и отчество — это разные значения. Тогда собрать инициалы проще простого.

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

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

Как хранится ФИОГде это бываетКороткий формат
Одна строка (Наименование)Контрагенты, Пользователи, контактыразобрать по пробелу кодом
Три реквизита (Фамилия/Имя/Отчество)физлица в кадровых конфигурацияхсобрать сразу, без разбора
Измерение регистрарегистры сведений по сотрудникамформат считать после запроса

Формат «Фамилия И.О.» из отдельных полей

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

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

На выходе — Иванов И.И.. Если между инициалами нужен пробел (Иванов И. И.), добавьте его перед второй точкой: Лев(Имя, 1) + ". ". Пробел между фамилией и инициалами при этом остаётся один — не ставьте его дважды, иначе в печати появится заметный разрыв.

Функция ЗначениеЗаполнено закрывает случай, когда отчества нет: лишняя точка не появится. Для иностранцев и людей без отчества это важно — иначе получите Смит С. с «висящей» точкой.

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

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

Как разобрать ФИО, записанное одной строкой

Чаще всего ФИО хранится целиком, и его нужно сначала разрезать. С версии платформы 8.3.6 для этого есть глобальная функция СтрРазделить — она делит строку по разделителю и возвращает массив.

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

    Части = СтрРазделить(СокрЛП(ПолноеФИО), " ", Ложь);
    Если Части.Количество() = 0 Тогда
        Возврат "";
    КонецЕсли;

    Результат = Части[0]; // фамилия
    Если Части.Количество() >= 2 Тогда
        Результат = Результат + " " + Лев(Части[1], 1) + ".";
    КонецЕсли;
    Если Части.Количество() >= 3 Тогда
        Результат = Результат + Лев(Части[2], 1) + ".";
    КонецЕсли;

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

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

Третий параметр СтрРазделить — Ложь — отбрасывает пустые элементы, поэтому два пробела подряд не создадут «пустое» слово. СокрЛП в начале убирает пробелы по краям: без него первым элементом массива окажется пустая строка, и фамилия «съедет».

Этот разбор исходит из порядка «Фамилия Имя Отчество». Двойная фамилия через пробел («Петров Водкин Алексей») уедет: второе слово программа примет за имя. Такие записи либо храните через дефис, либо выносите фамилию в отдельное поле.

Чтобы инициалы всегда были заглавными, оберните первую букву в ВРег: ВРег(Лев(Части[1], 1)). Это спасает, когда данные занесли в нижнем регистре.

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

Сравните подходы, прежде чем выбирать способ под свою задачу:

СпособКогда применятьНа что смотреть
Сборка из отдельных полейФИО уже разнесено по реквизитамсамый надёжный, разбор не нужен
Разбор строки СтрРазделитьФИО в одном поле Наименованиерискует на двойных фамилиях
Выражение в запросеполя раздельные, нужен отчётработает только при раздельном хранении
Отдельный реквизит с коротким ФИОформат нужен в списках и отборахтребует заполнения при записи

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

В макете табличного документа текст подставляется через параметры ячейки, а не вписывается руками. Порядок такой:

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

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

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

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

Если инициалы должны вставать в середину готового текста (например, «Настоящий договор подписан со стороны Исполнителя Петровым П.П.»), собирайте строку через СтрШаблон: СтрШаблон("подписан %1", ФИОСокращённо). Это надёжнее склейки через +, особенно когда частей текста несколько.

Инициалы в отчётах: запрос и система компоновки

В языке запросов 1С нет функции деления строки по пробелу. Есть только ПОДСТРОКА(Строка, Начало, Длина), которая вырезает кусок по позиции. Отсюда правило:

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

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

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

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

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

Частые ошибки при выводе фамилии с инициалами

Большинство сбоев — не в логике, а в данных и мелочах форматирования.

Диагностика: выберите симптом

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

Короткий чек-лист перед тем, как выпускать форму в работу:

Проверка вывода ФИО
Выполнено: 0 / 5

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

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