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

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

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

Способ 1: Использование типовых функций в старых конфигурациях (ЗУП 2.5, УПП)

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

Функция обычно располагается в общем модуле УниверсальныеМеханизмы. Ее вызов выглядит следующим образом:


Результат = УниверсальныеМеханизмы.Просклонять(Компонента, "Генеральный директор", 2, , );

Здесь второй параметр — это текст, который нужно просклонять, а третий параметр (цифра 2) указывает на номер падежа (2 — родительный, 3 — дательный и так далее). Однако стоит учитывать, что этот механизм сильно зависит от внешней компоненты NameDecl.dll, которая изначально проектировалась для работы с ФИО, а не с должностями.

Способ 2: Внешняя компонента NameDecl.dll и ее ограничения

Компонента NameDecl.dll является классическим инструментом 1С. Мы можем встретить ее во многих типовых решениях. Однако, как отмечают опытные разработчики, при склонении должностей она может вести себя непредсказуемо. Проанализируем ситуацию: если должность состоит из одного слова, результат обычно корректен. Но если мы имеем дело со сложными конструкциями (например, «генеральный директор»), компонента может выдать ошибочное окончание, превратив фразу в «генеральныя директора».

Важный нюанс: Данная компонента является COM-объектом и работает только под операционной системой Windows. Если ваш сервер 1С работает на Linux, этот метод не будет функционировать без дополнительных «костылей».

Способ 3: Современный метод в БСП (БП 3.0, ЗУП 3.1, ERP 2.x)

В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), реализован гораздо более мощный механизм. Он автоматически выбирает лучший способ склонения: использует локальный кэш, обращается к внутренним алгоритмам или запрашивает данные у специализированного веб-сервиса 1С.

Рассмотрим пример кода для Бухгалтерии предприятия 3.0, который позволяет получить должность руководителя в нужном падеже:


Падеж = 2; // Родительный падеж
ПустойДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка(); 
// Вызываем метод из общего модуля БСП
Результат = СклонениеПредставленийОбъектов.ПросклонятьПредставление(Выборка.ДолжностьРуководителя, Падеж, ПустойДоговор);

Преимущество этого метода заключается в том, что система умеет обращаться к Регистру сведений «Склонения объектов». Если пользователь один раз вручную исправит неверное склонение в печатной форме, система запомнит этот вариант и в следующий раз выдаст корректный результат без правки кода. Для быстрой корректировки отображения должностей и других реквизитов в готовых макетах можно использовать инструмент для постобработки печатных форм на базе БСП.

Способ 4: Реализация склонения на чистом коде 1С (Алгоритм Jurer)

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


Функция ПадежС(Знач z1, Знач z2 = 2, Знач z3 = "*", z4 = 0) Экспорт
    // Алгоритм анализа окончаний и замены на соответствующие падежу
    z5 = Найти(z1, "-");
    z6 = ?(z5 = 0, "", "-" + ПадежС(Сред(z1, z5 + 1, СтрДлина(z1) - z5 + 1), z2, z3, z4));
    z1 = ?(z5 = 0, z1, Лев(z1, z5 - 1));
    
    z7 = Прав(z1, 3);
    z8 = Прав(z7, 2);
    z9 = Прав(z8, 1);
    
    // Определение исключений и правил для различных окончаний
    z10 = Найти("ая ия ел ок яц ий па да ца ша ба та га ка", z8);
    // ... (далее следует логика замены окончаний)
    
    // Возврат результата
    Возврат z1 + z6; 
КонецФункции

Этот метод хорош тем, что он полностью автономен и работает на любой платформе (Windows/Linux) и любой версии 1С. Однако он требует тщательного тестирования на специфических названиях профессий.

Проблема пола в названиях должностей

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

Однако в кадровом учете часто требуется согласование по полу. В современных версиях ЗУП 3.1 в справочнике Должности предусмотрено поле для ввода специального наименования для использования в приказах. Мы рекомендуем использовать именно этот функционал вместо попыток программно превратить «Уборщик» в «Уборщица».

Практические рекомендации

Подводя итог нашему анализу, выделим основные шаги для эффективного решения задачи:

  1. Если вы работаете в современной типовой конфигурации, всегда используйте СклонениеПредставленийОбъектов.ПросклонятьПредставление(). Это самый надежный и поддерживаемый метод.
  2. Если результат склонения в печатной форме неверен, не спешите править код. Проверьте, нет ли в программе регистра сведений со склонениями, где можно задать правильный вариант вручную.
  3. В сложных отчетах, где должности часто меняются или имеют специфический вид, рассмотрите возможность унификации текста макета. Например, вместо «в лице Генерального директора...» можно написать «в лице лица, занимающего должность: Генеральный директор...», что позволит оставить должность в именительном падеже.
  4. Для самописных систем оптимальным выбором будет перенос проверенного алгоритма склонения в общий модуль Сервер, чтобы исключить зависимость от COM-компонент и ОС Windows.

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

← На главную