При разработке внешних печатных форм (ВПФ) для конфигурации «Зарплата и управление персоналом, редакция 3.1» разработчики часто сталкиваются с необходимостью склонения ФИО сотрудников и их должностей для вывода в печатные формы договоров, приказов или справок. Исторически для этого использовалась внешняя компонента NAMEDECL.DLL. Однако в современных версиях платформы «1С:Предприятие 8.3» попытка её подключения напрямую часто оборачивается ошибками из-за жестких ограничений безопасного режима. Более того, примитивное пословное склонение сложных должностей (таких как «Научный сотрудник») выдает некорректные результаты.
В этой статье мы подробно разберем, почему не стоит использовать внешние файлы библиотек, как обойти ограничения безопасного режима и какие встроенные инструменты платформы и Библиотеки стандартных подсистем (БСП) позволяют решить задачу склонения красиво, быстро и без ошибок.
---
Рассмотрим исходную ситуацию: разработчик регистрирует внешнюю печатную форму в справочнике «Дополнительные отчеты и обработки». В коде функции СведенияОВнешнейОбработке явно указано:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Несмотря на это, при попытке выполнить код ПодключитьВнешнююКомпоненту("C:\Program Files (x86)\1cv8\NAMEDECL.DLL") система блокирует операцию. Выясним причину этого поведения.
Дело в том, что современные конфигурации на базе БСП используют развитые профили безопасности. Даже если флаг безопасного режима принудительно сброшен в Ложь, настройки информационной базы или требования кластера серверов могут принудительно изолировать выполнение кода сторонней обработки. Платформа блокирует доступ к файловой системе сервера за пределами разрешенных временных каталогов и не дает загружать произвольный исполняемый код (бинарные библиотеки DLL).
Кроме того, жестко прописанный путь к файлу на диске C:\Program Files (x86)\... несет в себе критические архитектурные риски:
NAMEDECL.DLL из папки Program Files (x86) вызовет аппаратный конфликт и завершится системной ошибкой.C:\... в принципе приведут к критической ошибке времени выполнения.Проанализируем альтернативные варианты, которые избавят нас от использования внешних зависимостей.
---
Если перед вами стоит задача просклонять произвольную строку на стороне сервера, самым современным и правильным решением будет использование встроенного в платформу метода ПолучитьСклоненияСтроки(). Этот метод работает на уровне ядра платформы, не требует подключения внешних файлов, стабилен в безопасном режиме и работает на любых операционных системах (Windows, Linux, macOS).
Разберем пример его использования для склонения ФИО:
&НаСервере
Функция ПросклонятьФИОПлатформой(Знач ФИО, Знач Падеж, Знач Пол = Неопределено) Экспорт
// Преобразуем строковое представление падежа в системное перечисление
// Падеж может принимать значения: "Именительный", "Родительный", "Дательный", "Винительный", "Творительный", "Предложный"
ПадежСистемный = Падеж;
Если ТипЗнч(Падеж) = Тип("Число") Тогда
// Поддержка числового кодирования падежей (2 - Родительный, 3 - Дательный и т.д.)
МассивПадежей = Новый Массив;
МассивПадежей.Добавить("Именительный");
МассивПадежей.Добавить("Родительный");
МассивПадежей.Добавить("Дательный");
МассивПадежей.Добавить("Винительный");
МассивПадежей.Добавить("Творительный");
МассивПадежей.Добавить("Предложный");
Если Падеж >= 1 И Падеж <= 6 Тогда
ПадежСистемный = МассивПадежей[Падеж - 1];
КонецЕсли;
КонецЕсли;
ПараметрыСклонения = "";
Если Пол = "Мужской" Или Пол = Перечисления.ПолФизическогоЛица.Мужской Тогда
ПараметрыСклонения = "ПЛ=Мужской";
ИначеЕсли Пол = "Женский" Или Пол = Перечисления.ПолФизическогоЛица.Женский Тогда
ПараметрыСклонения = "ПЛ=Женский";
КонецЕсли;
Попытка
РезультатМассив = ПолучитьСклоненияСтроки(ФИО, ПараметрыСклонения, "ПД=" + ПадежСистемный);
Если РезультатМассив.Количество() > 0 Тогда
Возврат РезультатМассив[0];
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("СклонениеСтроки", УровеньЖурналаРегистрации.Предупреждение, , ,
"Ошибка склонения строки '" + ФИО + "': " + ОписаниеОшибки());
КонецПопытки;
Возврат ФИО; // Возвращаем исходную строку в случае неудачи
КонецФункции
Этот метод решает проблему склонения ФИО "из коробки" без каких-либо внешних библиотек и полностью совместим с безопасным режимом работы внешних обработок.
---
Конфигурация «Зарплата и управление персоналом» содержит мощный встроенный механизм склонения ФИО физических лиц, тесно интегрированный со справочниками системы. Проанализируем, как использовать штатные модули конфигурации в нашей внешней печатной форме.
В БСП предусмотрен специальный общий модуль ФизическиеЛица. Склонение ФИО можно выполнить с помощью процедуры Просклонять. Посмотрим на практический пример вызова этого метода:
&НаСервере
Функция ПросклонятьФИОЧерезБСП(Знач ФИО, Знач ПадежЧислом, Знач ФизическоеЛицо = Неопределено)
// ПадежЧислом: 1 - Именительный, 2 - Родительный, 3 - Дательный...
РезультатСклонения = "";
Пол = Неопределено;
// Если передана ссылка на ФизическоеЛицо, мы можем точно определить пол
Если ЗначениеЗаполнено(ФизическоеЛицо) Тогда
Пол = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФизическоеЛицо, "Пол");
КонецЕсли;
ФизическиеЛица.Просклонять(ФИО, ПадежЧислом, РезультатСклонения, Пол);
Если ЗначениеЗаполнено(РезультатСклонения) Тогда
Возврат РезультатСклонения;
КонецЕсли;
Возврат ФИО;
КонецФункции
Преимущество данного подхода: В ЗУП 3.1 ведется регистр сведений СклоненияПредставленийОбъектов. Если у сотрудника редкая или нестандартная фамилия, кадровик может один раз вручную отредактировать её склонение в карточке физического лица. Метод ФизическиеЛица.Просклонять() автоматически обратится к этому регистру и вернет идеальный, скорректированный пользователем вариант вместо автоматического машинного склонения.
---
Одной из главных проблем, описанных на форуме, является некорректное склонение сложных должностей. При попытке пословного разделения строки «Научный сотрудник» и ручного склонения каждого слова получался некорректный результат: «научныю сотруднику».
Разберем по шагам, почему так произошло. При ручном разделении теряется синтаксическая связь между прилагательным и существительным. Компоненты склонения ФИО спроектированы под структуру «Фамилия Имя Отчество» и пытаются применить грамматические алгоритмы имен собственных к нарицательным существительным. Отсюда и возникают подобные окончания.
В конфигурациях 1С для правильного склонения должностей и профессий предусмотрена специальная функция ПадежП() (или её аналоги в модулях склонения представлений БСП). Посмотрим, как использовать этот функционал:
&НаСервере
Функция ПросклонятьДолжность(Знач НаименованиеДолжности, Знач ПадежЧислом) Экспорт
// Используем встроенную функцию ПадежП, предназначенную для профессий и должностей
// Она корректно согласует прилагательные и существительные
Результат = ПадежП(НаименованиеДолжности, ПадежЧислом);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
КонецЕсли;
Возврат НаименованиеДолжности;
КонецФункции
Проанализируем результат вызова данной функции:
Должность = "Научный сотрудник";
ДолжностьВДательном = ПросклонятьДолжность(Должность, 3); // Результат: "научному сотруднику"
ДолжностьВРодительном = ПросклонятьДолжность(Должность, 2); // Результат: "научного сотрудника"
Как мы видим, функция ПадежП() безошибочно определяет род словосочетания и правильно склоняет зависимые слова.
---
Если вы хотите, чтобы ваши внешние печатные формы работали стабильно и не вызывали вопросов у пользователей, используйте следующий алгоритм работы со склонениями:
СклоненияПредставленийОбъектов по ссылке на объект.ФизическиеЛица.Просклонять(), передавая туда ссылку на физическое лицо. Это гарантирует использование ручных правок из карточки сотрудника.ПолучитьСклоненияСтроки().Выполнение этих простых правил позволит вам создавать надежные внешние печатные формы, которые гарантированно пройдут аудит безопасности в сервисах 1С:Фреш и будут корректно работать при любых обновлениях платформы и конфигурации.