Как правильно склонять слово "год" и другие существительные с числами в 1С?

Программист IT и автоматизация бизнеса
← На главную

При разработке отчетов или печатных форм мы часто сталкиваемся с задачей вывода возраста сотрудника, стажа работы или количества товаров. В русском языке это нетривиальная задача, так как окончания слов меняются в зависимости от числа: "1 год", "2 года", "5 лет". Если просто подставить слово "лет", получится некрасивое "22 лет".

Рассмотрим подробно все способы решения этой задачи в 1С: от встроенных механизмов платформы до использования Библиотеки Стандартных Подсистем (БСП) и написания собственных алгоритмов.

Способ 1. Использование встроенной функции ЧислоПрописью

Самый простой и классический способ, доступный в любой конфигурации 1С — это использование глобальной функции ЧислоПрописью. Многие привыкли использовать её для вывода суммы прописью ("Сто рублей 00 копеек"), но она умеет гораздо больше.

Давайте разберем, как с её помощью вывести число с правильным склонением слова "год". Для этого нам нужно правильно сформировать строку параметров предмета исчисления.

Синтаксис выглядит так:


ЧислоПрописью(Число, "ФорматнаяСтрока", "ПредметИсчисления")

Строка "ПредметИсчисления" имеет формат: "Один, Два, Пять, Род, ДробнаяЧасть,...". Рассмотрим пример для лет:


// Пример получения строки вида "22 года"
Возраст = 22;
СтрокаСВозрастом = ЧислоПрописью(Возраст, , "год, года, лет, м,,,,,0");
Сообщить(СтрокаСВозрастом); 

Разберем детально параметры строки "год, года, лет, м,,,,,0":

  1. год — форма для числа 1 (один год).
  2. года — форма для чисел 2, 3, 4 (два года).
  3. лет — форма для чисел 5, 6... 20 и т.д. (пять лет).
  4. м — мужской род (важно, чтобы было "один год", а не "одна год").
  5. ,,,,, — пропущенные параметры для дробной части (нам нужны только целые).
  6. 0 — точность вывода (дробную часть не выводим).

Этот метод отлично подходит, если вам нужно вывести строку в именительном падеже (например, "Ему исполнилось 22 года").

Способ 2. Современный метод: ПолучитьСклоненияСтрокиПоЧислу

Начиная с версии платформы 8.3.14, разработчики получили мощный инструмент для работы с морфологией. Если ваша платформа обновлена, рекомендуем использовать функцию ПолучитьСклоненияСтрокиПоЧислу.

Этот метод решает проблему контекста, которую мы обсуждали в начале. Ведь фразы могут требовать разных падежей:

Посмотрим, как это реализовать:


// Пример функции для склонения
Функция ПросклонятьВозраст(Знач ЧислоЛет, Знач Падеж = "Именительный")
    
    // Формируем форматную строку для указания падежа
    // ЧС=Количественное означает, что мы склоняем числительное с существительным
    ФорматнаяСтрока = СтрШаблон("ЧС=Количественное; ПД=%1", Падеж);
    
    // Функция возвращает массив строк, берем первый элемент
    МассивСклонений = ПолучитьСклоненияСтрокиПоЧислу("год", ЧислоЛет, "", ФорматнаяСтрока);
    
    Если МассивСклонений.Количество() > 0 Тогда
        Возврат МассивСклонений[0];
    Иначе
        Возврат "";
    КонецЕсли;

КонецФункции

// Вызов:
// Вернет "22 года"
Сообщить(ПросклонятьВозраст(22, "Именительный")); 
// Вернет "22 лет" (например, для фразы "достижение 22 лет")
Сообщить(ПросклонятьВозраст(22, "Родительный")); 

Преимущество этого метода в том, что он использует встроенные словари платформы и может склонять даже сложные словосочетания, например, "рабочий день".

Способ 3. Использование БСП (Библиотека Стандартных Подсистем)

Если вы работаете в типовой конфигурации (ERP, Бухгалтерия, ЗУП, УТ), то скорее всего у вас уже подключена БСП. В этом случае не нужно писать свои функции, лучше воспользоваться готовым модулем СтроковыеФункцииКлиентСервер.

Рассмотрим полезную функцию ПолучитьСтрокуСЧислом:


// Универсальный метод из БСП
// Параметры: Число, Описание для 1, Описание для 2-4, Описание для 5-0
Результат = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуСЧислом(22, "год", "года", "лет");
Сообщить(Результат); // Выведет "22 года"

Этот метод внутри себя реализует корректный алгоритм выбора окончания и избавляет код от лишних нагромождений.

Способ 4. Алгоритмический подход (Собственная функция)

Если вы пишете на старой платформе или вам нужно реализовать логику склонения "вручную" (например, в запросе или на клиенте без вызова сервера в самописной конфигурации), разберем алгоритм. Важно учесть главное правило русского языка, о которое часто спотыкаются новички: исключение для чисел 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", Количество, ФормаСлова);
    
КонецФункции

Выводы и рекомендации

Мы проанализировали несколько способов решения задачи. Какой выбрать?

  1. Если у вас современная платформа (8.3.14+) и нужна гибкость (падежи) — используйте ПолучитьСклоненияСтрокиПоЧислу.
  2. Для простых задач в любой версии платформы (просто вывести "22 года") — идеально подходит ЧислоПрописью с параметрами.
  3. Если вы работаете в типовой конфигурации — используйте функции общих модулей БСП (СтроковыеФункцииКлиентСервер), чтобы код соответствовал стандартам разработки.

Также помните о контексте. Если вы пишете сообщение "Отчет выполнялся 22 секунды", не забудьте, что слово "секунда" женского рода, и параметры для ЧислоПрописью будут отличаться (буква "ж" вместо "м").

← На главную