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