Как реализовать автозаполнение сокращенного ФИО (Иванов И. И.) в 1С?

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

При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача автоматического формирования краткого представления физического лица. Например, когда пользователь вводит полное имя «Иванов Иван Иванович», система должна автоматически подставить в поле «Наименование» или «Представление» вариант «Иванов И. И.». Разберем, как это реализовать наиболее эффективно, учитывая особенности платформы и возможные ошибки ввода.

Вариант 1: Простой алгоритм разбора строки

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

Рассмотрим пример функции, которую можно разместить в модуле формы или в общем модуле:


Функция ФорматироватьИмя(ПолноеИмя) Экспорт
    // Убираем лишние пробелы по краям
    ИмяДляОбработки = СокрЛП(ПолноеИмя);
    
    // Разделяем строку на части, используя пробел как разделитель
    ЧастиИмени = СтрРазделить(ИмяДляОбработки, " ");
    
    // Проверяем, достаточно ли данных (нужны как минимум Фамилия и Имя)
    Если ЧастиИмени.Количество() < 2 Тогда
        Возврат ПолноеИмя; 
    КонецЕсли;

    Фамилия = ЧастиИмени[0];
    Имя = Лев(ЧастиИмени[1], 1) + ".";
    
    Отчество = "";
    Если ЧастиИмени.Количество() > 2 Тогда
        Отчество = " " + Лев(ЧастиИмени[2], 1) + ".";
    КонецЕсли;

    Возврат Фамилия + " " + Имя + Отчество;
КонецФункции

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

Вариант 2: Обработка «грязных» данных (лишние пробелы)

Как справедливо заметили участники обсуждения, пользователи часто допускают ошибки, например, ставят два или три пробела между словами. В этом случае стандартный метод СтрРазделить создаст пустые элементы в массиве, и алгоритм «сломается». Выясним причину: при наличии двух пробелов подряд 1С воспримет пустоту между ними как отдельное слово.

Чтобы избежать этой проблемы, перед разделением строки ее необходимо «сжать». Посмотрим, как это сделать с помощью цикла:


// Очистка строки от двойных пробелов
Пока Найти(ПолноеИмя, "  ") > 0 Цикл
    ПолноеИмя = СтрЗаменить(ПолноеИмя, "  ", " ");
КонецЦикла;

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

Интеграция в форму элемента

Теперь разберем, как привязать этот код к интерфейсу. Допустим, у нас есть справочник Водители, где есть реквизит ФизЛицо (ссылка на справочник ФизическиеЛица) и стандартный реквизит Наименование. Мы хотим, чтобы при выборе физлица наименование заполнялось автоматически.

  1. Откроем форму элемента справочника.
  2. Найдем элемент формы, связанный с реквизитом ФизЛицо.
  3. Создадим для него событие ПриИзменении.
  4. В процедуре события пропишем логику обращения к нашей функции.

&НаКлиенте
Процедура ФизЛицоПриИзменении(Элемент)
    // Получаем строковое представление выбранного физлица
    // Если это ссылка, получаем текст, который видит пользователь
    ПолноеФИО = Объект.ФизЛицо.Наименование; 
    
    Если ЗначениеЗаполнено(ПолноеФИО) Тогда
        Объект.Наименование = ФорматироватьИмя(ПолноеФИО);
    КонецЕсли;
КонецПроцедуры

Профессиональный подход: использование БСП

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

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

Пример вызова функции из БСП:


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

Сложные случаи: национальные имена и склонения

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

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


// Получение ФИО в родительном падеже
РезультатСклонения = ПолучитьСклоненияСтроки(Объект.ФизЛицо.Наименование, , "ПД=Родительный");

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

← На главную