Склонение числа прописью

Склоняет число прописью до 999999
Пример: до склонения «Не позднее 3 (Три) дней», после — «Не позднее 3 (Трех) дней»

Столкнулся с тем, что число дней в договоре необходимо указывать в склонении (например, 3 (Трех) дней), перекопал инет и мануал 1С-ный, ничего не нашел. Может, я слепой или не там искал, не суть. 

Накатал склонялку, реализовал до 999999, т.к. более не нужно. Можно посмотреть, как сделано, и добавить, кому надо, и больше, добавляем слово в структуру и его аналог, в общем, все просто.

Работает так: у функции на входе число прописью, обработанное стандартной функцией 1С ЧислоПрописью(…)

На выходе склоненное или, если не удалось, то, что передали.

Тестил так: от балды вбивал всякие числа — склоняет.

Вот код, может, кому пригодится.

Функция ПолучитьСтруктуруСклонени(ЧислоПрописью)
ЧислоПрописью = СокрЛП(ЧислоПрописью);

ПадежРодительный = новый структура;
ПадежРодительный.Вставить("Один","Одного");
ПадежРодительный.Вставить("Два","Двух");
ПадежРодительный.Вставить("Три","Трех");
ПадежРодительный.Вставить("Четыре","Четырех");
ПадежРодительный.Вставить("Пять","Пяти");
ПадежРодительный.Вставить("Шесть","Шести");
ПадежРодительный.Вставить("Семь","Семи");
ПадежРодительный.Вставить("Восемь","Восьми");
ПадежРодительный.Вставить("Девять","Девяти");
ПадежРодительный.Вставить("Десять","Десяти");
ПадежРодительный.Вставить("Одиннадцать","Одиннадцати");
ПадежРодительный.Вставить("Двенадцать","Двенадцати");
ПадежРодительный.Вставить("Тринадцать","Тринадцати");
ПадежРодительный.Вставить("Четырнадцать","Четырнадцати");
ПадежРодительный.Вставить("Пятнадцать","Пятнадцати");
ПадежРодительный.Вставить("Шестнадцать","Шестнадцати");
ПадежРодительный.Вставить("Семнадцать","Семнадцати");
ПадежРодительный.Вставить("Восемнадцать","Восемнадцати");
ПадежРодительный.Вставить("Девятнадцать","Девятнадцати");
ПадежРодительный.Вставить("Двадцать","Двадцати");
ПадежРодительный.Вставить("Тридцать","Тридцати");
ПадежРодительный.Вставить("Сорок","Сорока");
ПадежРодительный.Вставить("Пятьдесят","Пятидесяти");
ПадежРодительный.Вставить("Шестьдесят","Шестидесяти");
ПадежРодительный.Вставить("Семьдесят","Семидесяти");
ПадежРодительный.Вставить("Восемьдесят","Восьмидесяти");
ПадежРодительный.Вставить("Девяносто","Девятоста");
ПадежРодительный.Вставить("Сто","Ста");
ПадежРодительный.Вставить("Двести","Двухсот");
ПадежРодительный.Вставить("Триста","Трехсот");
ПадежРодительный.Вставить("Четыреста","Четырехсот");
ПадежРодительный.Вставить("Пятьсот","Пятисот");
ПадежРодительный.Вставить("Шестьсот","Шестисот");
ПадежРодительный.Вставить("Семьсот","Семисот");
ПадежРодительный.Вставить("Восемьсот","Восьмисот");
ПадежРодительный.Вставить("Девятьсот","Девятисот");
ПадежРодительный.Вставить("Тысяча","Тысячи");
ПадежРодительный.Вставить("Одна","Одной");
ПадежРодительный.Вставить("Две","Двух");
ПадежРодительный.Вставить("Тысяч","Тысяч");
ПадежРодительный.Вставить("Тысячи","Тысяч");


МассивСлов = новый массив;
готово = ложь;
ПервоеСлово = Истина;
НовоеСлово = "";
Перваябуква = "";
Вырезка= "";
ВернутьОшибка = ЧислоПрописью;
Пока НЕ Готово Цикл
НайденноеЗначение = "";
НайденныйПробел = Найти(ЧислоПрописью," ");
Если НайденныйПробел = 0 Тогда
Если ПервоеСлово Тогда
Если ПадежРодительный.Свойство(ЧислоПрописью, НайденноеЗначение) Тогда
Возврат НайденноеЗначение;
Иначе
Возврат ВернутьОшибка;
КонецЕсли;
Иначе
Вырезка = СокрЛП(ЧислоПрописью);
Перваябуква = Врег(ЛЕВ(Вырезка,1));
ЧислоПрописью = Перваябуква + Прав(Вырезка,СтрДлина(Вырезка)-1);

Если ПадежРодительный.Свойство(ЧислоПрописью, НайденноеЗначение) Тогда
НайденноеЗначение = НРЕГ(НайденноеЗначение);
НовоеСлово = НовоеСлово + НайденноеЗначение + " ";
Возврат сОКРлп(НовоеСлово);
Иначе
Возврат ВернутьОшибка;
КонецЕсли;

КонецЕсли;
Иначе
Вырезка = СокрЛП(ЛЕВ(ЧислоПрописью,НайденныйПробел));
Перваябуква = Врег(ЛЕВ(Вырезка,1));
Вырезка = Перваябуква + Прав(Вырезка,СтрДлина(Вырезка)-1);
Если ПадежРодительный.Свойство(Вырезка, НайденноеЗначение) Тогда
Если ПервоеСлово Тогда
НовоеСлово = НовоеСлово + НайденноеЗначение + " ";
первоеСлово = Ложь;
ЧислоПрописью = СокрЛП(Прав(ЧислоПрописью,СтрДлина(ЧислоПрописью)-НайденныйПробел));
Иначе
НовоеСлово = НовоеСлово + НРЕГ(НайденноеЗначение) + " ";
ЧислоПрописью = СокрЛП(Прав(ЧислоПрописью,СтрДлина(ЧислоПрописью)-НайденныйПробел));

КонецЕсли;
Иначе
Возврат ВернутьОшибка;
КонецЕсли;
КонецЕсли;

КонецЦикла;

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

19 Comments

  1. ZOMI

    Уж если так важна каждая буковка в договоре — не быстрее ли договор поправить на «не позднее чем за 3(Три) дня» ?

    Reply ↓
  2. maxvcb

    (1) ZOMI, мне не важна юристам важна. Меня попросили я сделал разговоры разговаривать не в моих правилах.

    Reply ↓
  3. Fragster

    Есть хорошая универсальная штука (в договорах, например, еще есть пункты типа «в лице генерального директора, действующего на основании устава«, где выделенные куски также должны браться из базы) http://infostart.ru/public/330103/

    Reply ↓
  4. maxvcb

    (3) Fragster, склоняет таки, не посмотрел код сразу, приношу извинения. Ну дело то добровольное, у меня код по проще. Я выложил не хотите не берите че минусовать то.

    Reply ↓
  5. Артано

    Я для данной задачи использовал типовую склонялку, склоняющую рубли. Просто вместо слова рубль используется день 🙂

    Reply ↓
  6. maxvcb

    (6) Артано, чет не понятно, тут склоняются не Дни а Числа.

    Reply ↓
  7. maxvcb

    что за люди такие, пишут не в тему еще и минусы ставят. Любители покакать в коментариях

    Reply ↓
  8. Terve!R

    (11) ты бы еще склонять через morpher.ru предложил)

    Если конфа на БСП, то конечно лучше разобраться и типовые функции склонения использовать. Но тут кажется весьма универсальный для данной задачи велосипед получился, пусть будет 🙂

    Reply ↓
  9. maxvcb

    (11) Артано, перечитал, тут либо я дурак либо одно из двух.

    Типовая склонялка это ЧислоПрописью(СрЭск,,»,мр1,мр2,мр3,р,жр1,жр2,жр3,ж.0″);

    где мр и жр это варианты числа

    типа рубля, рублей.Рублев

    и выдает она

    Семь тысяч Двести Тридцать ддва рубля, ты Ркбли поменял на дни иии?

    Когда мой велосипед склоняет Семь тысяч Двести Тридцать ДВа в Семи тысяч Тридцати двух и по х** чего рублей дне колес насосов.

    Ну и?

    Reply ↓
  10. Svasily

    Опечатка : Девятоста

    А в остальном, спасибо.

    Reply ↓
  11. ДмитрийС

    (11) Соглашусь с автором, не совсем понятно, как вы собирались стандартным механизмом склонять числительные? Ведь речь идет как раз об этом, а не о «днях, рублях и т.д.»

    Если это было не голословное утверждение, то просьба привести пример, дабы всех поставить на место.

    Reply ↓
  12. Tomy82

    спасибо, утащил, то, что надо

    Reply ↓
  13. maxvcb

    (17) ага в точности то же самое, а это я так от нефик делать писал =)))

    Reply ↓
  14. maxvcb

    (19) ну почитайте переписку выше мы уже это обсудили, что типовая склонялка немного не так работает как эта, поэтому эта и была мной написана. Примерно то же самое, но не то же.

    Reply ↓
  15. maxvcb

    (21) я извиняюсь не обратил внимания на имя функции.

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

    Reply ↓
  16. maxvcb

    (23) не имею времени на бессмысленную переписку. во первых мой пост вышел по времени ранее чем функция вами описываемая появилась на платформе 1с(статья из ссылки дата и дата моего поста).

    во вторых я вам отвечаю что это что то похожее так же как красный ремень для синих джинсов и синий ремень для красных. СП я глянул остаюсь при своем.

    Reply ↓
  17. zinnaz

    maxvcb, спасибо, что поделились разработкой, вещь полезная.

    Reply ↓
  18. user1040609

    Большое спасибо, очень помогли, единственно на вход пришлось подавать очищенное от нулей на конце, иначе ошибку било

    Reply ↓
  19. Mad_117

    Красавелло! Зело помог!

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *