Введение
Русский язык — один из самых сложных для программирования. В отличие от английского, где формы слов почти не меняются, в русском языке одно и то же слово может иметь несколько форм в зависимости от числа, падежа и рода. Для разработчика на 1С это означает одно: если вы формируете печатную форму или текст письма, куда подставляется число или имя, — рано или поздно вы столкнётесь с задачей склонения.
Классический пример — уведомление о плановом обучении сотрудника. В нём пишется фраза «продолжительность обучения 5 календарных дней». Но если обучение короткое — «продолжительность 1 календарный день». А если среднее — «продолжительность 3 календарных дня». Одна и та же формулировка, но три разные формы слова «день».
Если подставить число без склонения, получится либо безграмотно («1 календарных дней»), либо шаблонно («1 день (дня, дней)»). Ни то, ни другое не выглядит профессионально.
В этой статье я разберу:
- числовое склонение существительных («день/дня/дней», «сотрудник/сотрудника/сотрудников»);
- падежное склонение ФИО, должностей, наименований («Иванов → Иванова», «директор → директора»);
- встроенные механизмы платформы и БСП на сентябрь 2026 года;
- когда штатных средств достаточно, а когда нужна своя функция;
- как внедрять склонение в печатные формы и письма;
- какие подводные камни подстерегают.
Часть 1. Два разных типа склонения
Прежде чем писать код, важно понять: в 1С существуют две принципиально разные задачи, которые часто путают.
| Тип склонения | Пример | Чем решается |
|---|---|---|
| Числовое (по числам) | «1 день», «2 дня», «5 дней» | Своя функция по остаткам от деления |
| Падежное (по падежам) | «Иванов» → «Иванова», «директор» → «директора» | Встроенные функции платформы и БСП |
Числовое склонение — это выбор одной из трёх форм слова в зависимости от числа. Встроенные функции платформы ПолучитьСклоненияСтроки и ПолучитьСклоненияСтрокиПоЧислу не решают эту задачу для произвольных слов. ПолучитьСклоненияСтрокиПоЧислу пытается, но работает ненадёжно для нестандартных слов.
Падежное склонение — это изменение формы слова по падежам. Здесь как раз помогают ПолучитьСклоненияСтроки, БСП и внешние компоненты.
Ниже разберём оба типа.
Часть 2. Правила числового склонения
В русском языке форма существительного зависит от числа следующим образом.
Три формы для каждого слова
| Форма | Когда используется | Пример |
|---|---|---|
| Единственное число | Числа, оканчивающиеся на 1 (кроме 11) | 1 день, 21 день, 31 день |
| Родительный падеж единственного числа | Числа, оканчивающиеся на 2, 3, 4 (кроме 12, 13, 14) | 2 дня, 3 дня, 4 дня, 22 дня |
| Родительный падеж множественного числа | Все остальные числа | 5 дней, 10 дней, 11 дней, 25 дней |
Исключения 11–14
Отдельная группа — числа 11, 12, 13, 14. Они всегда используют родительный падеж множественного числа, независимо от последней цифры:
- 11 дней (не «11 день»)
- 12 дней, 13 дней, 14 дней
Это правило распространяется и на 111–114, 211–214 и так далее.
Алгоритм
- Взять остаток от деления на 100 — чтобы отловить исключения 11–14.
- Взять остаток от деления на 10 — последняя цифра.
- Проверить по порядку:
- Если
% 100в диапазоне 11–14 → множественное число. - Иначе если
% 10 = 1→ единственное число. - Иначе если
% 10в диапазоне 2–4 → родительный единственного. - Иначе → множественное число.
- Если
| Число | % 100 |
% 10 |
Форма |
|---|---|---|---|
| 1 | 1 | 1 | единственное |
| 2 | 2 | 2 | родительный ед. |
| 5 | 5 | 5 | множественное |
| 11 | 11 | 1 | множественное (исключение) |
| 21 | 21 | 1 | единственное |
| 111 | 11 | 1 | множественное (исключение) |
| 121 | 21 | 1 | единственное |
Часть 3. Встроенные механизмы: что реально работает
3.1. ПолучитьСклоненияСтроки — падежное склонение
Функция доступна с платформы 8.3.13 и работает на сервере, в толстом клиенте и во внешнем соединении.
Синтаксис (3 параметра):
Массив ПолучитьСклоненияСтроки(СклоняемаяСтрока, [ОписаниеСтроки], [ФорматнаяСтрока])
Параметры:
СклоняемаяСтрока(обязательный) — строка для склонения. Должна содержать существительные или числительные. Не рекомендуется использовать другие части речи — платформа не сможет привести их к согласованной форме.ОписаниеСтроки— параметры локализации и пола. Формат:"Л=ru_RU; ПЛ=Мужской". Параметры разделяются;. Возможные значения:Л— код локализации (поддерживается толькоru_RU),ПЛ— пол (Мужской,Женский).ФорматнаяСтрока— параметры форматирования. Формат:"ПД=Родительный".ПД— падеж (Именительный,Родительный,Дательный,Винительный,Творительный,Предложный). Если не указан — склонение не выполняется.
Возвращаемое значение: Массив, содержащий возможные варианты склонения. Важно: это двумерный массив — каждый элемент сам является массивом вариантов (омонимы).
Правильный пример:
// Склонение ФИО в родительный падеж
Варианты = ПолучитьСклоненияСтроки(
"Иванов Иван Иванович",
"Л=ru_RU; ПЛ=Мужской",
"ПД=Родительный");
Если Варианты.Количество() > 0 И Варианты[0].Количество() > 0 Тогда
ФИО_Родительный = Варианты[0][0]; // "Иванова Ивана Ивановича"
КонецЕсли;
Ограничения:
- Работает только с локализацией
ru_RU. - Результат может быть непредсказуем — платформа не гарантирует единственно правильный вариант.
- Не склоняет прилагательные и причастия согласованно с существительными.
3.2. ПолучитьСклоненияСтрокиПоЧислу — числовое склонение (с оговорками)
Функция также доступна с 8.3.13. Но её поведение сильно отличается от того, что ожидают разработчики.
Синтаксис (6 параметров):
Массив ПолучитьСклоненияСтрокиПоЧислу(
СклоняемаяСтрока,
Число,
СклоняемыеЕдиницыИзмерения,
[ОписаниеСтроки],
[ФорматнаяСтрока],
[ФорматнаяСтрокаЧисла])
Ключевые моменты:
- Функция не возвращает готовую строку, а возвращает массив вариантов склонения.
- Параметры локализации (
Л) и падежа (ПД) передаются в 4-й параметр —ОписаниеСтроки. - Параметры формата числа (например,
ПЧ=Число) передаются в 5-й параметр —ФорматнаяСтрока. - При корректной настройке форматной строки (
ПЧ=Число) каждый элемент массива уже содержит число и слово в правильной форме. - Для корректной работы обязательно указывать локализацию
"Л=ru_RU"— иначе метод может вызвать ошибку при проверке АПК (код 1432).
Правильный пример:
// Получить форму слова "рабочий день" для числа 21
Варианты = ПолучитьСклоненияСтрокиПоЧислу(
"рабочий день",
21,
, // 3-й: единицы измерения
"Л=ru_RU; ПД=Именительный; ЧС=Количественное", // 4-й: ОписаниеСтроки
"ПЧ=Число"); // 5-й: ФорматнаяСтрока
Если Варианты.Количество() > 0 Тогда
Результат = Варианты[0]; // "21 рабочий день"
КонецЕсли;
Реальные проблемы:
- Для слова «посылка» с числом 1 функция может выдать «одна посылку» вместо «одну посылку».
- Результат непредсказуем для слов, которых нет во внутреннем словаре платформы.
- Поведение может меняться между релизами платформы.
Вывод: для простых и стандартных случаев (дни, месяцы, годы) можно попробовать. Для гарантированного результата — надёжнее своя функция.
3.3. БСП: СклонениеПредставленийОбъектов.ПросклонятьПредставление
Библиотека стандартных подсистем предоставляет общий модуль СклонениеПредставленийОбъектов.
Синтаксис:
Строка ПросклонятьПредставление(Представление, Падеж, Объект = Неопределено)
Параметры:
Представление— строка с ФИО или наименованием.Падеж— Число от 1 до 6 (1 — именительный, 2 — родительный, 3 — дательный, 4 — винительный, 5 — творительный, 6 — предложный). Передача перечисленияПеречисления.Падежине требуется — функция ожидает именно числовой код.Объект— ссылка на объект, реквизит которого склоняется (необязательный). Передаётся, когда нужно склонение в контексте конкретного объекта — например, должности сотрудника или наименования организации.
Правильный пример:
// Склонение должности в родительный падеж
Результат = СклонениеПредставленийОбъектов.ПросклонятьПредставление(
РуководительК.Должность,
2, // 2 — родительный падеж
РуководительК); // ссылка на объект-контекст
Ограничения:
- Работает только для ФИО и должностей, для которых в БСП есть словари.
- Не решает задачу числового склонения («1 день / 2 дня / 5 дней»).
- Требует наличия БСП в конфигурации.
- Для сложных случаев (например, «Генеральный директор») может не справиться без включённого сервиса morpher.ru.
3.4. Внешний компонент «Склонение ФИО» (Native API)
Для сложных случаев склонения ФИО (двойные фамилии, редкие имена) 1С выпустила внешний компонент Native API.
Правильное подключение для Native-версии:
ПодключитьВнешнююКомпоненту(
"ОбщийМакет.КомпонентаСклоненияФИО",
"Decl",
ТипВнешнейКомпоненты.Native);
Объект = Новый("AddIn.Decl.CNameDecl");
Ключевой момент: для Native API используется именно CNameDecl, а не NameDeclension (последний — для старой COM-версии).
3.5. Интернет-сервис morpher.ru
В конфигурации ЗУП 3.0, начиная с релиза 3.0.24, появилась возможность автоматического склонения наименований подразделений, должностей и позиций через сервис morpher.ru.
Примечание. Редакция ЗУП 3.0 снята с поддержки, однако интеграция с morpher.ru появилась именно в релизе 3.0.24 этой редакции. В актуальной редакции ЗУП 3.1 механизмы склонения развиваются на базе БСП.
Особенности:
- Работает только при включённой опции в разделе «Администрирование — Общие настройки».
- Требует подключения к интернету.
- Даже без интернета программа склоняет однословные должности и подразделения локально.
- Условия доступа к сервису могут быть платными.
3.6. Итоговая таблица: что выбрать
| Задача | Инструмент |
|---|---|
| Падежное склонение ФИО, должностей | ПолучитьСклоненияСтроки (3 параметра) или БСП ПросклонятьПредставление |
| Числовое склонение стандартных слов | ПолучитьСклоненияСтрокиПоЧислу (6 параметров; возвращает массив, но при ПЧ=Число содержит число и слово) |
| Числовое склонение с гарантией | Своя функция по остаткам от деления |
| Сложные случаи (двойные фамилии) | Внешний компонент CNameDecl или morpher.ru |
Часть 4. Своя функция числового склонения
Когда встроенные средства не дают гарантированного результата, надёжнее написать свою функцию. Она работает на любых релизах платформы (включая ниже 8.3.13) и даёт предсказуемый результат.
Базовый случай: «день»
// Возвращает правильную форму слов для указания количества дней:
// 1 календарный день, 2 календарных дня, 5 календарных дней
Функция СклонениеДней(Количество)
Остаток100 = Количество % 100;
Остаток10 = Количество % 10;
Если Остаток100 >= 11 И Остаток100 <= 14 Тогда
Результат = "календарных дней";
ИначеЕсли Остаток10 = 1 Тогда
Результат = "календарный день";
ИначеЕсли Остаток10 >= 2 И Остаток10 <= 4 Тогда
Результат = "календарных дня";
Иначе
Результат = "календарных дней";
КонецЕсли;
Возврат Результат;
КонецФункции
Порядок условий критичен. Если поменять проверку на 11–14 и проверку на остаток 1, для числа 11 сработает первое условие (остаток 1), и вернётся неправильная форма «11 день» вместо «11 дней».
Универсальная функция
// Возвращает правильную форму слова для указанного количества.
// ФормаЕд — форма для 1 (например, "день")
// Форма2_4 — форма для 2-4 (например, "дня")
// ФормаМн — форма для 5+ (например, "дней")
Функция СклонениеСлова(Количество, ФормаЕд, Форма2_4, ФормаМн)
Остаток100 = Количество % 100;
Остаток10 = Количество % 10;
Если Остаток100 >= 11 И Остаток100 <= 14 Тогда
Возврат ФормаМн;
ИначеЕсли Остаток10 = 1 Тогда
Возврат ФормаЕд;
ИначеЕсли Остаток10 >= 2 И Остаток10 <= 4 Тогда
Возврат Форма2_4;
Иначе
Возврат ФормаМн;
КонецЕсли;
КонецФункции
Функции-обёртки для популярных слов
Функция СклонениеДней(Количество)
Возврат СклонениеСлова(Количество, "календарный день",
"календарных дня", "календарных дней");
КонецФункции
Функция СклонениеСотрудников(Количество)
Возврат СклонениеСлова(Количество, "сотрудник", "сотрудника",
"сотрудников");
КонецФункции
Функция СклонениеМесяцев(Количество)
Возврат СклонениеСлова(Количество, "месяц", "месяца", "месяцев");
КонецФункции
Функция СклонениеЛет(Количество)
Возврат СклонениеСлова(Количество, "год", "года", "лет");
КонецФункции
Функция СклонениеРублей(Количество)
Возврат СклонениеСлова(Количество, "рубль", "рубля", "рублей");
КонецФункции
Часть 5. Особые случаи
5.1. Слова с двумя формами
Некоторые слова имеют только две формы. Например, «человек»: 1 человек, 2 человека, 5 человек, 21 человек. Для 2–4 и 5+ используется одна и та же форма:
Функция СклонениеЧеловек(Количество)
Возврат СклонениеСлова(Количество, "человек", "человека", "человек");
КонецФункции
5.2. Слово «сутки»
Слово «сутки» склоняется по особому правилу: «1 сутки», «2 суток», «5 суток», «21 сутки». Форма зависит от числа, но не по стандартной схеме. Для деловой документации это редкий случай, но если встречается — нужна отдельная функция.
5.3. Прилагательные
Слово «календарный» тоже склоняется. Важно: склоняйте словосочетание целиком, а не прилагательное и существительное по отдельности, иначе получите рассогласование («календарных день»).
5.4. Дробные числа
Для дробных чисел («1.5 дня», «2.5 дня») используется родительный падеж единственного числа — форма всегда одна:
Функция СклонениеДляДробного(Количество)
Если Цел(Количество) = Количество Тогда
Возврат СклонениеДней(Количество);
Иначе
Возврат "дня";
КонецЕсли;
КонецФункции
5.5. Ноль
Число 0 использует форму множественного числа: «0 дней», «0 сотрудников». Функция СклонениеСлова уже это учитывает.
Часть 6. Использование в печатных формах
Сценарий
«...продолжительностью 5 календарных дней с 10 по 14 марта 2026 года.»
«...продолжительностью 1 календарный день...»
Реализация
Шаг 1. Добавьте функцию СклонениеДней в модуль.
Шаг 2. В коде заполнения параметров:
Макет.Параметры.КоличествоДней = Формат(Выборка.КоличествоДней, "ЧГ=0")
+ " " + СклонениеДней(Выборка.КоличествоДней);
Шаг 3. В макете убедитесь, что после параметра нет слов «календарных дней»:
Правильно: ...продолжительностью [КоличествоДней].
Неправильно: ...продолжительностью [КоличествоДней] calendarных дней.
Иначе получится дублирование: «5 календарных дней календарных дней».
Часть 7. Использование в письмах
Заголовок = "Необходимо направить на обучение "
+ Формат(КоличествоСотрудников, "ЧГ=0") + " "
+ СклонениеСотрудников(КоличествоСотрудников) + ":"
+ Символы.ПС + Символы.ПС;
Часть 8. Тестирование
Набор тестовых значений
| Число | Ожидаемый результат |
|---|---|
| 0 | календарных дней |
| 1 | календарный день |
| 2 | календарных дня |
| 5 | календарных дней |
| 11 | календарных дней |
| 12 | календарных дней |
| 21 | календарный день |
| 22 | календарных дня |
| 111 | календарных дней |
| 121 | календарный день |
Простой тест
Процедура ТестСклоненияДней()
МассивПроверок = Новый Массив;
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
0, "календарных дней"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
1, "календарный день"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
2, "календарных дня"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
5, "календарных дней"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
11, "календарных дней"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
21, "календарный день"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
22, "календарных дня"));
МассивПроверок.Добавить(Новый Структура("Количество, Ожидаемое",
111, "календарных дней"));
Для Каждого Проверка Из МассивПроверок Цикл
Фактическое = СклонениеДней(Проверка.Количество);
Если Фактическое <> Проверка.Ожидаемое Тогда
Сообщить("ОШИБКА! Количество: " + Проверка.Количество
+ ", ожидалось: " + Проверка.Ожидаемое
+ ", получено: " + Фактическое);
КонецЕсли;
КонецЦикла;
Сообщить("Тест завершён.");
КонецПроцедуры
Часть 9. Подводные камни
| Ошибка | Суть | Решение |
|---|---|---|
| Забыли про 11–14 | Для 11 возвращается «день» вместо «дней» | Сначала проверять 11–14, потом остальное |
| Дублирование в макете | Форма и в коде, и в макете | Либо в коде, либо в макете |
| Порядок условий | 11 попадает в проверку на остаток 1 | Сначала исключения, потом всё остальное |
| Рассогласование прилагательных | «календарных день» | Склонять словосочетание целиком |
| Пропущенный ноль | Условие > 0 возвращает пустую строку для 0 |
По правилам — «0 дней» |
Варианты[0] вместо Варианты[0][0] |
Возвращается массив, а не строка | ПолучитьСклоненияСтроки возвращает массив массивов |
| Неверный ProgID | AddIn.NameDeclension для Native |
Для Native API — AddIn.Decl.CNameDecl |
| Игнорирование ограничений | Слепое доверие ПолучитьСклоненияСтрокиПоЧислу |
Результат может быть непредсказуем; для гарантии — своя функция |
Часть 10. Полезные советы
- Различайте числовое и падежное склонение. Для чисел — своя функция, для ФИО и должностей —
ПолучитьСклоненияСтрокиили БСП. - Проверяйте встроенные средства.
ПолучитьСклоненияСтрокиПоЧислуможно использовать для простых случаев, но результат не гарантирован. - Создайте общий модуль для функций склонения — так они будут доступны во всей конфигурации.
- Пишите юнит-тесты на все случаи — от 0 до 200. Используйте YAxUnit.
- Не путайте склонение и форматирование.
Формат(Число, "ЧГ=0")отвечает за внешний вид числа, склонение — за форму слова. - Храните формы в одном месте — заведите функцию-обёртку для каждого слова.
- Помните про 11–14 — самая частая ошибка в самодельных функциях.
- Проверяйте актуальность версий.
Заключение
Склонение в 1С — задача, которая кажется простой, но распадается на два принципиально разных типа:
- Числовое склонение («1 день / 2 дня / 5 дней») — встроенные функции платформы справляются ненадёжно. Для гарантированного результата нужна своя функция по остаткам от деления.
- Падежное склонение (ФИО, должности) — решается встроенными механизмами:
ПолучитьСклоненияСтроки(с 8.3.13), БСПСклонениеПредставленийОбъектовили внешним компонентомCNameDecl.
Ключевые выводы:
- Алгоритм «11–14» с остатками
% 100и% 10— работает на любых релизах и даёт предсказуемый результат. ПолучитьСклоненияСтрокивозвращает массив массивов, а не строку. Обращение —Варианты[0][0].ПолучитьСклоненияСтрокиПоЧислувозвращает массив вариантов; приПЧ=Числокаждый элемент содержит число и слово в правильной форме.- ProgID для Native API компоненты —
AddIn.Decl.CNameDecl, а неNameDeclension. - В типовых конфигурациях ЗУП 3.0 (начиная с релиза 3.0.24) для склонения должностей и подразделений опционально использовался morpher.ru. Редакция 3.0 снята с поддержки; в актуальной редакции ЗУП 3.1 механизмы склонения развиваются на базе БСП.
Приложение. Полный список форм для популярных слов
| Слово | 1 | 2–4 | 5+ |
|---|---|---|---|
| день | день | дня | дней |
| сотрудник | сотрудник | сотрудника | сотрудников |
| месяц | месяц | месяца | месяцев |
| год | год | года | лет |
| рубль | рубль | рубля | рублей |
| копейка | копейка | копейки | копеек |
| файл | файл | файла | файлов |
| документ | документ | документа | документов |
| запись | запись | записи | записей |
| строка | строка | строки | строк |
| задача | задача | задачи | задач |
| операция | операция | операции | операций |
| ошибка | ошибка | ошибки | ошибок |
| час | час | часа | часов |
| минута | минута | минуты | минут |
| заявка | заявка | заявки | заявок |
| счёт | счёт | счёта | счетов |
| платёж | платёж | платежа | платежей |
Вступайте в нашу телеграмм-группу Инфостарт