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