При помощи приведенных ниже функций можно вывести дату прописью, например:
03.08.2009 - третье августа две тысячи девятого года
Код 1C v 8.х
// Функция Дата прописью
// Параметры:
// ДП - Дата
// Возвращаемое значение:
// дата прописью
//
// Модификация для 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));
КонецЕсли;
КонецЕсли;
стрГод = Строка(_т)+" "+Строка(с)+" "+Строка(дс)+" "+Строка(е);
КонецЕсли;
Иначе
КонецЕсли;
стрГод = стрГод+" года";
стрГод = СтрЗаменить(стрГод," "," ");
стрРез = Строка(стрДень)+" "+Строка(стрМес)+" "+Строка(стрГод);
стрРез = СтрЗаменить(стрРез," "," ");
Возврат стрРез;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
сообщить(ДатаПрописью(РеквизитДатаНаФорме));
КонецПроцедуры
Код 1C v 7.x
// ПрописьДата()
//
// Параметры:
// Д - дата в формате ДД.MM.ГГГГ
// Возвращаемое значение:
// дата прописью
//
// Автор: hunter
Функция глПрописьДата(Д) Экспорт
стрРез = "";
спсМес = СоздатьОбъект("СписокЗначений");
спсМес.ДобавитьЗначение("января");
спсМес.ДобавитьЗначение("февраля");
спсМес.ДобавитьЗначение("марта");
спсМес.ДобавитьЗначение("апреля");
спсМес.ДобавитьЗначение("мая");
спсМес.ДобавитьЗначение("июня");
спсМес.ДобавитьЗначение("июля");
спсМес.ДобавитьЗначение("августа");
спсМес.ДобавитьЗначение("сентября");
спсМес.ДобавитьЗначение("октября");
спсМес.ДобавитьЗначение("ноября");
спсМес.ДобавитьЗначение("декабря");
спсЧисл = СоздатьОбъект("СписокЗначений");
спсЧисл.ДобавитьЗначение("первое","первого");
спсЧисл.ДобавитьЗначение("второе","второго");
спсЧисл.ДобавитьЗначение("третье","третьего");
спсЧисл.ДобавитьЗначение("четвертое","четвертого");
спсЧисл.ДобавитьЗначение("пятое","пятого");
спсЧисл.ДобавитьЗначение("шестое","шестого");
спсЧисл.ДобавитьЗначение("седьмое","седьмого");
спсЧисл.ДобавитьЗначение("восьмое","восьмого");
спсЧисл.ДобавитьЗначение("девятое","девятого");
//числительные им.падеж
спсЧислИм = СоздатьОбъект("СписокЗначений");
спсЧислИм.ДобавитьЗначение("тысяча","тысячного");
спсЧислИм.ДобавитьЗначение("две тысячи","двухтысячного");
спсЧислИм.ДобавитьЗначение("три тысячи","трехтысячного");
спсЧислИм.ДобавитьЗначение("четыре тысячи","четырёхтысячного");
спсЧислИм.ДобавитьЗначение("пять","пятитысячного");
спсЧислИм.ДобавитьЗначение("шесть","шеститысячного");
спсЧислИм.ДобавитьЗначение("семь","семитысячного");
спсЧислИм.ДобавитьЗначение("восемь","восьмитысячного");
спсЧислИм.ДобавитьЗначение("девять","девятитысячного");
спсСотни = СоздатьОбъект("СписокЗначений");
спсСотни.ДобавитьЗначение("сто");
спсСотни.ДобавитьЗначение("двести");
спсСотни.ДобавитьЗначение("триста");
спсСотни.ДобавитьЗначение("четыреста ");
спсСотни.ДобавитьЗначение("пятьсот");
спсСотни.ДобавитьЗначение("шестьсот");
спсСотни.ДобавитьЗначение("семьсот");
спсСотни.ДобавитьЗначение("восемьсот");
спсСотни.ДобавитьЗначение("девятьсот");
//десятки им.падеж
спсДесИм = СоздатьОбъект("СписокЗначений");
спсДесИм.ДобавитьЗначение("","десятого");
спсДесИм.ДобавитьЗначение("двадцать","двадцатого");
спсДесИм.ДобавитьЗначение("тридцать","тридцатого");
спсДесИм.ДобавитьЗначение("сорок","сорокового");
спсДесИм.ДобавитьЗначение("пятьдесят","пятидесятого");
спсДесИм.ДобавитьЗначение("шестьдесят","шестидесятого");
спсДесИм.ДобавитьЗначение("семьдесят","семидесятого");
спсДесИм.ДобавитьЗначение("восемьдесят","восьмидесятого");
спсДесИм.ДобавитьЗначение("девяносто","девяностого");
//субдесятки род.падеж
спсСубДесРод = СоздатьОбъект("СписокЗначений");
спсСубДесРод.ДобавитьЗначение("одиннадцатого");
спсСубДесРод.ДобавитьЗначение("двенадцатого");
спсСубДесРод.ДобавитьЗначение("тринадцатого");
спсСубДесРод.ДобавитьЗначение("четырнадцатого");
спсСубДесРод.ДобавитьЗначение("пятнадцатого");
спсСубДесРод.ДобавитьЗначение("шестнадцатого");
спсСубДесРод.ДобавитьЗначение("семнадцатого");
спсСубДесРод.ДобавитьЗначение("восемнадцатого");
спсСубДесРод.ДобавитьЗначение("девятнадцатого");
спсДес = СоздатьОбъект("СписокЗначений");
спсДес.ДобавитьЗначение("десятое");
спсДес.ДобавитьЗначение("двадцатое","двадцать");
спсДес.ДобавитьЗначение("тридцатое","тридцать");
спсДес.ДобавитьЗначение("сороковое","тридцать");
спсДес.ДобавитьЗначение("пятидесятое","тридцать");
спсДес.ДобавитьЗначение("шестидесятое","тридцать");
спсДес.ДобавитьЗначение("семидесятое","тридцать");
спсСубДес = СоздатьОбъект("СписокЗначений");
спсСубДес.ДобавитьЗначение("одиннадцатое");
спсСубДес.ДобавитьЗначение("двенадцатое");
спсСубДес.ДобавитьЗначение("тринадцатое");
спсСубДес.ДобавитьЗначение("четырнадцатое");
спсСубДес.ДобавитьЗначение("пятнадцатое");
спсСубДес.ДобавитьЗначение("шестнадцатое");
спсСубДес.ДобавитьЗначение("семнадцатое");
спсСубДес.ДобавитьЗначение("восемнадцатое");
спсСубДес.ДобавитьЗначение("девятнадцатое");
спсДаты = СтрЗаменить(СокрЛП(Д),".",РазделительСтрок);
//разбираем день
стрДень = СокрЛП(Число(СтрПолучитьСтроку(спсДаты,1)));
Если СтрДлина(стрДень)=1 Тогда
стрДень = спсЧисл.ПолучитьЗначение(Число(стрДень));
Иначе
десДень = Число(Лев(стрДень,1));
едДень = Число(Прав(стрДень,1));
Если едДень=0 Тогда
стрДень = спсДес.ПолучитьЗначение(десДень);
Иначе
Если десДень>1 Тогда
т = ""; спсДес.ПолучитьЗначение(десДень,т);
стрДень = т+" "+спсЧисл.ПолучитьЗначение(едДень);
Иначе
стрДень = спсСубДес.ПолучитьЗначение(едДень);
КонецЕсли;
КонецЕсли;
КонецЕсли;
//разбираем месяц
стрМес = спсМес.ПолучитьЗначение(Число(СтрПолучитьСтроку(спсДаты,2)));
//разбираем год
стрГод = СтрПолучитьСтроку(спсДаты,3);
длинаГода = СтрДлина(стрГод);
Если длинаГода=4 Тогда
тыс = Сред(стрГод,1,1); сот = Сред(стрГод,2,1); дес = Сред(стрГод,3,1); ед = Сред(стрГод,4,1);
_т = спсЧислИм.ПолучитьЗначение(Число(тыс));
Если (Число(сот)=0) и (Число(дес)=0) и (Число(ед)=0) Тогда
миллениум = ""; спсЧислИм.ПолучитьЗначение(Число(тыс),миллениум);
стрГод = миллениум;
Иначе
с = ""; дс = ""; е = "";
Если Число(сот)<>0 Тогда
с = спсСотни.ПолучитьЗначение(Число(сот));
КонецЕсли;
Если Число(дес)<>0 Тогда
Если Число(ед)=0 Тогда
_дг = ""; спсДесИм.ПолучитьЗначение(Число(дес),_дг);
дс = _дг;
Иначе
Если Число(дес)>1 Тогда
дс = спсДесИм.ПолучитьЗначение(Число(дес));
Иначе
дс = спсСубДесРод.ПолучитьЗначение(Число(ед));
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если (Число(дес)>1) или (Число(дес)=0) Тогда
Если Число(ед)<>0 Тогда
//е = "";
спсЧисл.ПолучитьЗначение(Число(ед),е);
КонецЕсли;
КонецЕсли;
стрГод = _т+?(ПустоеЗначение(с)=0," ","")+с+?(ПУстоеЗначение(дс)=0," ","")+дс+" "+е;
КонецЕсли;
Иначе
КонецЕсли;
стрГод = стрГод+" года";
стрРез = стрДень+" "+стрМес+" "+стрГод;
//Сообщить(стрДень+" "+стрМес+" "+стрГод);
Возврат стрРез;
КонецФункции
Код 1C v 8.х
// Пример форматной строки для вывода числа прописью на русском
// языке, с выводом целой и дробной части прописью и выводом
// предмета исчисления.
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета="доллар,доллара,долларов,м,цент,цента,центов,м,2";
ПрописьЧисла = ЧислоПрописью(2341.56, ФормСтрока, ПарПредмета);
// Результат вычисления: "Две тысячи триста сорок один доллар пятьдесят шесть центов"
ЧислоПрописью(Число, Форматная строка, Параметры предмета исчисления)
Число - Число, которое необходимо преобразовать в строку прописью.
Форматная строка представляет собой строковое значение, включающее параметры форматирования. Параметры форматирования перечисляются через символ ";" (точка с запятой). Если параметр не указывается, используется значение параметра по умолчанию.
Каждый параметр задается именем параметра, символом "=" (равно) и значением параметра. Значение параметра может указываться в одинарных или двойных кавычках. Это необходимо, если значение параметра содержит символы, используемые в синтаксисе форматной строки.
Л (L) - Код локализации. По умолчанию используется код локализации, установленный в операционной системе. Примеры кодов локализации: ru_RU - Русский (Россия); en_US - Английский (США).
НП (SN) - Включать/не включать название предмета исчисления (Булево), по умолчанию - Истина.
НД (FN) - Включать/не включать название десятичных частей предмета исчисления (Булево), по умолчанию - Истина.
ДП (FS) - Дробную часть выводить прописью/числом (Булево), по умолчанию - Ложь.
Параметры предмета исчисления - Представляет собой строковое значение, определяющее параметры предмета исчисления. Параметры предмета исчисления перечисляются через "," (запятая). Формат строки зависит от кода локализации.
Для русского и белорусского языков (ru_RU, be_BY)
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2", где:
"рубль, рубля, рублей, м" – предмет исчисления:
рубль – единственное число именительный падеж,
рубля – единственное число родительный падеж,
рублей – множественное число родительный падеж,
м – мужской род (ж – женский род, с - средний род);
"копейка, копейки, копеек, ж" – дробная часть, аналогично предмету исчисления (может отсутствовать);
"2" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).
Для украинского языка (uk_UA)
"гривна, гривны, гривен, м, копейка, копейки, копеек, ж, 2", где:
"гривна, гривны, гривен, м" – предмет исчисления:
"гривна – единственное число именительный падеж,
гривны – единственное число родительный падеж,
гривен – множественное число родительный падеж,
м – мужской род (ж – женский род, с - средний род);
"копейка, копейки, копеек, ж" – дробная часть, аналогично предмету исчисления (может отсутствовать);
"2" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).
Для польского языка (pl_PL)
z?oty, z?ote, z?otych, m, grosz, grosze, groszy, m, 2
где:
"z?oty, z?ote, z?otych, m " - предмет исчисления (m - мужской род, ? - женский род, ? - средний род, mo – личностный мужской род)
z?oty - единственное число именительный падеж
z?ote - единственное число винительный падеж
z?otych - множественное число винительный падеж
m - мужской род (? - женский род, ? - средний род, mo – личностный мужской род)
"grosz, grosze, groszy, m " - дробная часть (может отсутствовать) (аналогично целой части)
2 - количество разрядов дробной части (может отсутствовать, по-умолчанию равно 2)
Код 1C v 8.х
Пропись = ЧислоПрописью(1832, “L=pl_PL;SN=true;FN=true;FS=true”, “z?oty, z?ote, z?otych, m, grosz, grosze, groszy, m, 2”);
Для английского, финского и казахского языков (en_US, fi_FI, kk_KZ)
"dollar, dollars, cent, cents, 2", где:
"dollar, dollars" – предмет исчисления в единственном и множественном числе;
"cent, cents" – дробная часть в единственном и множественном числе (может отсутствовать);
"2" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).
Для немецкого языка (de_DE)
"EURO, EURO, М, Cent, Cent, M, 2", где:
"EURO, EURO, М" – предмет исчисления:
EURO, EURO – предмет исчисления в единственном и множественном числе;
М – мужской род (F – женский род, N - средний род);
"Cent, Cent, M" – дробная часть, аналогично предмету исчисления (может отсутствовать);
"2" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).
Примеры:
Код 1C v 8.х x = ЧислоПрописью(123456.78,"ДП=Истина" ,"тонна, тонны, тонн, ж, кг., кг., кг., м,3" );
//x = "Сто двадцать три тысячи четыреста пятьдесят шесть тонн семьсот восемьдесят кг."
x = ЧислоПрописью(123456.78, ,",,,,,,,,0" );
//x = "Сто двадцать три тысячи четыреста пятьдесят семь "
x = ЧислоПрописью(123456.78, ,",,,,,,,,2" );
//x = "Сто двадцать три тысячи четыреста пятьдесят шесть 78 "
x = ЧислоПрописью(123456.78,"Л=ru_RU; ДП=Ложь","рубль, рубля, рублей, м, копейка, копейки, копеек, ж" );
//x = "Сто двадцать три тысячи четыреста пятьдесят шесть рублей 78 копеек"
x = ЧислоПрописью(123456.78, "Л = ru_RU; ДП = Истина", "доллар,доллара,долларов,м,цент,цента,центов,м,2" );
//x = "Сто двадцать три тысячи четыреста пятьдесят шесть долларов семьдесят восемь центов"
ЧислоПрописью(1457.25,"L=en_US","dollar, dollars, cent, cents, 2");
// One thousand four hundreds fifty seven dollars 25 cents.