К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в 1С разбить строку ФИО на фамилию, имя и отчество

Как в 1С разбить строку ФИО на фамилию, имя и отчество: готовые функции, СтрРазделить, работа с БСП, обработка ошибок и проверка результата разбора.

Задача разбить строку с фамилией, именем и отчеством встречается в 1С постоянно: при импорте данных из Excel или CSV, при загрузке выписок, при обмене с сайтами и сторонними системами, которые хранят ФИО одним полем. В типовых конфигурациях ФИО обычно хранится раздельно, поэтому перед записью в справочник «Физические лица» или документ строку нужно корректно разобрать на части.

Способ решения зависит от режима работы конфигурации и версии платформы. В современных версиях платформы 8.3 есть встроенная функция СтрРазделить(), в конфигурациях на базе Библиотеки стандартных подсистем (БСП) есть готовые функции работы с ФИО, а в старых решениях приходится собирать разбор вручную через цикл или СтрНайти().

Ниже разобраны рабочие варианты кода, ограничения каждого подхода и типичные ошибки, из-за которых фамилия попадает в имя, а двойные фамилии ломают логику разбора.

Когда нужна разбивка ФИО и как выглядят исходные данные

Чаще всего разбор требуется при загрузке данных из внешних файлов: таблиц Excel, текстовых выгрузок, веб-сервисов. В таких источниках человек обычно записан одной строкой вида «Иванов Иван Иванович», а в 1С нужно заполнить три отдельных реквизита. Вторая частая ситуация — формирование краткого представления: из «Иванов Иван Иванович» получить «Иванов И. И.» для печатных форм.

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

Разбор строки функцией СтрРазделить

Функция СтрРазделить() доступна в платформе 8.3 начиная с версии 8.3.6 и работает в тонком, толстом и веб-клиенте. Она разбивает строку по разделителю и возвращает массив подстрок — идеальный инструмент для простого случая.

Функция РазбитьФИО(СтрокаФИО) Экспорт

Результат = Новый Структура("Фамилия, Имя, Отчество", "", "", "");

Части = СтрРазделить(СокрЛП(СтрокаФИО), " ", Ложь);

Если Части.Количество() > 0 Тогда

Результат.Фамилия = Части[0];

КонецЕсли;

Если Части.Количество() > 1 Тогда

Результат.Имя = Части[1];

КонецЕсли;

Если Части.Количество() > 2 Тогда

Результат.Отчество = Части[2];

КонецЕсли;

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

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

Третий параметр Ложь указывает, что пустые части (возникающие при двойных пробелах) нужно пропустить. Это важно: пользовательские данные часто содержат два-три пробела подряд, и без этого флага в массив попадут пустые строки, сместив имя и отчество.

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

Порядок действий при простом разборе
  1. 1
    Очистите строку функцией СокрЛП от краевых пробелов
  2. 2
    Вызовите СтрРазделить с разделителем-пробелом и флагом пропуска пустых частей
  3. 3
    Проверьте количество элементов массива
  4. 4
    Заполните Фамилию, Имя, Отчество по индексам 0, 1, 2
  5. 5
    Запишите в журнал строки, где частей меньше двух или больше трёх

Разбор через БСП: готовые функции типовых конфигураций

Если конфигурация построена на Библиотеке стандартных подсистем (УТ 11, ERP, Бухгалтерия 3.0, ЗУП и другие), изобретать разбор не нужно. В общем модуле ФизическиеЛицаКлиентСервер есть функции для работы с ФИО, в том числе формирование краткого представления и разбор составных частей.

// Формирование краткого ФИО: "Иванов И. И."

КраткоеФИО = ФизическиеЛицаКлиентСервер.ФамилияИнициалы("Иванов Иван Иванович");

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

Если пишете собственную загрузку в конфигурации на БСП, ориентируйтесь на процедуры и функции общих модулей ФизическиеЛица и ФизическиеЛицаКлиентСервер: их состав зависит от версии библиотеки, поэтому откройте модуль в конфигураторе и посмотрите доступный программный интерфейс в вашей версии.

Разбор в старых платформах без СтрРазделить

На платформах младше 8.3.6 функции СтрРазделить() нет. Классический обходной путь — последовательный поиск пробела функцией СтрНайти() (в старом синтаксисе — Найти()) и отрезание частей через Лев() и Сред().

Функция РазбитьФИОСтарыйСпособ(СтрокаФИО)

Результат = Новый Структура("Фамилия, Имя, Отчество", "", "", "");

Остаток = СокрЛП(СтрокаФИО);

Позиция = СтрНайти(Остаток, " ");

Если Позиция > 0 Тогда

Результат.Фамилия = Лев(Остаток, Позиция - 1);

Остаток = СокрЛП(Сред(Остаток, Позиция + 1));

Иначе

Результат.Фамилия = Остаток;

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

КонецЕсли;

Позиция = СтрНайти(Остаток, " ");

Если Позиция > 0 Тогда

Результат.Имя = Лев(Остаток, Позиция - 1);

Результат.Отчество = СокрЛП(Сред(Остаток, Позиция + 1));

Иначе

Результат.Имя = Остаток;

КонецЕсли;

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

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

Такой подход чуть длиннее, но даёт дополнительный бонус: всё, что осталось после второго пробела, целиком попадает в отчество. Это спасает, когда в конце строки встречаются лишние слова, но не решает проблему двойных фамилий в начале.

Альтернатива — заменить множественные пробелы на одинарные через СтрЗаменить() в цикле, а затем использовать тот же поиск по пробелу. Это полезно для грязных данных, где между словами стоят табуляции и неразрывные пробелы: их тоже стоит предварительно заменить на обычный пробел.

Сложные случаи: двойные фамилии, отсутствие отчества, лишние пробелы

Реальные данные редко идеальны. Основные категории проблемных строк: двойные фамилии через дефис («Петров-Водкин Иван Петрович»), двойные фамилии без дефиса, отсутствующее отчество, иностранные имена из двух слов, инициалы вместо полного имени.

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

Практичное правило: если частей ровно две — считать их фамилией и именем, отчество оставить пустым. Если частей больше трёх — записать строку в протокол с пометкой «требует проверки» и не гадать, где фамилия, а где имя. Ошибочно записанное отчество исправить сложнее, чем дозаполнить пропущенное.

Типичные ошибки при разборе ФИО
01
Не использовать СокрЛП и флаг пропуска пустых частей — двойные пробелы смещают имя в фамилию
02
Считать, что частей всегда три — строки без отчества вызывают обращение к несуществующему индексу массива
03
Молча отбрасывать части сверх третьей — двойные фамилии теряются без следа
04
Не заменять неразрывные пробелы и табуляции — строка визуально выглядит нормально, но не делится

Проверка результата и обработка ошибок

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

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

Контрольные точки

Как проверить результат разбора

Количество частей после разбора
Норма

Две или три части, каждая непустая

Тревожный признак

Одна часть или больше трёх — строка требует ручной проверки

Содержимое частей
Норма

Только буквы и дефис

Тревожный признак

Цифры, точки, запятые — вероятно, в поле попали лишние данные

Первая буква каждой части
Норма

Заглавная буква

Тревожный признак

Все буквы строчные — возможен сдвиг частей из-за лишних пробелов

Формирование краткого ФИО с инициалами

Обратная задача встречается не реже: из полной строки сделать «Фамилия И. О.» для печати. Простейший вариант — разбить строку и взять первые буквы имени и отчества.

Функция ФИОСИнициалами(СтрокаФИО)

Части = СтрРазделить(СокрЛП(СтрокаФИО), " ", Ложь);

Если Части.Количество() = 0 Тогда

Возврат "";

КонецЕсли;

Результат = Части[0];

Если Части.Количество() > 1 Тогда

Результат = Результат + " " + Лев(Части[1], 1) + ".";

КонецЕсли;

Если Части.Количество() > 2 Тогда

Результат = Результат + " " + Лев(Части[2], 1) + ".";

КонецЕсли;

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

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

В конфигурациях на БСП для этого предназначена функция ФизическиеЛицаКлиентСервер.ФамилияИнициалы() — она корректно обрабатывает граничные случаи и предпочтительнее самописного варианта. Самописная функция оправдана только во внешних обработках, где нет доступа к модулям конфигурации.

Сравнение способов разбора ФИО

СтрРазделить

Быстро и коротко; требует платформу 8.3.6 и новее, чувствителен к лишним пробелам без флага пропуска пустых частей

СтрНайти + Лев/Сред

Работает на любой платформе, даёт контроль над остатком строки; кода больше, легче ошибиться в индексах

Функции БСП

Проверены в типовых решениях, учитывают нюансы; доступны только в конфигурациях на базе БСП

Типовая загрузка данных из файла

Не требует кода вообще; подходит только для разовых загрузок в поддерживаемые объекты

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

Как разбить ФИО, если между словами несколько пробелов или табуляции?

Сначала замените табуляции и неразрывные пробелы на обычный пробел через СтрЗаменить, затем используйте СтрРазделить с третьим параметром Ложь — пустые части от повторных пробелов будут пропущены автоматически.

Что делать, если отчество отсутствует?

Проверяйте количество элементов массива перед обращением по индексу. Если частей две, заполняйте только фамилию и имя, а отчество оставляйте пустой строкой — это корректная ситуация, а не ошибка.

Как обработать двойную фамилию без дефиса?

Автоматически надёжно — никак: программа не знает, где кончается фамилия. Такие строки (более трёх частей) выводите в протокол и передавайте на ручную разметку, либо ведите справочник известных двойных фамилий для вашего набора данных.

Можно ли разбить ФИО в запросе 1С?

Язык запросов не имеет функции разбиения строк по разделителю. Разбор делается в коде после выполнения запроса или до записи данных. Если разобранные части нужны часто, храните их в отдельных реквизитах объекта.

Работает ли СтрРазделить на управляемых и обычных формах?

Да, функция встроена в платформу и доступна на клиенте и на сервере независимо от вида клиента. Ограничение одно — версия платформы не ниже 8.3.6.

Как из полного ФИО получить «Фамилия И. О.» для печатной формы?

Разбейте строку на части и возьмите первые буквы имени и отчества с точками. В конфигурациях на БСП используйте готовую функцию ФизическиеЛицаКлиентСервер.ФамилияИнициалы — она уже учитывает граничные случаи.

Итог

Что важно запомнить

Для разбора ФИО в 1С используйте СтрРазделить с пропуском пустых частей, в конфигурациях на БСП — штатные функции модуля ФизическиеЛицаКлиентСервер. Всегда проверяйте количество частей, очищайте строку от лишних пробелов и отправляйте нестандартные варианты на ручную проверку вместо автоматического угадывания.