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

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

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

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

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

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

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


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


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

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

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

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

Read Full Article