Дата прописью

1. Оле-Олеся 6 31.01.12 10:28 Сейчас в теме
Подскажите, есть ли такая функция (на ИТС или еще где-нибудь)? Нужно дату вывести в виде "тридцатое января две тысячи двенадцатого года".
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. userrxx 31.01.12 10:30 Сейчас в теме
я пользуюсь вот этой

// Функция Дата прописью
// Параметры:
// ДП - Дата
// Возвращаемое значение:
// дата прописью
//
// Модификация для v8: Evgeny Migachev
Функция ДатаПрописью(ДП) Экспорт
стрРез = "";
Д=Формат(ДП,"ДЛФ=D");
спсМес = Новый СписокЗначений;
спсМес.Добавить("января");
спсМес.Добавить("февраля");
спсМес.Добавить("марта");
спсМес.Добавить("апреля");
спсМес.Добавить("мая");
спсМес.Добавить("июня");
спсМес.Добавить("июля");
спсМес.Добавить("августа");
спсМес.Добавить("сентября");
спсМес.Добавить("октября");
спсМес.Добавить("ноября");
спсМес.Добавить("декабря");

спсЧисл = Новый СписокЗначений;
спсЧисл.Добавить("первое","первого");
спсЧисл.Добавить("второе","второго");
спсЧисл.Добавить("третье","третьего");
спсЧисл.Добавить("четвертое","четвертого");
спсЧисл.Добавить("пятое","пятого");
спсЧисл.Добавить("шестое","шестого");
спсЧисл.Добавить("седьмое","седьмого");
спсЧисл.Добавить("восьмое","восьмого");
спсЧисл.Добавить("девятое","девятого");

//числительные им.падеж
спсЧислИм = Новый СписокЗначений;
спсЧислИм.Добавить("тысяча","тысячного");
спсЧислИм.Добавить("две тысячи","двухтысячного");
спсЧислИм.Добавить("три тысячи","трехтысячного");
спсЧислИм.Добавить("четыре тысячи","четырёхтысячного");
спсЧислИм.Добавить("пять","пятитысячного");
спсЧислИм.Добавить("шесть","шеститысячного");
спсЧислИм.Добавить("семь","семитысячного");
спсЧислИм.Добавить("восемь","восьмитысячного");
спсЧислИм.Добавить("девять","девятитысячного");

спсСотни = Новый СписокЗначений;
спсСотни.Добавить("сто");
спсСотни.Добавить("двести");
спсСотни.Добавить("триста");
спсСотни.Добавить("четыреста");
спсСотни.Добавить("пятьсот");
спсСотни.Добавить("шестьсот");
спсСотни.Добавить("семьсот");
спсСотни.Добавить("восемьсот");
спсСотни.Добавить("девятьсот");

//десятки им.падеж
спсДесИм = Новый СписокЗначений;
спсДесИм.Добавить("","десятого");
спсДесИм.Добавить("двадцать","двадцатого");
спсДесИм.Добавить("тридцать","тридцатого");
спсДесИм.Добавить("сорок","сорокового");
спсДесИм.Добавить("пятьдесят","пятидесятого");
спсДесИм.Добавить("шестьдесят","шестидесятого");
спсДесИм.Добавить("семьдесят","семидесятого");
спсДесИм.Добавить("восемьдесят","восьмидесятого");
спсДесИм.Добавить("девяносто","девяностого");

//субдесятки род.падеж
спсСубДесРод = Новый СписокЗначений;
спсСубДесРод.Добавить("одиннадцатого");
спсСубДесРод.Добавить("двенадцатого");
спсСубДесРод.Добавить("тринадцатого");
спсСубДесРод.Добавить("четырнадцатого");
спсСубДесРод.Добавить("пятнадцатого");
спсСубДесРод.Добавить("шестнадцатого");
спсСубДесРод.Добавить("семнадцатого");
спсСубДесРод.Добавить("восемнадцатого");
спсСубДесРод.Добавить("девятнадцатого");

спсДес = Новый СписокЗначений;
спсДес.Добавить("десятое");
спсДес.Добавить("двадцатое","двадцать");
спсДес.Добавить("тридцатое","тридцать");
спсДес.Добавить("сороковое","тридцать");
спсДес.Добавить("пятидесятое","тридцать");
спсДес.Добавить("шестидесятое","тридцать");
спсДес.Добавить("семидесятое","тридцать");

спсСубДес = Новый СписокЗначений;
спсСубДес.Добавить("одиннадцатое");
спсСубДес.Добавить("двенадцатое");
спсСубДес.Добавить("тринадцатое");
спсСубДес.Добавить("четырнадцатое");
спсСубДес.Добавить("пятнадцатое");
спсСубДес.Добавить("шестнадцатое");
спсСубДес.Добавить("семнадцатое");
спсСубДес.Добавить("восемнадцатое");
спсСубДес.Добавить("девятнадцатое");

спсДаты = СтрЗаменить(СокрЛП(Д),".",Символы.ПС);
//разбираем день
стрДень = СокрЛП(Число(СтрПолучитьСтроку(спсДаты,1)));
Если СтрДлина(стрДень)=1 Тогда
стрДень = спсЧисл.Получить(Число(стрДень)-1).Значение;
Иначе
десДень = Число(Лев(стрДень,1));
едДень = Число(Прав(стрДень,1));

Если едДень=0 Тогда
стрДень = спсДес.Получить(десДень-1).Значение;
Иначе
Если десДень>1 Тогда
т = Строка(спсДес.Получить(десДень-1));
стрДень = т+" "+Строка(спсЧисл.Получить(едДень-1).Значение);
Иначе
стрДень = спсСубДес.Получить(едДень-1).Значение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
//разбираем месяц
стрМес = спсМес.Получить(Число(СтрПолучитьСтроку(спсДаты,2))-1).Значение;

//разбираем год
стрГод = СтрПолучитьСтроку(спсДаты,3);
длинаГода = СтрДлина(стрГод);
Если длинаГода=4 Тогда
тыс = Сред(стрГод,1,1); сот = Сред(стрГод,2,1); дес = Сред(стрГод,3,1); ед = Сред(стрГод,4,1);
_т = спсЧислИм.Получить(Число(тыс)-1).Значение;
Если (Число(сот)=0) и (Число(дес)=0) и (Число(ед)=0) Тогда
миллениум = Строка(спсЧислИм.Получить(Число(тыс)-1));
стрГод = миллениум;
Иначе
с = ""; дс = ""; е = "";
Если Число(сот)<>0 Тогда
с = спсСотни.Получить(Число(сот)-1).Значение;
КонецЕсли;
Если Число(дес)<>0 Тогда
Если Число(ед)=0 Тогда
дг = Строка(спсДесИм.Получить(Число(дес)-1));
дс = дг;
Иначе
дс = спсСубДесРод.Получить(Число(ед)-1).Значение;
КонецЕсли;
КонецЕсли;
Если (Число(дес)>1) или (Число(дес)=0) Тогда
Если Число(ед)<>0 Тогда
е =Строка(спсЧисл.Получить(Число(ед)-1));
КонецЕсли;
КонецЕсли;
стрГод = Строка(_т)+" "+Строка(с)+" "+Строка(дс)+" "+Строка(е);
КонецЕсли;
Иначе

КонецЕсли;
стрГод = стрГод+" года";
стрГод = СтрЗаменить(стрГод," "," ");
стрРез = Строка(стрДень)+" "+Строка(стрМес)+" "+Строка(стрГод);
стрРез = СтрЗаменить(стрРез," "," ");
Возврат стрРез;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
сообщить(ДатаПрописью(РеквизитДатаНаФорме));
КонецПроцедуры
criptid; ReDvAlL; waizz; Bukaska; ЛИК1111; Оле-Олеся; +6 Ответить
9. a.russkikh 10 04.03.21 14:53 Сейчас в теме
(2)Не корректно работает с 21 годом
10. oleg1979 33 09.03.21 13:19 Сейчас в теме
(2) для 21 года
нужно заменить строку
дс = спсСубДесРод.Получить(Число(ед)-1).Значение; 

на
Если Число(дес) <= 1 Тогда 
	дс = спсСубДесРод.Получить(Число(ед)-1).Значение; 
Иначе
	дс = спсДесИм.Получить(Число(ед)).Значение; 
КонецЕсли;
11. a.russkikh 10 10.03.21 08:38 Сейчас в теме
(10) В этом случае не корректно 22 год отображает и т.д.
12. Barmi 4 18.04.21 13:02 Сейчас в теме
(11)
А так:
//МПЕ+
//дс = спсСубДесРод.Получить(Число(ед)-1).Значение;
Если Число(дес)=1 Тогда
	дс=спсСубДесРод.Получить(Число(ед)-1).Значение;
Иначе
	дс=спсДесИм.Получить(Число(дес-1)).Значение;
КонецЕсли; 
//МПЕ-
a.russkikh; +1 Ответить
3. Tyler Durden 31.01.12 10:45 Сейчас в теме
Одна компания на собеседовании дает тест на написание данной функции :)
5. Оле-Олеся 6 31.01.12 10:52 Сейчас в теме
userrxx, спасибо!

Tyler Durden, да написать-то могу, но это же время...
Просто удивительно, что такой функции нет по-умолчанию. ЧислоПрописью() же есть:)
6. Tyler Durden 31.01.12 11:00 Сейчас в теме
Ни в коей мере не ставлю под сомнения Ваши способности. Эта была констатация факта.
7. Sasha255n 26.11.13 11:29 Сейчас в теме
Очень помогла большое спасибо
8. serega3333 26.11.13 15:04 Сейчас в теме
// Функция Дата прописью
// Параметры:
// ДП - Дата
// Возвращаемое значение:
// дата прописью
//
// Модификация для v8: Evgeny Migachev
Функция ДатаПрописью(ДП) Экспорт
стрРез = "";
Д=Формат(ДП,"ДЛФ=D");
спсМес = Новый СписокЗначений;
спсМес.Добавить("января");
спсМес.Добавить("февраля");
спсМес.Добавить("марта");
спсМес.Добавить("апреля");
спсМес.Добавить("мая");
спсМес.Добавить("июня");
спсМес.Добавить("июля");
спсМес.Добавить("августа");
спсМес.Добавить("сентября");
спсМес.Добавить("октября");
спсМес.Добавить("ноября");
спсМес.Добавить("декабря");

спсЧисл = Новый СписокЗначений;
спсЧисл.Добавить("первое","первого");
спсЧисл.Добавить("второе","второго");
спсЧисл.Добавить("третье","третьего");
спсЧисл.Добавить("четвертое","четвертого");
спсЧисл.Добавить("пятое","пятого");
спсЧисл.Добавить("шестое","шестого");
спсЧисл.Добавить("седьмое","седьмого");
спсЧисл.Добавить("восьмое","восьмого");
спсЧисл.Добавить("девятое","девятого");

//числительные им.падеж
спсЧислИм = Новый СписокЗначений;
спсЧислИм.Добавить("тысяча","тысячного");
спсЧислИм.Добавить("две тысячи","двухтысячного");
спсЧислИм.Добавить("три тысячи","трехтысячного");
спсЧислИм.Добавить("четыре тысячи","четырёхтысячного");
спсЧислИм.Добавить("пять","пятитысячного");
спсЧислИм.Добавить("шесть","шеститысячного");
спсЧислИм.Добавить("семь","семитысячного");
спсЧислИм.Добавить("восемь","восьмитысячного");
спсЧислИм.Добавить("девять","девятитысячного");

спсСотни = Новый СписокЗначений;
спсСотни.Добавить("сто");
спсСотни.Добавить("двести");
спсСотни.Добавить("триста");
спсСотни.Добавить("четыреста");
спсСотни.Добавить("пятьсот");
спсСотни.Добавить("шестьсот");
спсСотни.Добавить("семьсот");
спсСотни.Добавить("восемьсот");
спсСотни.Добавить("девятьсот");

//десятки им.падеж
спсДесИм = Новый СписокЗначений;
спсДесИм.Добавить("","десятого");
спсДесИм.Добавить("двадцать","двадцатого");
спсДесИм.Добавить("тридцать","тридцатого");
спсДесИм.Добавить("сорок","сорокового");
спсДесИм.Добавить("пятьдесят","пятидесятого");
спсДесИм.Добавить("шестьдесят","шестидесятого");
спсДесИм.Добавить("семьдесят","семидесятого");
спсДесИм.Добавить("восемьдесят","восьмидесятого");
спсДесИм.Добавить("девяносто","девяностого"); 
Показать


не проще NAMEDCL пользоваться для склонения? по-моему в типовых как раз через эту библиотеку реализовано
13. 1v7 235 27.04.21 15:33 Сейчас в теме
Данная функция не работает после 2020 года!
Корректный вариант тут https://1cnik.by/data_propisju.php
он с 2000 по 2099 год работает
TormDV; AnddnA; ReDvAlL; +3 Ответить
14. mustdie93 28.10.21 15:18 Сейчас в теме
Функция ДатаПрописью(Дата)
	
	МассивСтрок = Новый Массив;
	СлужебнаяСтрока = Формат(Дата, "ДФ='дд ММММ гггг'");
	ЧастиСтроки = СтрРазделить(СлужебнаяСтрока, " ", Ложь);
	
	МассивСклонений = ПолучитьСклоненияСтрокиПоЧислу("число", Число(ЧастиСтроки[0]), "", "ЧС=Порядковое", "ПД=Именительный; ПЧ=ЧислоПрописью");
	МассивСтрок.Добавить(СтрЗаменить(МассивСклонений[0], " число", ""));
	
	МассивСтрок.Добавить(ЧастиСтроки[1]);
	
	МассивСклонений = ПолучитьСклоненияСтрокиПоЧислу("года", Число(ЧастиСтроки[2]), "", "ЧС=Порядковое", "ПД=Родительный; ПЧ=ЧислоПрописью");
	МассивСтрок.Добавить(НРег(МассивСклонений[0]));
	
	Возврат СтрСоединить(МассивСтрок, " ");
	
КонецФункции
Показать
Els11; livenebo2; Yimaida; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот