Формы предмета исчисления

13.05.14

Разработка - Универсальные функции

Иногда возникает задача склонения предмета исчисления, но ее не пытаются решить правильно. Есть простое решение.

Задача.

Например, необходимо в интерфейсе отображать количество проданных за день яблок естественной фразой "Продано 1 яблоко" ("Продано 2 яблока", "Продано 5 яблок"). Обращаю внимание, что количество проданных яблок указывается числом, а не прописью.

Неправильные решения.

Обычно необходимость склонения предмета исчисления обходят следующими способами:

- Игнорирование.
В итоге получаем "Продано 1 яблоков" или "Продано 2 яблоко".

- Использование сокращений.
В итоге получаем "Продано 3 ябл."

- Использование всех форм сразу.
В итоге получаем "Продано 3 яблоко(ка,ок)" или "Продано 7 яблоко/яблока/яблок"

- Использование только одной формы.
В итоге получаем "Продано яблок: 3"

Последний вариант выглядит неплохо, но не всегда есть возможность использовать его.

Правильное решение.

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

Функция ПолучитьФормуПредметаИсчисления(Количество, Форма1, Форма2, Форма5) Экспорт
    
    Перем Формы, К;    
    
    Формы = Новый Массив();
    Формы.Добавить(Форма1);
    Формы.Добавить(Форма2);
    Формы.Добавить(Форма5);
    
    К = ?(Количество >= 0, Количество, -Количество);
    
    ИндексФормы = ?(К%10 = 1 И К%100 <> 11, 0, ?(К%10 >= 2 И К%10 = 20), 1, 2));
    
    Возврат Формы[ИндексФормы];
    
КонецФункции

В описанном примере решение может быть следующим.

"Продано " + Продано + " " + ПолучитьФормуПредметаИсчисления(Продано, "яблоко", "яблока", "яблок")

Для того, чтобы правильно определить каждую из трех форм, вы должны проговорить их для 1, 2 и 5 - этого будет достаточно.

Если потребуется определять форму предмета исчисления для других языков, то формулы можно подсмотреть здесь.

Заключение.

Старался быть кратким. Спасибо за внимание.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4827    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9027    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    57918    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8138    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    72665    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10113    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ndochp 104 14.05.14 10:09 Сейчас в теме
А в 1С это разве не через Сумма прописью логично сделать?
kostik_love; +1 Ответить
2. Stety 153 14.05.14 11:23 Сейчас в теме
По аналогии с "ленивыми голубцами" это сойдет. Мы же все хотим побыстрее. Но и юзер тоже хочет побыстрее. Надо оно ему: каждый раз падежи вбивать? А программист на что?
На самом деле, если уж перекладывать ответственность за грамотность документов на юзера, то надо предусмотреть реквизиты для хранения наименований в падежах стоило бы во всех справочниках. Однако, как это раздует базу? Вот в чем вопрос...
3. lrs 27 14.05.14 23:44 Сейчас в теме
Я так делал:
СтрЗаменить(ЧислоПрописью(Продано,"","яблоко, яблока, яблок,,,,,,0"), ЧислоПрописью(Продано,"",",,,,,,,,0"), "")
BigB; romankoav; AlX0id; zqzq; ВРедная; userGJ; jsuh; rtnm; +8 Ответить
4. kostik_love 317 17.05.14 13:54 Сейчас в теме
Задача: 1 рубль, 3 рубля, 5 рублей
- Вы тоже так будете решать)?
5. rtnm 618 18.05.14 18:42 Сейчас в теме
(4) kostik_love, да, а вы как?
6. kostik_love 317 19.05.14 12:35 Сейчас в теме
(5) я попробую так- как это сделано в типовых
7. dima_gsv 24 01.09.15 12:24 Сейчас в теме
(6) kostik_love, в типовых сделано как писал (3) lrs. На мой взгляд, не очень читаемо получается.
Для отправки сообщения требуется регистрация/авторизация