Как настроить склонение ФИО и должностей во внешней печатной форме 1С:ЗУП 3.1 без использования внешних DLL?

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

При разработке внешних печатных форм (ВПФ) для конфигурации «Зарплата и управление персоналом, редакция 3.1» разработчики часто сталкиваются с необходимостью склонения ФИО сотрудников и их должностей для вывода в печатные формы договоров, приказов или справок. Исторически для этого использовалась внешняя компонента NAMEDECL.DLL. Однако в современных версиях платформы «1С:Предприятие 8.3» попытка её подключения напрямую часто оборачивается ошибками из-за жестких ограничений безопасного режима. Более того, примитивное пословное склонение сложных должностей (таких как «Научный сотрудник») выдает некорректные результаты.

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

---

Причины сбоя при подключении внешней компоненты NAMEDECL.DLL

Рассмотрим исходную ситуацию: разработчик регистрирует внешнюю печатную форму в справочнике «Дополнительные отчеты и обработки». В коде функции СведенияОВнешнейОбработке явно указано:

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

Несмотря на это, при попытке выполнить код ПодключитьВнешнююКомпоненту("C:\Program Files (x86)\1cv8\NAMEDECL.DLL") система блокирует операцию. Выясним причину этого поведения.

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

Кроме того, жестко прописанный путь к файлу на диске C:\Program Files (x86)\... несет в себе критические архитектурные риски:

  1. Разрядность процессов: Если ваш сервер 1С работает в 64-битном режиме (что стандартно для большинства современных СУБД-систем), попытка загрузить 32-разрядную библиотеку NAMEDECL.DLL из папки Program Files (x86) вызовет аппаратный конфликт и завершится системной ошибкой.
  2. Многосерверная среда: В кластере серверов код может выполняться на любом рабочем сервере. Нет никакой гарантии, что файл физически присутствует по указанному пути на каждой машине кластера.
  3. Кроссплатформенность: Если сервер 1С запущен под ОС Linux, пути вида C:\... в принципе приведут к критической ошибке времени выполнения.

Проанализируем альтернативные варианты, которые избавят нас от использования внешних зависимостей.

---

Решение 1. Использование встроенного метода платформы (с версии 8.3.13)

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

Разберем пример его использования для склонения ФИО:


&НаСервере
Функция ПросклонятьФИОПлатформой(Знач ФИО, Знач Падеж, Знач Пол = Неопределено) Экспорт
    
    // Преобразуем строковое представление падежа в системное перечисление
    // Падеж может принимать значения: "Именительный", "Родительный", "Дательный", "Винительный", "Творительный", "Предложный"
    ПадежСистемный = Падеж;
    Если ТипЗнч(Падеж) = Тип("Число") Тогда
        // Поддержка числового кодирования падежей (2 - Родительный, 3 - Дательный и т.д.)
        МассивПадежей = Новый Массив;
        МассивПадежей.Добавить("Именительный");
        МассивПадежей.Добавить("Родительный");
        МассивПадежей.Добавить("Дательный");
        МассивПадежей.Добавить("Винительный");
        МассивПадежей.Добавить("Творительный");
        МассивПадежей.Добавить("Предложный");
        
        Если Падеж >= 1 И Падеж <= 6 Тогда
            ПадежСистемный = МассивПадежей[Падеж - 1];
        КонецЕсли;
    КонецЕсли;

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

Этот метод решает проблему склонения ФИО "из коробки" без каких-либо внешних библиотек и полностью совместим с безопасным режимом работы внешних обработок.

---

Решение 2. Использование программного интерфейса ЗУП 3.1 / БСП

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

В БСП предусмотрен специальный общий модуль ФизическиеЛица. Склонение ФИО можно выполнить с помощью процедуры Просклонять. Посмотрим на практический пример вызова этого метода:


&НаСервере
Функция ПросклонятьФИОЧерезБСП(Знач ФИО, Знач ПадежЧислом, Знач ФизическоеЛицо = Неопределено)
    
    // ПадежЧислом: 1 - Именительный, 2 - Родительный, 3 - Дательный...
    РезультатСклонения = "";
    Пол = Неопределено;
    
    // Если передана ссылка на ФизическоеЛицо, мы можем точно определить пол
    Если ЗначениеЗаполнено(ФизическоеЛицо) Тогда
        Пол = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФизическоеЛицо, "Пол");
    КонецЕсли;
    
    ФизическиеЛица.Просклонять(ФИО, ПадежЧислом, РезультатСклонения, Пол);
    
    Если ЗначениеЗаполнено(РезультатСклонения) Тогда
        Возврат РезультатСклонения;
    КонецЕсли;
    
    Возврат ФИО;
КонецФункции

Преимущество данного подхода: В ЗУП 3.1 ведется регистр сведений СклоненияПредставленийОбъектов. Если у сотрудника редкая или нестандартная фамилия, кадровик может один раз вручную отредактировать её склонение в карточке физического лица. Метод ФизическиеЛица.Просклонять() автоматически обратится к этому регистру и вернет идеальный, скорректированный пользователем вариант вместо автоматического машинного склонения.

---

Решение 3. Правильное склонение должностей и профессий

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

Разберем по шагам, почему так произошло. При ручном разделении теряется синтаксическая связь между прилагательным и существительным. Компоненты склонения ФИО спроектированы под структуру «Фамилия Имя Отчество» и пытаются применить грамматические алгоритмы имен собственных к нарицательным существительным. Отсюда и возникают подобные окончания.

В конфигурациях 1С для правильного склонения должностей и профессий предусмотрена специальная функция ПадежП() (или её аналоги в модулях склонения представлений БСП). Посмотрим, как использовать этот функционал:


&НаСервере
Функция ПросклонятьДолжность(Знач НаименованиеДолжности, Знач ПадежЧислом) Экспорт
    
    // Используем встроенную функцию ПадежП, предназначенную для профессий и должностей
    // Она корректно согласует прилагательные и существительные
    Результат = ПадежП(НаименованиеДолжности, ПадежЧислом);
    
    Если ЗначениеЗаполнено(Результат) Тогда
        Возврат Результат;
    КонецЕсли;
    
    Возврат НаименованиеДолжности;
КонецФункции

Проанализируем результат вызова данной функции:


Должность = "Научный сотрудник";
ДолжностьВДательном = ПросклонятьДолжность(Должность, 3); // Результат: "научному сотруднику"
ДолжностьВРодительном = ПросклонятьДолжность(Должность, 2); // Результат: "научного сотрудника"

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

---

Рекомендация по проектированию ВПФ в ЗУП 3.1

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

  1. Для должностей: Никогда не склоняйте наименование должности программно "на лету" с нуля, если это возможно. В ЗУП 3.1 у справочника «Должности» (а также «Позиции штатного расписания») есть стандартная гиперссылка «Склонения». Кадровики могут проверить и скорректировать склонение любой должности прямо в пользовательском интерфейсе. Считывайте готовые склонения должностей из регистра сведений СклоненияПредставленийОбъектов по ссылке на объект.
  2. Для ФИО: Используйте функцию ФизическиеЛица.Просклонять(), передавая туда ссылку на физическое лицо. Это гарантирует использование ручных правок из карточки сотрудника.
  3. Резервный вариант: Если объект в базе отсутствует (например, вы склоняете произвольный текст, введенный пользователем), используйте встроенный метод платформы ПолучитьСклоненияСтроки().

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

← На главную