При формировании печатных форм кадровых приказов, договоров и доверенностей разработчики часто сталкиваются с задачей автоматического склонения должности сотрудника по падежам (чаще всего в родительный или дательный падеж). Попытка использовать стандартные библиотеки для склонения ФИО (например, NameDecl.dll) для названий должностей приводит к некорректным результатам — например, формулировка «Генеральный директор» может превратиться в «Генеральныя директора», а «Начальник отдела персонала» — в «Начальника отдела персоналу».
Разберем причины, почему специализированные библиотеки для имен собственных не подходят для названий должностей, и рассмотрим надежные варианты реализации склонения в 1С.
Проанализируем природу проблемы. Компоненты склонения ФИО строго ориентированы на трехкомпонентную модель (Фамилия — Имя — Отчество) и грамматику имен собственных. Названия должностей представляют собой сложные словосочетания нарицательных существительных с разнообразной грамматической структурой:
Рассмотрим подход, который является отраслевым стандартом в типовых конфигурациях (включая современные редакции ЗУП). Вместо того чтобы вычислять падежные формы динамически «на лету» в момент печати документа, падежные формы сохраняются непосредственно в справочнике должностей.
Разберем по шагам, как организовать такую схему:
Должности создаем дополнительные строковые реквизиты для нужных падежей (например, НаименованиеРодПадеж, НаименованиеДатПадеж, НаименованиеТворПадеж).Посмотрим на пример извлечения готового значения в коде модуля:
// Получение наименования должности в родительном падеже
Если ПустаяСтрока(ДолжностьСотрудника.НаименованиеРодПадеж) = 0 Тогда
СтрДолжность = ДолжностьСотрудника.НаименованиеРодПадеж;
Иначе
// Если падеж не был заполнен вручную, используем стандартное наименование
СтрДолжность = ДолжностьСотрудника.Наименование;
КонецЕсли;
Если требуется реализовать автоматическое склонение без ручного заполнения всех реквизитов, проанализируем алгоритм разделения строки на главное слово и неизменяемый зависимый «хвост».
Для большинства должностей в русском языке опорным является первое слово, а последующие слова представляют собой поясняющую структуру в родительном падеже («отдела...», «департамента...», «управления...», «службы...», «по...»). В таких случаях передавать на вход функции склонения всю строку целиком нельзя — необходимо склонять только опорную часть.
Разберем логику обработки строки:
ПадежП() или специализированные алгоритмы) только выделенную основу.Посмотрим на пример реализации алгоритма на встроенном языке:
// Функция разделения и склонения должности
Функция СклонятьДолжностьРодПадеж(Знач ИсходнаяДолжность)
Перем ПозицияПробела, ГлавноеСлово, ХвостСтроки, Результат;
ИсходнаяДолжность = СокрЛП(ИсходнаяДолжность);
ПозицияПробела = Найти(ИсходнаяДолжность, " ");
Если ПозицияПробела = 0 Тогда
// Одно слово — склоняем целиком специализированной функцией
Возврат глСклонениеСлова(ИсходнаяДолжность, 2);
КонецЕсли;
ГлавноеСлово = Лев(ИсходнаяДолжность, ПозицияПробела - 1);
ХвостСтроки = Сред(ИсходнаяДолжность, ПозицияПробела);
// Склоняем только первое слово (Падеж 2 = Родительный)
Результат = глСклонениеСлова(ГлавноеСлово, 2) + ХвостСтроки;
Возврат Результат;
КонецФункции
Для корректной обработки согласованных конструкций (например, «Генеральный директор» → «Генерального директора») простого разделения по первому пробелу недостаточно. В таких ситуациях алгоритм должен проверять окончание первого слова:
Наиболее надежный производственный результат дает комбинация подходов: автоматический морфологический алгоритм производит первичное заполнение форм, а механизм хранения в реквизитах справочника позволяет пользователю зафиксировать точный результат для любых сложных исключений.