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

Склоняет число прописью до 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 не будет опубликован. Обязательные поля помечены *