При разработке отчетов или печатных форм мы часто сталкиваемся с задачей вывода возраста сотрудника, стажа работы или количества товаров. В русском языке это нетривиальная задача, так как окончания слов меняются в зависимости от числа: "1 год", "2 года", "5 лет". Если просто подставить слово "лет", получится некрасивое "22 лет".
Рассмотрим подробно все способы решения этой задачи в 1С: от встроенных механизмов платформы до использования Библиотеки Стандартных Подсистем (БСП) и написания собственных алгоритмов.
Самый простой и классический способ, доступный в любой конфигурации 1С — это использование глобальной функции ЧислоПрописью. Многие привыкли использовать её для вывода суммы прописью ("Сто рублей 00 копеек"), но она умеет гораздо больше.
Давайте разберем, как с её помощью вывести число с правильным склонением слова "год". Для этого нам нужно правильно сформировать строку параметров предмета исчисления.
Синтаксис выглядит так:
ЧислоПрописью(Число, "ФорматнаяСтрока", "ПредметИсчисления")
Строка "ПредметИсчисления" имеет формат: "Один, Два, Пять, Род, ДробнаяЧасть,...". Рассмотрим пример для лет:
// Пример получения строки вида "22 года"
Возраст = 22;
СтрокаСВозрастом = ЧислоПрописью(Возраст, , "год, года, лет, м,,,,,0");
Сообщить(СтрокаСВозрастом);
Разберем детально параметры строки "год, года, лет, м,,,,,0":
Этот метод отлично подходит, если вам нужно вывести строку в именительном падеже (например, "Ему исполнилось 22 года").
Начиная с версии платформы 8.3.14, разработчики получили мощный инструмент для работы с морфологией. Если ваша платформа обновлена, рекомендуем использовать функцию ПолучитьСклоненияСтрокиПоЧислу.
Этот метод решает проблему контекста, которую мы обсуждали в начале. Ведь фразы могут требовать разных падежей:
Посмотрим, как это реализовать:
// Пример функции для склонения
Функция ПросклонятьВозраст(Знач ЧислоЛет, Знач Падеж = "Именительный")
// Формируем форматную строку для указания падежа
// ЧС=Количественное означает, что мы склоняем числительное с существительным
ФорматнаяСтрока = СтрШаблон("ЧС=Количественное; ПД=%1", Падеж);
// Функция возвращает массив строк, берем первый элемент
МассивСклонений = ПолучитьСклоненияСтрокиПоЧислу("год", ЧислоЛет, "", ФорматнаяСтрока);
Если МассивСклонений.Количество() > 0 Тогда
Возврат МассивСклонений[0];
Иначе
Возврат "";
КонецЕсли;
КонецФункции
// Вызов:
// Вернет "22 года"
Сообщить(ПросклонятьВозраст(22, "Именительный"));
// Вернет "22 лет" (например, для фразы "достижение 22 лет")
Сообщить(ПросклонятьВозраст(22, "Родительный"));
Преимущество этого метода в том, что он использует встроенные словари платформы и может склонять даже сложные словосочетания, например, "рабочий день".
Если вы работаете в типовой конфигурации (ERP, Бухгалтерия, ЗУП, УТ), то скорее всего у вас уже подключена БСП. В этом случае не нужно писать свои функции, лучше воспользоваться готовым модулем СтроковыеФункцииКлиентСервер.
Рассмотрим полезную функцию ПолучитьСтрокуСЧислом:
// Универсальный метод из БСП
// Параметры: Число, Описание для 1, Описание для 2-4, Описание для 5-0
Результат = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуСЧислом(22, "год", "года", "лет");
Сообщить(Результат); // Выведет "22 года"
Этот метод внутри себя реализует корректный алгоритм выбора окончания и избавляет код от лишних нагромождений.
Если вы пишете на старой платформе или вам нужно реализовать логику склонения "вручную" (например, в запросе или на клиенте без вызова сервера в самописной конфигурации), разберем алгоритм. Важно учесть главное правило русского языка, о которое часто спотыкаются новички: исключение для чисел 11-14.
Правило:
Реализуем это в коде:
Функция МножественноеЧисло(Знач Количество) Экспорт
// Определяем формы слова
Слово1 = "год";
Слово234 = "года";
СловоМного = "лет";
// Получаем последние две цифры и последнюю цифру
Остаток100 = Количество % 100;
Остаток10 = Количество % 10;
ФормаСлова = СловоМного; // Значение по умолчанию
// Проверка на исключение 11-14 (они всегда "лет")
Если Остаток100 >= 11 И Остаток100 <= 14 Тогда
ФормаСлова = СловоМного;
// Если заканчивается на 1
ИначеЕсли Остаток10 = 1 Тогда
ФормаСлова = Слово1;
// Если заканчивается на 2, 3, 4
ИначеЕсли Остаток10 >= 2 И Остаток10 <= 4 Тогда
ФормаСлова = Слово234;
КонецЕсли;
// Используем СтрШаблон для красивой сборки строки
Возврат СтрШаблон("%1 %2", Количество, ФормаСлова);
КонецФункции
Мы проанализировали несколько способов решения задачи. Какой выбрать?
ПолучитьСклоненияСтрокиПоЧислу.ЧислоПрописью с параметрами.СтроковыеФункцииКлиентСервер), чтобы код соответствовал стандартам разработки.Также помните о контексте. Если вы пишете сообщение "Отчет выполнялся 22 секунды", не забудьте, что слово "секунда" женского рода, и параметры для ЧислоПрописью будут отличаться (буква "ж" вместо "м").