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