При формировании печатных форм, справок или официальных писем разработчики часто сталкиваются с необходимостью изменять текст в зависимости от пола физического лица. Например, фраза «Выдана сотруднику, работающему...» должна превращаться в «Выдана сотруднице, работающей...», если документ формируется для женщины. В 1С:Предприятие существует несколько способов решения этой задачи: от простого использования условий в коде до применения системных функций склонения. В этой статье мы подробно разберем, как правильно настроить макет и программный код для корректного отображения текста.
Разберем классический подход, который обсуждался на форуме. Суть метода заключается в том, чтобы не пытаться вставить одно слово с условием прямо в макет, а создать в шаблоне отдельные параметры для каждого изменяемого фрагмента текста. Проанализируем, как правильно подготовить макет и заполнить его данными.
Предположим, у нас есть строка в макете: Выдана [Сотрудник] ([Паспорт]), [Склонение_Работающий] в [Организация]... и [Склонение_ЕгоЕе] заработная плата составила:. Здесь [Склонение_Работающий] и [Склонение_ЕгоЕе] — это параметры, которые мы будем вычислять программно.
Рассмотрим пошагово реализацию в коде:
// Создаем структуру для хранения параметров макета
ДанныеОрганизации = Новый Структура;
// Получаем пол физического лица (предположим, ФизЛицо — это ссылка на объект)
ПолФизЛица = ФизЛицо.Пол;
// Проверяем пол и заполняем соответствующие склонения
Если ПолФизЛица = ПредопределенноеЗначение("Перечисление.ПолФизическогоЛица.Женский") Тогда
ДанныеОрганизации.Вставить("Склонение_Работающий", "работающей");
ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", "ее");
ИначеЕсли ПолФизЛица = ПредопределенноеЗначение("Перечисление.ПолФизическогоЛица.Мужской") Тогда
ДанныеОрганизации.Вставить("Склонение_Работающий", "работающему");
ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", "его");
Иначе
// Обработка ситуации, когда пол не указан
ДанныеОрганизации.Вставить("Склонение_Работающий", "работающему/ей");
ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", "его/ее");
КонецЕсли;
// Заполняем параметры области макета из структуры
ОбластьШапка.Параметры.Заполнить(ДанныеОрганизации);
Важный нюанс: как было отмечено в обсуждении, одной из частых ошибок является попытка использовать в коде имена параметров, которые не полностью соответствуют именам в макете, или пропуск одного из вариантов условий. Всегда проверяйте, чтобы ключи в структуре ДанныеОрганизации.Вставить("Ключ", "Значение") точно совпадали с именами параметров в квадратных скобках в макете 1С.
Если параметров много, конструкция Если...Тогда...КонецЕсли может стать слишком громоздкой. Проанализируем, как сделать код более лаконичным, используя встроенную функцию ?(). Это особенно удобно, когда нам нужно быстро вставить значение в структуру.
Посмотрим на пример оптимизированного кода:
ПолЖенский = (ФизЛицо.Пол = Перечисления.ПолФизическогоЛица.Женский);
ДанныеОрганизации.Вставить("Склонение_Работающий", ?(ПолЖенский, "работающей", "работающему"));
ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", ?(ПолЖенский, "ее", "его"));
Такой подход сокращает объем кода и делает его более читаемым для других разработчиков. Мы заранее вычисляем логическую переменную ПолЖенский, а затем используем её для выбора нужного слова.
В современных конфигурациях, таких как ЗУП 3.1, БП 3.0 или ERP, задача склонения ФИО и связанных с ними должностей или статусов автоматизирована на системном уровне. Выясним, как использовать возможности БСП для получения нужной формы слова.
Для склонения ФИО в нужный падеж (например, Дательный) можно использовать программный интерфейс модуля СклонениеПредставленийОбъектов. Однако для простых слов типа «работающий/работающая» чаще всего используются готовые функции форматирования строк.
Рассмотрим пример формирования строки через БСП, если конфигурация поддерживает шаблоны текста:
// Пример использования функции, возвращающей представление в зависимости от пола
ТекстДляПечати = СтрШаблон("Выдана %1, работающ%2 в %3",
СотрудникФИО_ДательныйПадеж,
?(ПолЖенский, "ей", "ему"),
НазваниеОрганизации);
Преимущество этого метода в том, что вы можете управлять окончаниями прямо в момент сборки строки, не создавая десятки параметров в макете. Однако это требует, чтобы тип заполнения области макета был установлен как Текст, а не Параметр, либо вся фраза целиком передавалась в один параметр [ТекстСправки].
Если задача стоит шире — например, нужно склонять не только «работающий», но и произвольные должности («главный бухгалтер», «ведущий инженер-программист») — ручных условий будет недостаточно. В таких случаях мы рекомендуем использовать компоненту Морфер.
Морфер позволяет передать исходное слово и получить его в любом падеже и роде. В коде это выглядит примерно так:
// Инициализация компоненты склонения
Компонента = Новый COMОбъект("Morpher.Russian.Converter");
// Склонение должности в зависимости от пола
Если ПолЖенский Тогда
Результат = Компонента.Склонять("работающий", 3, "жен"); // 3 - дательный падеж
Иначе
Результат = Компонента.Склонять("работающий", 3, "муж");
КонецЕсли;
Хотя этот метод требует установки дополнительного ПО на сервер, он является самым надежным при работе со сложными грамматическими конструкциями русского языка.
Чтобы ваша работа с шаблонами была профессиональной и удобной для поддержки, придерживайтесь следующих правил:
[Параметр1], [Склонение_1] используйте понятные имена: [ОкончаниеПол_Работающий] или [Местоимение_ЕгоЕе]. Это поможет вам и вашим коллегам быстро ориентироваться в макете.Параметр или Шаблон. Если выбран Текст, 1С просто проигнорирует ваши квадратные скобки.Разберем ситуацию, когда фраза очень длинная. В этом случае лучше выносить весь блок текста, зависящий от пола, в отдельный параметр. Например, вместо того чтобы менять только окончания в словах, можно подготовить две полные фразы:
Если ФизЛицо.Пол = Перечисления.ПолФизическогоЛица.Женский Тогда
ФразаОПриеме = "работающей в организации с " + Формат(ДатаПриема, "ДФ=dd.MM.yyyy");
Иначе
ФразаОПриеме = "работающему в организации с " + Формат(ДатаПриема, "ДФ=dd.MM.yyyy");
КонецЕсли;
ДанныеОрганизации.Вставить("ПолнаяФразаОПриеме", ФразаОПриеме);
Подводя итог, можно сказать, что выбор метода зависит от сложности документа. Для простых справок достаточно Метода 1 с условиями в коде. Для крупных систем с множеством печатных форм лучше использовать системные механизмы БСП или внешние библиотеки склонения.