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