Как в 1С автоматически сформировать краткое ФИО с инициалами из полного наименования

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Классический разбор строки с помощью функций поиска

Рассмотрим базовый алгоритм, который применим в любой версии платформы 8.x. Этот метод основан на поиске пробелов, которые разделяют фамилию, имя и отчество. Проанализируем логику: фамилия — это все символы до первого пробела, имя — это первый символ после первого пробела, а отчество — это первый символ после второго пробела.

Для реализации нам понадобятся функции СтрНайти, Лев и Сред. Разберем пример кода, который можно разместить в обработчике события:


// Предположим, ИсточникФИО - это строка "Иванов Иван Иванович"
ПолноеИмя = СокрЛП(Объект.ПолноеНаименование);

// Ищем позицию первого пробела
ПозПервогоПробела = СтрНайти(ПолноеИмя, " ");

Если ПозПервогоПробела > 0 Тогда
    // Извлекаем фамилию
    Фамилия = Лев(ПолноеИмя, ПозПервогоПробела - 1);
    
    // Остаток строки после фамилии
    ОстатокСтроки = СокрЛП(Сред(ПолноеИмя, ПозПервогоПробела + 1));
    
    // Ищем позицию второго пробела (между именем и отчеством)
    ПозВторогоПробела = СтрНайти(ОстатокСтроки, " ");
    
    ИнициалИмени = Лев(ОстатокСтроки, 1);
    
    Если ПозВторогоПробела > 0 Тогда
        // Извлекаем первый символ отчества
        ИнициалОтчества = Сред(ОстатокСтроки, ПозВторогоПробела + 1, 1);
        Объект.ФамилияИмяОтчество = Фамилия + " " + ИнициалИмени + ". " + ИнициалОтчества + ".";
    Иначе
        // Если отчества нет (только фамилия и имя)
        Объект.ФамилияИмяОтчество = Фамилия + " " + ИнициалИмени + ".";
    КонецЕсли;
КонецЕсли;

Важный момент: использование функции СокрЛП критически важно. Она удаляет лишние пробелы в начале и в конце строки, что предотвращает ошибки при вычислении позиций символов.

Метод 2: Использование функции СтрРазделить (современный подход)

Начиная с версии платформы 8.3.6, разработчикам доступен более элегантный и надежный инструмент — функция СтрРазделить. Проанализируем, насколько проще становится код. Вместо того чтобы высчитывать индексы вхождений пробелов, мы разбиваем строку в массив слов.

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


ТекстФИО = СокрЛП(Объект.ПолноеНаименование);
МассивСлов = СтрРазделить(ТекстФИО, " ", Ложь);

// Проверяем количество элементов в массиве, чтобы избежать ошибки "Индекс за границами массива"
Если МассивСлов.Количество() >= 3 Тогда
    // Стандартный случай: Фамилия, Имя, Отчество
    Объект.ФамилияИмяОтчество = МассивСлов[0] + " " + 
                                Лев(МассивСлов[1], 1) + ". " + 
                                Лев(МассивСлов[2], 1) + ".";
ИначеЕсли МассивСлов.Количество() = 2 Тогда
    // Случай без отчества: Фамилия и Имя
    Объект.ФамилияИмяОтчество = МассивСлов[0] + " " + Лев(МассивСлов[1], 1) + ".";
Иначе
    // Если введено только одно слово или ничего
    Объект.ФамилияИмяОтчество = ТекстФИО;
КонецЕсли;

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

Метод 3: Использование Библиотеки стандартных подсистем (БСП)

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

Наиболее часто используемая функция находится в общем модуле ФизическиеЛицаКлиентСервер. Она называется ФамилияИнициалыФизЛица. Проанализируем ее преимущества: она учитывает не только пробелы, но и специфические правила сокращения имён, принятые в учете.


// В обработчике на форме
Объект.ФамилияИмяОтчество = ФизическиеЛицаКлиентСервер.ФамилияИнициалыФизЛица(Объект.ПолноеНаименование);

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

Выбор события для выполнения кода

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

  1. Событие ПриИзменении на форме: Мы вешаем обработчик на поле ввода ПолноеНаименование. Как только пользователь заканчивает ввод и нажимает Enter, поле с инициалами заполняется мгновенно. Это удобно для визуального контроля.
  2. Событие ПередЗаписью в модуле объекта: Это гарантирует заполнение реквизита даже в том случае, если данные записываются программно (например, при загрузке из файла Excel или через COM-соединение). В форме код просто не сработает в таких сценариях.

Рекомендация: Лучше всего совместить эти подходы или реализовать логику в модуле объекта в процедуре ПередЗаписью. Если вы хотите, чтобы пользователь сразу видел результат, используйте ПриИзменении на форме, но обязательно дублируйте или выносите логику в модуль для надежности.

Обработка сложных случаев

Рассмотрим ситуации, которые могут привести к ошибкам в простых алгоритмах:

Таким образом, мы разобрали три способа решения задачи. Для простых самописных конфигураций оптимальным будет использование СтрРазделить, а для типовых решений — использование функций БСП.

← На главную