При формировании печатных форм документов (договоров, актов, накладных) часто возникает задача вывести количество товара или услуг прописью, причем так, чтобы связанное с ним существительное (номенклатура или единица измерения) было согласовано в правильном падеже и числе. Например, для числа 2 система должна выводить "два шкафа", а для 10 — "десять шкафов". Подобная задача часто ставит в тупик начинающих разработчиков, которые пытаются решить её громоздкими конструкциями Если... Тогда... ИначеЕсли.
В этой статье мы подробно разберем четыре различных способа решения этой задачи: от классического использования встроенной функции платформы ЧислоПрописью до современных интеллектуальных методов платформы 8.3.14+ и механизмов Библиотеки стандартных подсистем (БСП).
Самый простой, надежный и проверенный временем способ — использовать встроенную функцию платформы ЧислоПрописью(). Платформа 1С:Предприятие обладает мощным встроенным механизмом локализации и склонения чисел. Главное — правильно передать ей параметры предмета исчисления в третьем параметре функции.
Рассмотрим структуру форматной строки для описания предмета исчисления. Она представляет собой строку, в которой через запятую указываются параметры в следующем порядке:
Разберем конкретный пример кода для мужского рода (номенклатура "шкаф"):
Количество = 2;
ФорматПредмета = "шкаф, шкафа, шкафов, м, , , , , 0";
Результат = ЧислоПрописью(Количество, "Л=ru_RU", ФорматПредмета);
// Результат: "Два шкафа"
Количество = 10;
Результат = ЧислоПрописью(Количество, "Л=ru_RU", ФорматПредмета);
// Результат: "Десять шкафов"
А теперь посмотрим, как это будет работать для женского рода, например, для единицы измерения "коробка":
Количество = 21;
ФорматПредмета = "коробка, коробки, коробок, ж, , , , , 0";
Результат = ЧислоПрописью(Количество, "Л=ru_RU", ФорматПредмета);
// Результат: "Двадцать одна коробка"
Для того чтобы сделать этот механизм динамическим, параметры склонения целесообразно хранить непосредственно в справочнике КлассификаторЕдиницИзмерения. Добавив туда соответствующие реквизиты (НаименованиеОдин, НаименованиеДва, НаименованиеПять, Род), мы сможем формировать форматную строку "на лету" для любой номенклатурной позиции.
Начиная с версии платформы 8.3.14, разработчикам стал доступен встроенный системный метод ПолучитьСклоненияСтрокиПоЧислу(). Этот метод позволяет полностью отказаться от ручного прописывания окончаний и хранения форм слов в базе данных.
Платформа автоматически обращается к системному словарю склонений и формирует грамматически верное словосочетание. Посмотрим, как использовать этот метод на практике:
// Для числа 2
Результат2 = ПолучитьСклоненияСтрокиПоЧислу("шкаф", 2, , "ЧС=Количественное", "ПД=Именительный; ПЧ=ЧислоПрописью")[0];
// Результат: "два шкафа"
// Для числа 10
Результат10 = ПолучитьСклоненияСтрокиПоЧислу("шкаф", 10, , "ЧС=Количественное", "ПД=Именительный; ПЧ=ЧислоПрописью")[0];
// Результат: "десять шкафов"
Проанализируем ключевые параметры этого метода:
"шкаф", "услуга", "килограмм")."Количественное" выводит "два", а "Порядковое" преобразует фразу в "второй"."ЧислоПрописью") или цифрами ("Число").Данный метод работает "из коробки", поддерживает сложные словосочетания (например, "новый шкаф" превратится в "два новых шкафа") и избавляет программиста от рутинной работы со словарями.
Если вы работаете в типовой конфигурации 1С (например, 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия), то в вашем распоряжении есть готовые функции Библиотеки стандартных подсистем (БСП). В современных версиях БСП для корректного вывода чисел с существительными применяется мультиязычный подход.
Для этих целей используется функция СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(). Она работает на основе шаблонов ICU (International Components for Unicode). Посмотрим на пример реализации:
Шаблон = ";%1 шкаф;;%1 шкафа;%1 шкафов;%1 шкафа";
Количество = 5;
Результат = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Количество);
// Результат: "5 шкафов"
Если же вам требуется получить исключительно текстовое представление числа прописью вместе с единицей измерения, в БСП часто используется интеграция со встроенным сервисом склонения представлений объектов. Это позволяет централизованно управлять падежами и склонениями в рамках всей информационной системы.
Иногда возникают ситуации, когда технически сложно или экономически нецелесообразно настраивать справочники склонений (например, при интеграции со сторонними устаревшими системами, где нет БСП и современных платформ). В этом случае опытные разработчики применяют "обходной маневр" — нормализацию структуры выводимого текста.
Вместо того чтобы пытаться согласовать фразу в виде "Выдать десять кочерёг", предложение перестраивается таким образом, чтобы существительное всегда оставалось в именительном падеже единственного или множественного числа, а число выводилось в скобках. Разберем примеры такой перефразировки:
Такой подход полностью снимает проблему лингвистических исключений русского языка и гарантирует отсутствие грамматических ошибок в печатных формах документов без написания сложного программного кода.
Для демонстрации того, насколько коварным может быть русский язык при склонении существительных с числительными, в сообществе разработчиков 1С часто вспоминают классический рассказ Михаила Зощенко "Кочерга". В нем директор учреждения пытался составить требование на получение пяти инструментов и столкнулся с непреодолимым препятствием: как правильно написать — "пять кочерг", "пять кочерёг" или "пять кочерыжек"?
В итоге, чтобы обойти сложнейшее лингвистическое препятствие, юридический отдел составил документ хитрым образом: "До сего времени наше учреждение, имея шесть печей, обходилось всего лишь одной кочергой. В силу этого просьба выдать еще пять штук, для того чтобы на каждую печку имелась бы одна самостоятельная кочерга...".
Использование современных встроенных функций 1С, таких как ПолучитьСклоненияСтрокиПоЧислу() или правильно настроенных параметров в ЧислоПрописью(), позволяет современному программисту не повторять ошибок героев Зощенко и решать подобные задачи за считанные минуты.