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