Долгое время разработчикам на платформе 1С:Предприятие приходилось прибегать к использованию внешних компонент, веб-сервисов (таких как «Морфер») или писать собственные громоздкие алгоритмы («велосипеды») для решения тривиальной задачи: корректного склонения существительных и прилагательных в зависимости от числа. Начиная с версии 8.3.15, в платформу был интегрирован мощный инструмент — функция ПолучитьСклонениеСтрокиПоЧислу. В этой статье мы подробно разберем, как работает этот механизм, какие параметры он принимает и как правильно настраивать форматные строки для получения идеального результата в печатных формах и отчетах.
Ранее для склонения ФИО или названий номенклатуры программисты часто использовали специализированные библиотеки. Однако такой подход имел ряд минусов:
Встроенная функция работает локально, использует внутренние словари и алгоритмы платформы, что делает её максимально быстрой и надежной.
Рассмотрим структуру функции ПолучитьСклонениеСтрокиПоЧислу. Она доступна как на клиенте, так и на сервере.
Результат = ПолучитьСклонениеСтрокиПоЧислу(ИсходнаяФраза, Число, ПараметрыСклонения, ФорматнаяСтрока);
Разберем каждый параметр подробнее:
"компьютер"), так и словосочетание ("новый системный блок")."ПД=Дательный") и роду.Особое внимание стоит уделить параметру ФорматнаяСтрока. В обсуждениях на форумах часто возникают вопросы по поводу сокращений, которые кажутся неочевидными. Разберем основные коды:
Проанализируем практический пример формирования строки для отчета:
// Нам нужно получить строку: "пяти новых столов"
Результат = ПолучитьСклонениеСтрокиПоЧислу("новый стол", 5, "ПД=Родительный", "ЧС ПД");
// Результат: "пяти новых столов"
Система должна понимать, в каком роде склонять числительные «один» и «два». По умолчанию платформа пытается определить род автоматически, но для сложных случаев (например, аббревиатур или специфических товаров) рекомендуется указывать род явно в параметрах склонения. Это делается с помощью параметров ПЛ=Мужской, ПЛ=Женский или ПЛ=Средний.
Рассмотрим ситуацию с женским родом:
// Неправильно без указания рода:
Стр = ПолучитьСклонениеСтрокиПоЧислу("красивая машина", 2, , "ЧС ПД");
// Может вернуть: "два красивых машины" (если не распознает род)
// Правильно:
Стр = ПолучитьСклонениеСтрокиПоЧислу("красивая машина", 2, "ПЛ=Женский", "ЧС ПД");
// Результат: "две красивые машины"
Выясним причину, почему иногда автоматическое склонение может ошибаться. Алгоритмы 1С базируются на правилах лингвистики, но в русском языке огромное количество исключений. Как отмечали пользователи форума, даже в официальных примерах встречались неточности (например, склонение составных имен типа "Жан-Поль").
Если вы столкнулись с тем, что специфический термин склоняется неверно, можно использовать комбинацию функций или предварительную обработку строки. Однако в 95% случаев для стандартной номенклатуры и простых ФИО встроенный механизм справляется отлично.
Представим, что нам нужно вывести в подвале накладной общее количество упакованного товара. Выполним это по шагам:
КоличествоТовара = 21;
НаименованиеЕдиницы = "коробка";
Параметры = "ПЛ=Женский"; // Коробка - она моя
Формат = "ПЧ ПД"; // Выведем число цифрами и название в нужном падеже
ИтоговаяСтрока = ПолучитьСклонениеСтрокиПоЧислу(НаименованиеЕдиницы, КоличествоТовара, Параметры, Формат);
// На выходе получим: "21 коробка"
КоличествоТовара = 24;
ИтоговаяСтрока = ПолучитьСклонениеСтрокиПоЧислу(НаименованиеЕдиницы, КоличествоТовара, Параметры, Формат);
// На выходе получим: "24 коробки"
В ходе обсуждения данного функционала многие разработчики задавались вопросом: «А не лучше ли было добавить в платформу поддержку регулярных выражений?». Специалисты 1С поясняют, что RegExp — это универсальный инструмент, который при неправильном использовании может привести к критическим ошибкам и падению производительности («выстрелить в ногу»). В то время как ПолучитьСклонениеСтрокиПоЧислу — это узкоспециализированный, оптимизированный и безопасный метод, предназначенный для решения конкретной бизнес-задачи.
Подведем итог: использование встроенного механизма склонения — это современный стандарт разработки на 1С. Это позволяет сократить объем кода, избавиться от внешних зависимостей и сделать логику программы более прозрачной. Мы рекомендуем пересмотреть свои старые обработки и отчеты, где используются самописные функции для склонения «рублей», «штук» или «человек», и заменить их на стандартную функцию платформы.