Почему функция СтрокаСЧислом в 1С не отображает число 0 и как правильно настроить склонение числительных?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Функция СтрокаСЧислом, появившаяся в платформе 1С:Предприятие 8.3 (начиная с версии 8.3.10.2168), значительно упростила жизнь разработчикам, позволив автоматически склонять существительные в зависимости от числительного. Больше не нужно писать громоздкие конструкции Если...ИначеЕсли для выбора между «1 элемент», «2 элемента» и «5 элементов». Однако при работе с этой функцией программисты часто сталкиваются с тем, что вместо ожидаемого «0 элементов» система выводит пустую строку или просто пробел. Разберем детально, почему это происходит и как правильно настроить вывод.

Разберем механизм работы функции

Для начала проанализируем синтаксис функции СтрокаСЧислом. Она принимает следующие параметры:

  1. ИсходнаяСтрока: Шаблон, содержащий формы слова, разделенные точкой с запятой.
  2. Число: Само значение, которое нужно подставить.
  3. ВидЧисловогоЗначения: Перечисление (Количественное или Порядковое).
  4. ФорматнаяСтрока (необязательный): Строка форматирования для самого числа.

Согласно документации, в шаблоне может быть до 6 категорий, которые идут строго в определенном порядке: Ноль, Один, Два, Немного, Много, Другое. В тексте шаблона символ %1 используется как маркер, куда платформа подставит отформатированное число.

Выясним причину «исчезновения» нуля

Проанализируем ситуацию: разработчик пишет код, ожидая, что для числа 0 сработает самая первая категория шаблона. Однако в русском языке логика работы с числительными опирается на международный стандарт Unicode CLDR. Рассмотрим важные нюансы:

Нюанс 1. Распределение категорий для русского языка. В русском языке категория «Ноль» (ZERO) для целых чисел фактически не используется. Число 0 грамматически относится к категории «Много» (MANY), так же как числа 5, 10, 20 или 100. Поэтому, когда вы передаете 0, система обращается к 5-й позиции в вашей строке шаблона (категория «Много»), а не к 1-й.

Нюанс 2. Представление нулевого значения по умолчанию. Это главная причина проблемы. В платформе 1С представление числа 0 по умолчанию — это пустая строка. Если не указать параметры форматирования, то вместо %1 подставится пустота. Именно поэтому вместо «0 элементов» получается « элементов».

Решение проблемы: использование форматной строки

Чтобы число 0 отображалось корректно, мы должны явно указать платформе, как форматировать число внутри функции. Для этого используется четвертый параметр функции СтрокаСЧислом. Рассмотрим правильный подход.

Нам необходимо передать форматную строку ЧН=0. Этот параметр сообщает системе: «Если значение равно нулю, выведи символ 0». Также полезно добавить ЧГ=, чтобы отключить группировку разрядов (чтобы число 1000 не превратилось в "1 000" с неразрывным пробелом, если это не требуется).

Посмотрим на пример правильной реализации:


Количество = 0;
Шаблон = "Ноль: %1 элементов;Один: %1 элемент;Два: %1 элемента;Немного: %1 элемента;Много: %1 элементов;Другое: %1 элемента";
Результат = СтрокаСЧислом(Шаблон, Количество, ВидЧисловогоЗначения.Количественное, "ЧН=0; ЧГ=");
Сообщить(Результат); 
// Выведет: Много: 0 элементов

Рассмотрим структуру шаблона подробнее

Для русского языка (локаль "ru") распределение чисел по категориям в СтрокаСЧислом выглядит так:

  1. Ноль (позиция 1): Не используется для целых чисел.
  2. Один (позиция 2): Для чисел, оканчивающихся на 1 (кроме 11). Пример: 1, 21, 101.
  3. Два (позиция 3): Не используется в русском языке (используется в других языках, например, в арабском).
  4. Немного (позиция 4): Для чисел, оканчивающихся на 2, 3, 4 (кроме 12, 13, 14). Пример: 2, 3, 4, 22, 34.
  5. Много (позиция 5): Для чисел, оканчивающихся на 0, 5-9, а также на 11-14. Именно сюда попадает 0!
  6. Другое (позиция 6): Используется для дробных чисел или как резервный вариант.

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


// Шаблон: ; %1 элемент; ; %1 элемента; %1 элементов; %1 элемента
Текст = СтрокаСЧислом(";%1 элемент;;%1 элемента;%1 элементов;%1 элемента", 
    ЧислоДляВывода, 
    ВидЧисловогоЗначения.Количественное, 
    "ЧН=0");

Типичные ошибки при использовании

Проанализируем типичную ошибку, которую часто совершают разработчики, пытаясь «вручную» отформатировать число перед передачей в функцию. Посмотрим на некорректный код:


// ОШИБКА: Попытка вставить Формат() внутрь функции СтрокаСЧислом
Результат = СтрокаСЧислом("Выгружено: %1 элементов...", 0, ВидЧисловогоЗначения.Количественное, Формат(0, "ЧН=0"));

Почему это неправильно? Четвертый параметр функции СтрокаСЧислом должен быть именно строкой формата (как второй параметр функции Формат), а не результатом работы функции Формат. Система сама применит это форматирование к числу, переданному во втором параметре.

Полезные советы по использованию

1. Производительность. Использование СтрокаСЧислом предпочтительнее собственных функций склонения на встроенном языке. Эта функция реализована на уровне платформы (на C++), что делает ее работу максимально быстрой, особенно в высоконагруженных отчетах или при формировании больших списков.

2. Интернационализация. Если ваша конфигурация используется в разных странах, СтрокаСЧислом — единственный верный способ работы с грамматикой. Платформа сама определит правила склонения (например, для английского языка), основываясь на локали текущего сеанса пользователя, без изменения программного кода.

3. Дробные числа. Помните, что для дробных чисел (0.5, 1.0) в русском языке почти всегда используется категория «Другое» (6-я позиция). Если вы выводите вес или объем, обязательно заполняйте последнюю часть шаблона.

Подводя итог, для корректного отображения нуля всегда добавляйте четвертый параметр "ЧН=0". Это обеспечит предсказуемый результат и профессиональный вид интерфейса вашей программы.

← На главную