Как в 1С преобразовать строку «Фамилия Имя» в формат «Фамилия Инициал»

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

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

В этой статье мы подробно разберем, как решить эту задачу на платформе 1С:Предприятие (включая версии 8.1, 8.2 и 8.3), проанализируем возможные ошибки и рассмотрим наиболее эффективные алгоритмы обработки данных.

Базовый алгоритм преобразования строки

Рассмотрим ситуацию, когда у нас есть одна переменная, содержащая фамилию и имя, разделенные пробелом. Основная идея заключается в том, чтобы найти позицию первого пробела и «отрезать» все символы, идущие после первой буквы следующего слова.

Для реализации этого в 1С используются стандартные функции: Найти() для поиска позиции пробела и Лев() для получения левой части строки определенной длины.

Разберем пример кода:


// Исходная строка
ФамилияИмя = "Сергеев Антон";

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

// Если пробел найден, обрезаем строку
Если Поз > 0 Тогда
    // Берем символы до пробела + сам пробел + 1 символ после него
    Результат = Лев(ФамилияИмя, Поз + 1) + ".";
Иначе
    // Если пробела нет, оставляем как есть
    Результат = ФамилияИмя;
КонецЕсли;

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

Массовая обработка данных в Таблице Значений

Зачастую ФИО сотрудников хранятся не в одиночных переменных, а в коллекциях данных, например, в ТаблицеЗначений. В этом случае нам необходимо организовать цикл для обхода всех строк таблицы.

Проанализируем ситуацию, когда у нас есть ТаблицаЗначений (переменная ТЗ_Сотрудники) с колонкой ФИО. Нам нужно изменить значение в этой колонке для каждой записи.


Для Каждого СтрокаТЗ Из ТЗ_Сотрудники Цикл
    // Удаляем лишние пробелы в начале и конце строки для корректной работы
    ТекстФИО = СокрЛП(СтрокаТЗ.ФИО);
    
    Поз = Найти(ТекстФИО, " ");
    
    Если Поз > 0 Тогда
        // Перезаписываем значение в колонке
        СтрокаТЗ.ФИО = Лев(ТекстФИО, Поз + 1) + ".";
    КонецЕсли;
КонецЦикла;

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

Универсальный метод через разложение строки (метод «многострочки»)

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

Разберем этот продвинутый способ:


Функция СформироватьФамилиюИнициал(ВхТекст)
    // Очищаем от лишних пробелов по краям
    Текст = СокрЛП(ВхТекст);
    
    // Заменяем все пробелы на переносы строк
    // Символы.ПС — это стандартная константа перевода строки
    ТекстМногострочный = СтрЗаменить(Текст, " ", Символы.ПС);
    
    // Считаем, сколько слов получилось
    КоличествоСлов = СтрЧислоСтрок(ТекстМногострочный);
    
    Если КоличествоСлов >= 2 Тогда
        // Берем первое слово (Фамилия)
        Фамилия = СтрПолучитьСтроку(ТекстМногострочный, 1);
        // Берем второе слово (Имя)
        Имя = СтрПолучитьСтроку(ТекстМногострочный, 2);
        
        // Формируем результат: Фамилия + пробел + первая буква имени + точка
        Возврат Фамилия + " " + Лев(Имя, 1) + ".";
    Иначе
        // Если слово только одно, возвращаем его без изменений
        Возврат Текст;
    КонецЕсли;
КонецФункции

Этот метод считается более «чистым» в среде разработчиков 1С, так как он позволяет легко расширить функционал — например, добавить инициал отчества, просто обратившись к СтрПолучитьСтроку(ТекстМногострочный, 3).

Обработка «грязных» данных и типичные ошибки

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

  1. Отсутствие пробела: Если в строке только фамилия, функция Найти() вернет 0. Если попытаться вызвать Лев(Строка, 0 + 1), вы получите только первую букву фамилии, что будет ошибкой. Всегда проверяйте Если Поз > 0 Тогда.
  2. Двойные пробелы: Если между фамилией и именем стоят два пробела, то вторым словом (инициалом) станет пустая строка. Чтобы этого избежать, перед обработкой рекомендуется заменить двойные пробелы на одинарные.
  3. Использование точки: По правилам русского языка после инициала должна стоять точка. В примерах форума часто об этом забывают, ограничиваясь кодом Лев(Строка, Поз + 1). Не забывайте добавлять + "." в конце выражения.
  4. Версия платформы: Если вы работаете на 8.3, используйте СтрРазделить() — это самый быстрый и современный способ получить массив слов из строки. Если же вы на 8.1 или 7.7, ваш выбор — Найти() или метод с переносом строк.

Использование типовых механизмов

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

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

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

← На главную