Склонение должностей по падежам — одна из классических задач в автоматизации кадрового учета и документооборота на платформе 1С. Особую сложность представляют названия, содержащие уточнения в скобках, такие как "санитарка (палатная)" или "водитель (категории С)". Обычные алгоритмы часто ошибаются, добавляя падежные окончания после закрывающей скобки, что выглядит некорректно. В данной статье мы разберем несколько подходов к решению этой проблемы: от простого парсинга строки до использования мощных встроенных механизмов платформы и Библиотеки стандартных подсистем (БСП).
Проанализируем ситуацию, когда стандартная или самописная функция склонения выдает результат вида "санитаркой (палатная)ом". Это происходит потому, что алгоритм воспринимает всю строку как одно слово или неверно определяет границы слов. Чтобы избежать подобных казусов, нам необходимо научить программу обрабатывать текст внутри скобок отдельно или использовать инструменты, понимающие структуру русского языка. Рассмотрим подробнее способы реализации этой логики.
Самый надежный способ для нестандартных функций — это "разрезать" строку на части, просклонять каждую по отдельности и собрать обратно. Посмотрим на пример кода, который позволяет выделить текст внутри скобок и обработать его.
Для начала реализуем логику поиска и извлечения текста. Выясним позицию открывающей и закрывающей скобки:
// Пример выделения текста в скобках для раздельного склонения
НачСимволВставки = Найти(Должность, "(");
Если НачСимволВставки > 0 Тогда
ОсновнаяЧасть = СокрЛП(Лев(Должность, НачСимволВставки - 1));
КонСимволВставки = Найти(Должность, ")");
Если КонСимволВставки > НачСимволВставки Тогда
ТекстВСкобках = Сред(Должность, НачСимволВставки + 1, КонСимволВставки - НачСимволВставки - 1);
// Склоняем обе части (используя вашу функцию склонения)
СклоненнаяОсновная = ПросклонятьСтроку(ОсновнаяЧасть, НужныйПадеж);
СклоненныйТекстВСкобках = ПросклонятьСтроку(ТекстВСкобках, НужныйПадеж);
Результат = СклоненнаяОсновная + " (" + СклоненныйТекстВСкобках + ")";
КонецЕсли;
КонецЕсли;
Такой подход гарантирует, что падежное окончание будет добавлено к самому слову внутри скобок, а не после них. Разберем по шагам: мы используем функцию Найти() для определения границ, затем Сред() для получения подстроки и в конце конкатенируем результат. Для реализации более сложных алгоритмов парсинга и обработки текста подойдёт подборка методов для работы со строками в 1С.
Если вы работаете на платформе 8.3.13 и выше, мы рекомендуем использовать системную функцию ПолучитьСклоненияСтроки(). Она гораздо умнее простых функций на регулярных выражениях. Проанализируем пример ее использования на сервере:
&НаСервереБезКонтекста
Функция ПолучитьСклонениеДолжности(Знач ИсходнаяСтрока, Знач НомерПадежа)
// НомерПадежа: 1-Им, 2-Род, 3-Дат, 4-Вин, 5-Твор, 6-Предл
МассивПадежей = Новый Массив;
МассивПадежей.Добавить("ПД=Именительный");
МассивПадежей.Добавить("ПД=Родительный");
МассивПадежей.Добавить("ПД=Дательный");
МассивПадежей.Добавить("ПД=Винительный");
МассивПадежей.Добавить("ПД=Творительный");
МассивПадежей.Добавить("ПД=Предложный");
ФорматнаяСтрока = МассивПадежей[НомерПадежа - 1];
// Платформа сама пытается корректно обработать фразы
Результаты = ПолучитьСклоненияСтроки(ИсходнаяСтрока, , ФорматнаяСтрока);
Если Результаты.Количество() > 0 Тогда
Возврат Результаты[0];
КонецЕсли;
Возврат ИсходнаяСтрока;
КонецФункции
Важный нюанс: при использовании этой функции для должностей, платформа часто лучше справляется, если в строке нет лишних символов. Однако даже она может запнуться на сложных юридических терминах. Поэтому комбинирование первого и второго метода — лучший вариант для программиста.
В типовых конфигурациях (ЗУП, ERP, БП) реализована подсистема "Склонение представлений объектов". Мы советуем использовать ее, так как она поддерживает кэширование и ручное редактирование результатов пользователем. Рассмотрим, как вызвать склонение через БСП:
// Использование встроенного модуля БСП (например, в ЗУП 3.1)
ПараметрыСклонения = СклонениеПредставленийОбъектов.ПросклонятьПредставление(НаименованиеДолжности, 2);
// 2 - Родительный падеж
Результат = ПараметрыСклонения.Результат;
Главное преимущество этого метода заключается в том, что в системе обычно есть регистр сведений СклоненияПредставленийОбъектов. Если автоматическое склонение сработало неверно, бухгалтер или кадровик может один раз нажать на гиперссылку в карточке должности, поправить падеж вручную, и система запомнит этот вариант навсегда. Проанализируем ситуацию: это избавляет программиста от написания бесконечных исключений в коде для каждой специфической должности.
Посмотрим на проблему с другой стороны: склонение подразделений. Часто названия подразделений включают в себя географические названия или номера (например, "Цех №2"). В таких случаях склонять нужно только первое (главное) слово.
Для таких случаев в БСП существует возможность указать тип объекта склонения, что позволяет алгоритму применять разные правила для ФИО, должностей и организаций. Для поиска готовых примеров работы с функциями библиотеки можно воспользоваться интерактивным справочником по методам БСП.
Подведем итог и составим оптимальный план действий для реализации склонения:
Рассмотренные нами методы позволяют автоматизировать процесс формирования печатных форм и сделать документы профессионально оформленными. Выбор конкретного метода зависит от версии вашей платформы и наличия в конфигурации Библиотеки стандартных подсистем.