Как правильно вывести инициалы из строки с ФИО в 1С:Управление торговлей 11.3

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

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

Анализ ошибок при ручном разборе строки

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

Типичные причины ошибок:

  1. Неправильное определение области поиска: При попытке найти второй пробел (между именем и отчеством) программисты часто вкладывают одну функцию поиска в другую, допуская ошибку в расчете смещения. Если область поиска указана неверно, функция возвращает позицию первого попавшегося символа или вообще нулевое значение.
  2. Лишние пробелы: Наличие двойных пробелов между словами или случайного пробела в начале строки полностью ломает логику функций Лев и Сред.
  3. Неразрывные пробелы: В 1С часто встречается символ с кодом 160 (неразрывный пробел), который визуально не отличается от обычного (код 32), но функция Найти(Строка, " ") его не обнаруживает.

Способ 1: Использование типовых функций БСП (рекомендуемый)

В конфигурации 1С:Управление торговлей 11.3 интегрирована Библиотека стандартных подсистем (БСП). Это наиболее «кошерный» и надежный способ. Нам не нужно изобретать велосипед и прописывать алгоритмы поиска пробелов вручную, так как в системе уже есть готовые функции, учитывающие все нюансы (отсутствие отчества, лишние пробелы и т.д.).

Для решения задачи в общем модуле предусмотрена специальная функция. Посмотрим на пример её вызова:


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

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

Способ 2: Разбор строки через массив (метод СтрРазделить)

Если по каким-то причинам вы не хотите использовать БСП или работаете в специфическом контексте, проанализируем более современный подход платформы 8.3 — использование функции СтрРазделить. Этот метод превращает строку в массив слов, с которыми гораздо проще работать по отдельности.

Рассмотрим пример реализации:


НаименованиеФИО = ОбъектСсылка.Договор.КонтактноеЛицо.Наименование;
// Очищаем от лишних пробелов и разбиваем в массив
МассивСлов = СтрРазделить(СокрЛП(НаименованиеФИО), " ", Ложь);

Если МассивСлов.Количество() >= 3 Тогда
    // Если есть Фамилия, Имя и Отчество
    Результат = МассивСлов[0] + " " + Лев(МассивСлов[1], 1) + ". " + Лев(МассивСлов[2], 1) + ".";
ИначеЕсли МассивСлов.Количество() = 2 Тогда
    // Если только Фамилия и Имя
    Результат = МассивСлов[0] + " " + Лев(МассивСлов[1], 1) + ".";
Иначе
    Результат = НаименованиеФИО;
КонецЕсли;

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

Особенности работы с данными «Контактного лица»

В системе 1С:Управление торговлей данные о контактных лицах могут храниться по-разному. Выясним причину, почему иногда обращение к полю Наименование не является оптимальным. Если ваше «Контактное лицо» является ссылкой на справочник, стоит проверить, нет ли у него отдельных реквизитов для фамилии, имени и отчества.

Если данные заполнены в отдельных полях, мы можем использовать функцию СтрШаблон для формирования красивой строки:


// Предположим, мы получили структуру или реквизиты объекта
Фамилия = КонтактОбъект.Фамилия;
Имя = Лев(КонтактОбъект.Имя, 1);
Отчество = Лев(КонтактОбъект.Отчество, 1);

Результат = СтрШаблон("%1 %2.%3.", Фамилия, Имя, Отчество);

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


ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, " ");
ЧистаяСтрока = СокрЛП(ЧистаяСтрока);

Подведем итог: для корректного вывода инициалов в УТ 11.3 лучше всего использовать функцию ФизическиеЛицаКлиентСервер.ФамилияИнициалы(). Если требуется ручной алгоритм, используйте СтрРазделить, предварительно очистив строку от неразрывных пробелов и двойных отступов. Это гарантирует, что «Петрова Мария Алексеевна» всегда превратится в «Петрова М. А.» без досадных ошибок в символах.

← На главную