Вывод количества лет, месяцев, дней полупрописью
Функция, которая возвращает количество лет, месяцев, дней "полупрописью", т.е. в формате "4 года 5 месяцев 3 дня".
- Описание
- Подробнее
Описание
Бухгалтер попросила поправить разрядность количества месяцев срока полезного использования объектов основных средств (не изучал я законодательства, а бухгалтер уверяет, что у нее есть объект со сроком 109.2 месяца).
Полез я в типовую бухгалтерию от МиСофт, поправил, где только возможно, тестирую и получаю ошибку в непредвиденном месте: есть оказывается функция, которая возвращает вместо 13 месяцев строку «1 год 1 месяц». А у меня дробное число, вот и нарвался я на ошибку.
Скажу честно, мне не понравилась функция, которая вообще не использует возможности 1С по использованию т.н. «Предмета исчисления», вот и решил переписать.
Маленькое пояснение.
В одном из мест кода «день» представлен как «#$ень». Чтобы представить число дней в виде именно числа дальше по коду ищется этот самый «день» и удаляется все, что до него. Когда я искал просто букву «д», то получал результат в виде «12 дцать дней», «20 дцать дней», а усложнять код для поиска «день, дня, дней» не захотел.
Советую и «год, года, лет» в «Предмете исчисления» представить как «@@год, @@года, @@лет» для исключения из кода двойного поиска по словам «год, лет».
В коде оставлена функция из типовой конфигурации. Весь ее код можно просто удалить (область выделена фиолетовым), т.к. до этого кода, по идее, никогда не должен доходить компилятор.
Собственно функция:
Функция РасшифровкаСрокаПолезногоИспользования(СрокПолезногоИспользования) Экспорт
РасшифровкаСрокаПолезногоИспользования = "";Если ЗначениеЗаполнено(СрокПолезногоИспользования) ТогдаЧастьМесяца = СрокПолезногоИспользования - Цел(СрокПолезногоИспользования);ЧислоДней = Цел(30 * ЧастьМесяца);Суффикс = "";Если НЕ ЧислоДней = 0 ТогдаСуффикс = ЧислоПрописью(ЧислоДней, "НД = Ложь", "#$ень, #$ня, #$ней, м,,,,,0");ПозицияПослеПрописи = Найти(Суффикс, "#$");Суффикс = Сред(Суффикс, ПозицияПослеПрописи);Суффикс = " " + СокрЛП(ЧислоДней) + " " + Суффикс;КонецЕсли;ЧислоЛет = Цел(СрокПолезногоИспользования / 12);ЧислоМесяцев = Цел((СрокПолезногоИспользования % 12));ЧислоЛетМесяцев = ЧислоЛет + ЧислоМесяцев/100;Если ЧислоЛет = 0 ТогдаСтрокаЧислоЛетМесяцев = ЧислоПрописью(ЧислоМесяцев, "НД = Ложь", "месяц, месяца, месяцев, м,,,,,0");СтрокаПоиска = "месяц";ИначеСтрокаЧислоЛетМесяцев = ЧислоПрописью(ЧислоЛетМесяцев, ?(ЧислоМесяцев = 0, "НД = Ложь", "НД = Истина"), "год, года, лет, м" + ?(ЧислоМесяцев = 0, ",,,,,0" ,", месяц, месяца, месяцев, м, 2"));СтрокаПоиска = "год";КонецЕсли;ПозицияПослеЛет = Найти(СтрокаЧислоЛетМесяцев, СтрокаПоиска);Если ПозицияПослеЛет = 0 ТогдаПозицияПослеЛет = Найти(СтрокаЧислоЛетМесяцев, "лет");Если ПозицияПослеЛет = 0 Тогда//Фигня какая-то, оставим алгоритм МиСофтОт сих старый код типовой конфигурации**************************************Если НЕ (ЧислоЛет = 0) Тогда// Построим строку с числом летЕсли (СтрДлина(ЧислоЛет) > 1) И (Число(Сред(ЧислоЛет, СтрДлина(ЧислоЛет) - 1, 1)) = 1) ТогдаСтрокаГод = " лет";ИначеЕсли Число(Прав(ЧислоЛет, 1)) = 1 ТогдаСтрокаГод = " год";ИначеЕсли (Число(Прав(ЧислоЛет, 1)) > 1) И (Число(Прав(ЧислоЛет, 1)) < 5) ТогдаСтрокаГод = " года";ИначеСтрокаГод = " лет";КонецЕсли;РасшифровкаСрокаПолезногоИспользования = РасшифровкаСрокаПолезногоИспользования + Строка(ЧислоЛет) + СтрокаГод;КонецЕсли;Если НЕ (ЧислоМесяцев = 0) Тогда// Построим строку с числом месяцевЕсли (СтрДлина(Цел(ЧислоМесяцев)) > 1) И (Число(Сред(Цел(ЧислоМесяцев), СтрДлина(Цел(ЧислоМесяцев)) - 1, 1)) = 1) ТогдаСтрокаМесяц = " месяцев";ИначеЕсли Число(Прав(Цел(ЧислоМесяцев), 1)) = 1 ТогдаСтрокаМесяц = " месяц";ИначеЕсли (Число(Прав(Цел(ЧислоМесяцев), 1)) > 1) И (Число(Прав(Цел(ЧислоМесяцев), 1)) < 5) ТогдаСтрокаМесяц = " месяца";ИначеСтрокаМесяц = " месяцев";КонецЕсли;РасшифровкаСрокаПолезногоИспользования = РасшифровкаСрокаПолезногоИспользования + ?(НЕ ЗначениеЗаполнено(РасшифровкаСрокаПолезногоИспользования), "", " ") + Строка(ЧислоМесяцев) + СтрокаМесяц;КонецЕсли;РасшифровкаСрокаПолезногоИспользования = "(" + РасшифровкаСрокаПолезногоИспользования + ")";**************************************До сих старый код типовой конфигурации
КонецЕсли;КонецЕсли;Если РасшифровкаСрокаПолезногоИспользования = "" ТогдаРасшифровкаСрокаПолезногоИспользования = СокрЛП(?(ЧислоЛет = 0, ЧислоМесяцев, ЧислоЛет)) + " " + Сред(СтрокаЧислоЛетМесяцев, ПозицияПослеЛет);//Уберем обязательное двузначное число месяцев, если оно получилось:РасшифровкаСрокаПолезногоИспользования = СтрЗаменить(РасшифровкаСрокаПолезногоИспользования, " 0", " ") + СтрЗаменить(Суффикс, "#$", "д");КонецЕсли;КонецЕсли;Возврат РасшифровкаСрокаПолезногоИспользования;КонецФункции// РасшифровкаСрокаПолезногоИспользования()
Здесь же оставил часть кода МиСофта на непредвиденные мною ситуации.
