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