1С 8.3 Дата прописью
Данные > Примеры кода 1С > 1С 8.3 Дата и время
Перейти в основной раздел:
При наличии общей процедуры (см.модуль ОбщегоНазначения) в 1С 8.3:
Функция Дата_прописью_ОбщегоНазначения(ДатаРеквизит) Экспорт // вер.2021
ОбластьШапки.Параметры.Дата = ВРег(Лев(ОбщегоНазначения.ДатаПрописью(ДатаРеквизит), 1)) + Сред(ОбщегоНазначения.ДатаПрописью(ДатаРеквизит), 2);
КонецФункции
Выводим дату прописью (только словами. без цифр) в 1С 8.3:
Функция Дата_прописью(ДатаРеквизит) Экспорт // вер.2021
// Более быстрый и оптимизированный вариант Функции Дата прописью
// Исправлена и корректно выводит даты с 2000 года (включительно) по 2099
ДР=Формат(ДатаРеквизит,"ДЛФ=D");
//Наименование месяца
МесяцСЗ = Новый СписокЗначений;
МесяцСЗ.Добавить("января");
МесяцСЗ.Добавить("февраля");
МесяцСЗ.Добавить("марта");
МесяцСЗ.Добавить("апреля");
МесяцСЗ.Добавить("мая");
МесяцСЗ.Добавить("июня");
МесяцСЗ.Добавить("июля");
МесяцСЗ.Добавить("августа");
МесяцСЗ.Добавить("сентября");
МесяцСЗ.Добавить("октября");
МесяцСЗ.Добавить("ноября");
МесяцСЗ.Добавить("декабря");
//Наименование числа
ЧислоСЗ = Новый СписокЗначений;
ЧислоСЗ.Добавить("первое","первого");
ЧислоСЗ.Добавить("второе","второго");
ЧислоСЗ.Добавить("третье","третьего");
ЧислоСЗ.Добавить("четвертое","четвертого");
ЧислоСЗ.Добавить("пятое","пятого");
ЧислоСЗ.Добавить("шестое","шестого");
ЧислоСЗ.Добавить("седьмое","седьмого");
ЧислоСЗ.Добавить("восьмое","восьмого");
ЧислоСЗ.Добавить("девятое","девятого");
//Наименование числительного (в именительном падеже)
ЧислоИП = Новый СписокЗначений;
ЧислоИП.Добавить("тысяча","тысячного");
ЧислоИП.Добавить("две тысячи","двухтысячного");
ЧислоИП.Добавить("три тысячи","трехтысячного");
ЧислоИП.Добавить("четыре тысячи","четырёхтысячного");
ЧислоИП.Добавить("пять","пятитысячного");
ЧислоИП.Добавить("шесть","шеститысячного");
ЧислоИП.Добавить("семь","семитысячного");
ЧислоИП.Добавить("восемь","восьмитысячного");
ЧислоИП.Добавить("девять","девятитысячного");
//Наименование сотен
СотниСЗ = Новый СписокЗначений;
СотниСЗ.Добавить("сто");
СотниСЗ.Добавить("двести");
СотниСЗ.Добавить("триста");
СотниСЗ.Добавить("четыреста");
СотниСЗ.Добавить("пятьсот");
СотниСЗ.Добавить("шестьсот");
СотниСЗ.Добавить("семьсот");
СотниСЗ.Добавить("восемьсот");
СотниСЗ.Добавить("девятьсот");
//Наименование десяток (в именительном падеже)
ДесяткиИП = Новый СписокЗначений;
ДесяткиИП.Добавить("","десятого");
ДесяткиИП.Добавить("двадцать","двадцатого");
ДесяткиИП.Добавить("тридцать","тридцатого");
ДесяткиИП.Добавить("сорок","сорокового");
ДесяткиИП.Добавить("пятьдесят","пятидесятого");
ДесяткиИП.Добавить("шестьдесят","шестидесятого");
ДесяткиИП.Добавить("семьдесят","семидесятого");
ДесяткиИП.Добавить("восемьдесят","восьмидесятого");
ДесяткиИП.Добавить("девяносто","девяностого");
//Наименование субдесяток от 11 до 20 (в родительном падеже)
СубДесРП = Новый СписокЗначений;
СубДесРП.Добавить("одиннадцатого");
СубДесРП.Добавить("двенадцатого");
СубДесРП.Добавить("тринадцатого");
СубДесРП.Добавить("четырнадцатого");
СубДесРП.Добавить("пятнадцатого");
СубДесРП.Добавить("шестнадцатого");
СубДесРП.Добавить("семнадцатого");
СубДесРП.Добавить("восемнадцатого");
СубДесРП.Добавить("девятнадцатого");
СубДесРП.Добавить("двадцать");
//Наименование десяток (в именительном падеже)
СубДесСЗ = Новый СписокЗначений;
СубДесСЗ.Добавить("десятое");
СубДесСЗ.Добавить("двадцатое","двадцать");
СубДесСЗ.Добавить("тридцатое","тридцать");
СубДесСЗ.Добавить("сороковое","сорок");
СубДесСЗ.Добавить("пятидесятое","пятьдесят");
СубДесСЗ.Добавить("шестидесятое","шестьдесят");
СубДесСЗ.Добавить("семидесятое","семьдесят");
//Наименование от 11 до 29 включительно
СубДесИП = Новый СписокЗначений;
СубДесИП.Добавить("одиннадцатое");
СубДесИП.Добавить("двенадцатое");
СубДесИП.Добавить("тринадцатое");
СубДесИП.Добавить("четырнадцатое");
СубДесИП.Добавить("пятнадцатое");
СубДесИП.Добавить("шестнадцатое");
СубДесИП.Добавить("семнадцатое");
СубДесИП.Добавить("восемнадцатое");
СубДесИП.Добавить("девятнадцатое");
СубДесИП.Добавить("двадцатое");
СубДесИП.Добавить("двадцать первое");
СубДесИП.Добавить("двадцать второе");
СубДесИП.Добавить("двадцать третье");
СубДесИП.Добавить("двадцать четвертое");
СубДесИП.Добавить("двадцать пятое");
СубДесИП.Добавить("двадцать шестое");
СубДесИП.Добавить("двадцать седьмое");
СубДесИП.Добавить("двадцать восьмое");
СубДесИП.Добавить("двадцать девятое");
ПДата = СтрЗаменить(СокрЛП(ДР),".",Символы.ПС); // Преобразование даты
//Разборка дня
ДеньСтрока = СокрЛП(Число(СтрПолучитьСтроку(ПДата,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));
ИначеЕсли Число(Год_ед)>0 и Число(Год_дес)>1 Тогда//например 2021
дес_г = Строка(ДесяткиИП.Получить(Число(Год_дес)-1).Значение);
Иначе
дес_г = СубДесРП.Получить(Число(Год_ед)-1).Значение;
КонецЕсли;
КонецЕсли;
Если (Число(Год_дес)>1) или (Число(Год_дес)=0) Тогда
Если Число(Год_ед)<>0 Тогда
ед_год =Строка(ЧислоСЗ.Получить(Число(Год_ед)-1));
КонецЕсли;
КонецЕсли;
ГодСтрока = Строка(ЗначениеЧисл)+" "+Строка(сот_г)+" "+Строка(дес_г)+" "+Строка(ед_год);
КонецЕсли;
КонецЕсли;
ГодСтрока = ГодСтрока+" года";
ГодСтрока = СтрЗаменить(ГодСтрока," "," ");
Результат_строка = Строка(ДеньСтрока)+" "+Строка(МесяцСтрока)+" "+Строка(ГодСтрока);
Результат_строка = СтрЗаменить(Результат_строка," "," ");
Возврат Результат_строка;
КонецФункции
&НаКлиенте
Процедура Старт(Кнопка)
Сообщить(Дата_прописью(Объект.ДатаРеквизит));
//Тест:
//27.04.2000 = двадцать седьмое апреля двухтысячного года
//15.12.2005 = пятнадцатое декабря две тысячи пятого года
//04.08.2017 = четвертое августа две тысячи семнадцатого года
//08.04.2023 = восьмое апреля две тысячи двадцать третьего года
//17.10.2047 = семнадцатое октября две тысячи сорок седьмого года
//30.01.2099 = тридцатое января две тысячи девяносто девятого года
КонецПроцедуры
// Более быстрый и оптимизированный вариант Функции Дата прописью
// Исправлена и корректно выводит даты с 2000 года (включительно) по 2099
ДР=Формат(ДатаРеквизит,"ДЛФ=D");
//Наименование месяца
МесяцСЗ = Новый СписокЗначений;
МесяцСЗ.Добавить("января");
МесяцСЗ.Добавить("февраля");
МесяцСЗ.Добавить("марта");
МесяцСЗ.Добавить("апреля");
МесяцСЗ.Добавить("мая");
МесяцСЗ.Добавить("июня");
МесяцСЗ.Добавить("июля");
МесяцСЗ.Добавить("августа");
МесяцСЗ.Добавить("сентября");
МесяцСЗ.Добавить("октября");
МесяцСЗ.Добавить("ноября");
МесяцСЗ.Добавить("декабря");
//Наименование числа
ЧислоСЗ = Новый СписокЗначений;
ЧислоСЗ.Добавить("первое","первого");
ЧислоСЗ.Добавить("второе","второго");
ЧислоСЗ.Добавить("третье","третьего");
ЧислоСЗ.Добавить("четвертое","четвертого");
ЧислоСЗ.Добавить("пятое","пятого");
ЧислоСЗ.Добавить("шестое","шестого");
ЧислоСЗ.Добавить("седьмое","седьмого");
ЧислоСЗ.Добавить("восьмое","восьмого");
ЧислоСЗ.Добавить("девятое","девятого");
//Наименование числительного (в именительном падеже)
ЧислоИП = Новый СписокЗначений;
ЧислоИП.Добавить("тысяча","тысячного");
ЧислоИП.Добавить("две тысячи","двухтысячного");
ЧислоИП.Добавить("три тысячи","трехтысячного");
ЧислоИП.Добавить("четыре тысячи","четырёхтысячного");
ЧислоИП.Добавить("пять","пятитысячного");
ЧислоИП.Добавить("шесть","шеститысячного");
ЧислоИП.Добавить("семь","семитысячного");
ЧислоИП.Добавить("восемь","восьмитысячного");
ЧислоИП.Добавить("девять","девятитысячного");
//Наименование сотен
СотниСЗ = Новый СписокЗначений;
СотниСЗ.Добавить("сто");
СотниСЗ.Добавить("двести");
СотниСЗ.Добавить("триста");
СотниСЗ.Добавить("четыреста");
СотниСЗ.Добавить("пятьсот");
СотниСЗ.Добавить("шестьсот");
СотниСЗ.Добавить("семьсот");
СотниСЗ.Добавить("восемьсот");
СотниСЗ.Добавить("девятьсот");
//Наименование десяток (в именительном падеже)
ДесяткиИП = Новый СписокЗначений;
ДесяткиИП.Добавить("","десятого");
ДесяткиИП.Добавить("двадцать","двадцатого");
ДесяткиИП.Добавить("тридцать","тридцатого");
ДесяткиИП.Добавить("сорок","сорокового");
ДесяткиИП.Добавить("пятьдесят","пятидесятого");
ДесяткиИП.Добавить("шестьдесят","шестидесятого");
ДесяткиИП.Добавить("семьдесят","семидесятого");
ДесяткиИП.Добавить("восемьдесят","восьмидесятого");
ДесяткиИП.Добавить("девяносто","девяностого");
//Наименование субдесяток от 11 до 20 (в родительном падеже)
СубДесРП = Новый СписокЗначений;
СубДесРП.Добавить("одиннадцатого");
СубДесРП.Добавить("двенадцатого");
СубДесРП.Добавить("тринадцатого");
СубДесРП.Добавить("четырнадцатого");
СубДесРП.Добавить("пятнадцатого");
СубДесРП.Добавить("шестнадцатого");
СубДесРП.Добавить("семнадцатого");
СубДесРП.Добавить("восемнадцатого");
СубДесРП.Добавить("девятнадцатого");
СубДесРП.Добавить("двадцать");
//Наименование десяток (в именительном падеже)
СубДесСЗ = Новый СписокЗначений;
СубДесСЗ.Добавить("десятое");
СубДесСЗ.Добавить("двадцатое","двадцать");
СубДесСЗ.Добавить("тридцатое","тридцать");
СубДесСЗ.Добавить("сороковое","сорок");
СубДесСЗ.Добавить("пятидесятое","пятьдесят");
СубДесСЗ.Добавить("шестидесятое","шестьдесят");
СубДесСЗ.Добавить("семидесятое","семьдесят");
//Наименование от 11 до 29 включительно
СубДесИП = Новый СписокЗначений;
СубДесИП.Добавить("одиннадцатое");
СубДесИП.Добавить("двенадцатое");
СубДесИП.Добавить("тринадцатое");
СубДесИП.Добавить("четырнадцатое");
СубДесИП.Добавить("пятнадцатое");
СубДесИП.Добавить("шестнадцатое");
СубДесИП.Добавить("семнадцатое");
СубДесИП.Добавить("восемнадцатое");
СубДесИП.Добавить("девятнадцатое");
СубДесИП.Добавить("двадцатое");
СубДесИП.Добавить("двадцать первое");
СубДесИП.Добавить("двадцать второе");
СубДесИП.Добавить("двадцать третье");
СубДесИП.Добавить("двадцать четвертое");
СубДесИП.Добавить("двадцать пятое");
СубДесИП.Добавить("двадцать шестое");
СубДесИП.Добавить("двадцать седьмое");
СубДесИП.Добавить("двадцать восьмое");
СубДесИП.Добавить("двадцать девятое");
ПДата = СтрЗаменить(СокрЛП(ДР),".",Символы.ПС); // Преобразование даты
//Разборка дня
ДеньСтрока = СокрЛП(Число(СтрПолучитьСтроку(ПДата,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));
ИначеЕсли Число(Год_ед)>0 и Число(Год_дес)>1 Тогда//например 2021
дес_г = Строка(ДесяткиИП.Получить(Число(Год_дес)-1).Значение);
Иначе
дес_г = СубДесРП.Получить(Число(Год_ед)-1).Значение;
КонецЕсли;
КонецЕсли;
Если (Число(Год_дес)>1) или (Число(Год_дес)=0) Тогда
Если Число(Год_ед)<>0 Тогда
ед_год =Строка(ЧислоСЗ.Получить(Число(Год_ед)-1));
КонецЕсли;
КонецЕсли;
ГодСтрока = Строка(ЗначениеЧисл)+" "+Строка(сот_г)+" "+Строка(дес_г)+" "+Строка(ед_год);
КонецЕсли;
КонецЕсли;
ГодСтрока = ГодСтрока+" года";
ГодСтрока = СтрЗаменить(ГодСтрока," "," ");
Результат_строка = Строка(ДеньСтрока)+" "+Строка(МесяцСтрока)+" "+Строка(ГодСтрока);
Результат_строка = СтрЗаменить(Результат_строка," "," ");
Возврат Результат_строка;
КонецФункции
&НаКлиенте
Процедура Старт(Кнопка)
Сообщить(Дата_прописью(Объект.ДатаРеквизит));
//Тест:
//27.04.2000 = двадцать седьмое апреля двухтысячного года
//15.12.2005 = пятнадцатое декабря две тысячи пятого года
//04.08.2017 = четвертое августа две тысячи семнадцатого года
//08.04.2023 = восьмое апреля две тысячи двадцать третьего года
//17.10.2047 = семнадцатое октября две тысячи сорок седьмого года
//30.01.2099 = тридцатое января две тысячи девяносто девятого года
КонецПроцедуры
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник