Как реализовать склонение текста в шаблоне в зависимости от пола сотрудника в 1С?

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

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

Метод 1: Использование параметров макета и структуры данных

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

Предположим, у нас есть строка в макете: Выдана [Сотрудник] ([Паспорт]), [Склонение_Работающий] в [Организация]... и [Склонение_ЕгоЕе] заработная плата составила:. Здесь [Склонение_Работающий] и [Склонение_ЕгоЕе] — это параметры, которые мы будем вычислять программно.

Рассмотрим пошагово реализацию в коде:


// Создаем структуру для хранения параметров макета
ДанныеОрганизации = Новый Структура;

// Получаем пол физического лица (предположим, ФизЛицо — это ссылка на объект)
ПолФизЛица = ФизЛицо.Пол;

// Проверяем пол и заполняем соответствующие склонения
Если ПолФизЛица = ПредопределенноеЗначение("Перечисление.ПолФизическогоЛица.Женский") Тогда
    ДанныеОрганизации.Вставить("Склонение_Работающий", "работающей");
    ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", "ее");
ИначеЕсли ПолФизЛица = ПредопределенноеЗначение("Перечисление.ПолФизическогоЛица.Мужской") Тогда
    ДанныеОрганизации.Вставить("Склонение_Работающий", "работающему");
    ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", "его");
Иначе
    // Обработка ситуации, когда пол не указан
    ДанныеОрганизации.Вставить("Склонение_Работающий", "работающему/ей");
    ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", "его/ее");
КонецЕсли;

// Заполняем параметры области макета из структуры
ОбластьШапка.Параметры.Заполнить(ДанныеОрганизации);

Важный нюанс: как было отмечено в обсуждении, одной из частых ошибок является попытка использовать в коде имена параметров, которые не полностью соответствуют именам в макете, или пропуск одного из вариантов условий. Всегда проверяйте, чтобы ключи в структуре ДанныеОрганизации.Вставить("Ключ", "Значение") точно совпадали с именами параметров в квадратных скобках в макете 1С.

Метод 2: Оптимизация кода через тернарный оператор

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

Посмотрим на пример оптимизированного кода:


ПолЖенский = (ФизЛицо.Пол = Перечисления.ПолФизическогоЛица.Женский);

ДанныеОрганизации.Вставить("Склонение_Работающий", ?(ПолЖенский, "работающей", "работающему"));
ДанныеОрганизации.Вставить("Склонение_ЕгоЕе", ?(ПолЖенский, "ее", "его"));

Такой подход сокращает объем кода и делает его более читаемым для других разработчиков. Мы заранее вычисляем логическую переменную ПолЖенский, а затем используем её для выбора нужного слова.

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

В современных конфигурациях, таких как ЗУП 3.1, БП 3.0 или ERP, задача склонения ФИО и связанных с ними должностей или статусов автоматизирована на системном уровне. Выясним, как использовать возможности БСП для получения нужной формы слова.

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

Рассмотрим пример формирования строки через БСП, если конфигурация поддерживает шаблоны текста:


// Пример использования функции, возвращающей представление в зависимости от пола
ТекстДляПечати = СтрШаблон("Выдана %1, работающ%2 в %3", 
    СотрудникФИО_ДательныйПадеж, 
    ?(ПолЖенский, "ей", "ему"), 
    НазваниеОрганизации);

Преимущество этого метода в том, что вы можете управлять окончаниями прямо в момент сборки строки, не создавая десятки параметров в макете. Однако это требует, чтобы тип заполнения области макета был установлен как Текст, а не Параметр, либо вся фраза целиком передавалась в один параметр [ТекстСправки].

Метод 4: Работа с внешними компонентами (Морфер)

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

Морфер позволяет передать исходное слово и получить его в любом падеже и роде. В коде это выглядит примерно так:


// Инициализация компоненты склонения
Компонента = Новый COMОбъект("Morpher.Russian.Converter");

// Склонение должности в зависимости от пола
Если ПолЖенский Тогда
    Результат = Компонента.Склонять("работающий", 3, "жен"); // 3 - дательный падеж
Иначе
    Результат = Компонента.Склонять("работающий", 3, "муж");
КонецЕсли;

Хотя этот метод требует установки дополнительного ПО на сервер, он является самым надежным при работе со сложными грамматическими конструкциями русского языка.

Практические рекомендации по оформлению макетов

Чтобы ваша работа с шаблонами была профессиональной и удобной для поддержки, придерживайтесь следующих правил:

  1. Осмысленные имена параметров. Вместо [Параметр1], [Склонение_1] используйте понятные имена: [ОкончаниеПол_Работающий] или [Местоимение_ЕгоЕе]. Это поможет вам и вашим коллегам быстро ориентироваться в макете.
  2. Обработка пустого значения. Всегда учитывайте ситуацию, когда в базе данных не указан пол физического лица. В таких случаях лучше выводить текст в мужском роде или использовать нейтральную форму («работающему(ей)»), чтобы избежать грамматических ошибок в документе.
  3. Тип заполнения. Если вы используете макет типа «Табличный документ», убедитесь, что в свойствах ячейки выбран тип Параметр или Шаблон. Если выбран Текст, 1С просто проигнорирует ваши квадратные скобки.
  4. Тестирование. Обязательно проверяйте печать документа как минимум на двух сотрудниках разного пола, чтобы убедиться, что все окончания подставляются корректно.

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


Если ФизЛицо.Пол = Перечисления.ПолФизическогоЛица.Женский Тогда
    ФразаОПриеме = "работающей в организации с " + Формат(ДатаПриема, "ДФ=dd.MM.yyyy");
Иначе
    ФразаОПриеме = "работающему в организации с " + Формат(ДатаПриема, "ДФ=dd.MM.yyyy");
КонецЕсли;

ДанныеОрганизации.Вставить("ПолнаяФразаОПриеме", ФразаОПриеме);

Подводя итог, можно сказать, что выбор метода зависит от сложности документа. Для простых справок достаточно Метода 1 с условиями в коде. Для крупных систем с множеством печатных форм лучше использовать системные механизмы БСП или внешние библиотеки склонения.

← На главную