// Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу. // // Параметры: // рВетка - дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип колонок. Если хватит // объявленных позиционных строк-заполнителей, всё поместится. Если иерархия слишком глубока, строки просто надо нарастить; // рТекст - на входе должен быть равен Неопределено; на выходе по окончании работы содержит результатный текстовый документ; // рПараметры - структура дополнительных настроек, допустимые ключи: // Колонки - структура колонок, которые подлежат выводу. Если пуста или имеет тип, отличный от структуры, выводятся все колонки; // если в ключах структуры указаны имена колонок, будут выведены только они. В значениях структуры можно передать строковое // представление формата, согласно которому должны будут форматироваться выводимые значения. По умолчанию формата нет; // ПоказыватьУровни - булево, управляет выводом №№ уровней (метод Уровень()), по умолчанию выключено; // ШагОтступа - число, определяющее шаг в символах, используемый для показа псевдографики иерархии веток в дереве. // &НаСервереБезКонтекста Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено) Попытка Если рТекст=Неопределено Тогда // первая итерация, шапочный вызов исходной части //--------------------------------------------------------------------------------------------------------------------------- // Разбираем входные данные Если ТипЗнч(рВетка)<>Тип("ДеревоЗначений") Тогда Возврат КонецЕсли; Если ТипЗнч(рПараметры)<>Тип("Структура") Тогда рПараметры=Новый Структура КонецЕсли; стрКолонок=?(рПараметры.Свойство("Колонки"),рПараметры.Колонки,Неопределено); Если ТипЗнч(стрКолонок)<>Тип("Структура") Тогда стрКолонок=Новый Структура КонецЕсли; рПоказыватьУровни=?(рПараметры.Свойство("ПоказыватьУровни"),рПараметры.ПоказыватьУровни,Ложь); // затратное дело, кстати рШагОтступа=?(рПараметры.Свойство("ШагОтступа"),рПараметры.ШагОтступа,2); // для отображения отступа в колонке иерархии //--------------------------------------------------------------------------------------------------------------------------- // Определяем максимальное количество уровней // Также можно получить максимальный уровень, "плоско" перебрав все строки (например, получив их через НайтиСтроки) // и в цикле для каждой вызывая Уровень() и определяя максимум. // Вариант через СКД и служебное поле "Уровень" ни на одной известной мне платформе не работоспособен (нехватка памяти). // // //рДеревоДляТеста=КакНибудьСкопироватьДерево(рВетка); //рДеревоДляТеста.Колонки.Вставить(0,"_Level",Новый ОписаниеТипов("Булево")); // самый экономный вариант, с сохранением иерархии //мНенужных=Новый Массив; //Для й=1 По рДеревоДляТеста.Колонки.Количество()-1 Цикл // мНенужных.Добавить(рДеревоДляТеста.Колонки[й]); //КонецЦикла; //Для каждого кол Из мНенужных Цикл // рДеревоДляТеста.Колонки.Удалить(кол); //КонецЦикла; // рДеревоДляТеста=рВетка; // пока сериализуем прямо всё дерево (неоптимально, но...) рЗапись=Новый ЗаписьXML; рЗапись.УстановитьСтроку(); СериализаторXDTO.ЗаписатьXML(рЗапись,рДеревоДляТеста); стро=рЗапись.Закрыть(); // стро=СтрЗаменить(стро,"xmlns=","xmlns:myns1C="); // иначе не будет работать XPath // рЧтение=Новый ЧтениеXML; рЧтение.УстановитьСтроку(стро); постр=Новый ПостроительDOM; рДокументДОМ=постр.Прочитать(рЧтение); рВыражение="/ValueTree/row"; максКолвоУровней=1; рРазыменователь=Новый РазыменовательПространствИменDOM(рДокументДОМ); Пока Истина Цикл #Если Клиент Тогда ОбработкаПрерыванияПользователя(); #КонецЕсли рРезультат=рДокументДОМ.ВычислитьВыражениеXPath(рВыражение,рДокументДОМ,рРазыменователь,ТипРезультатаDOMXPath.Любой); Если рРезультат.ПолучитьСледующий()=Неопределено Тогда Прервать КонецЕсли; рВыражение=рВыражение+"/row"; максКолвоУровней=максКолвоУровней+1; КонецЦикла; максКолвоУровней=максКолвоУровней-1; // можно и так: СтрЧислоВхождений(рВыражение,"/row")-1; //--------------------------------------------------------------------------------------------------------------------------- // готовим исходный макет вывода строПробелы=" "; строРазделители="==============================================================================================="; строОтступы="___________________________________________________________________________________________"; // тут нужны чуть для другого // секШапка1="|[_HCS"+Лев(строПробелы,максКолвоУровней*рШагОтступа)+"]|"; // HierarchyColumnShow секГорРазделитель1="|"+Лев(строОтступы,максКолвоУровней*рШагОтступа+6)+"|"; // здесь именно Отступы! рШиринаКолонкиИерархии=СтрДлина(секШапка1)-2; строПолейШапки="#Поле _HCS | #Выравнивание Центр"; строПолейЗаписи=""; // Если рПоказыватьУровни Тогда секШапка1=секШапка1+"[_Level]|"; секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,8)+"|"; строПолейШапки=строПолейШапки+" |#Поле _Level | #Выравнивание Центр"; строПолейЗаписи="#Поле _Level | #Выравнивание Центр | #Забивать Истина"; КонецЕсли; // мИменКолонок=Новый Массив; Для каждого кол Из рВетка.Колонки Цикл Если стрКолонок.Количество()<>0 и не стрКолонок.Свойство(кол.Имя) Тогда Продолжить КонецЕсли; // чётко указаны конкретные колонки рДлинаИмениКолонки=СтрДлина(кол.Имя); рНужнаяШирина=Макс(?(кол.Ширина<3,10,кол.Ширина),рДлинаИмениКолонки); // к сожалению, ключевое слово "#Поля" неприменимо - платформа падает - поэтому делаем всё сами секШапка1=секШапка1+"["+кол.Имя+Лев(строПробелы,рНужнаяШирина-рДлинаИмениКолонки)+"]|"; секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,рНужнаяШирина+1)+"=|"; строПолейШапки=строПолейШапки+" |#Поле "+кол.Имя+" | #Выравнивание Центр"; рОписТипов=кол.ТипЗначения; Если рОписТипов.Типы().Количество()=1 и рОписТипов.СодержитТип(Тип("Булево")) Тогда рВыравнивание="Центр"; ИначеЕсли рОписТипов.СодержитТип(Тип("Число")) Тогда рВыравнивание="Право"; ИначеЕсли рОписТипов.СодержитТип(Тип("Строка")) и рОписТипов.КвалификаторыСтроки.Длина=0 Тогда рВыравнивание="ПоШирине"; Иначе рВыравнивание="Лево"; КонецЕсли; строПолейЗаписи=строПолейЗаписи+?(ПустаяСтрока(строПолейЗаписи),"",Символы.ПС)+"#Поле "+кол.Имя+" | #Выравнивание "+рВыравнивание; Попытка Если ЗначениеЗаполнено(стрКолонок[кол.Имя]) Тогда // указан формат, уточняющий показ колонки строПолейЗаписи=строПолейЗаписи+" | #Формат """+СокрЛП(стрКолонок[кол.Имя])+""""; КонецЕсли; Исключение КонецПопытки; мИменКолонок.Добавить(кол.Имя); КонецЦикла; секШапка2=СтрЗаменить(СтрЗаменить(секШапка1,"[","<"),"]",">"); секЗапись1=секШапка1; секЗапись2=секШапка2; // пусть они по дизайну пока не отличаются секГорРазделитель2=СтрЗаменить(СтрЗаменить(секГорРазделитель1,"=","-"),"|","+"); // обработаем нормальное обрамление шапки колонки иерархии секГорРазделитель1=СтрЗаменить(секГорРазделитель1,"_","="); секГорРазделитель2=СтрЗаменить(секГорРазделитель2,"_"," "); // тМакет=Новый ТекстовыйДокумент; тМакет.ДобавитьСтроку("#Область Шапка"); тМакет.ДобавитьСтроку(строПолейШапки); тМакет.ДобавитьСтроку(секГорРазделитель1); тМакет.ДобавитьСтроку(секШапка1); тМакет.ДобавитьСтроку(секШапка2); тМакет.ДобавитьСтроку(секГорРазделитель1); тМакет.ДобавитьСтроку("#КонецОбласти"); тМакет.ДобавитьСтроку(""); тМакет.ДобавитьСтроку("#Область Запись"); тМакет.ДобавитьСтроку(строПолейЗаписи); тМакет.ДобавитьСтроку(секЗапись1); тМакет.ДобавитьСтроку(секЗапись2); тМакет.ДобавитьСтроку(секГорРазделитель2); тМакет.ДобавитьСтроку("#КонецОбласти"); рПараметры.Вставить("ИсходныйМакет",тМакет); // пусть будет //--------------------------------------------------------------------------------------------------------------------------- // Запускаем вывод в итоговый документ рТекст=Новый ТекстовыйДокумент; сек=тМакет.ПолучитьОбласть("Шапка"); сек.Параметры._HCS="Иерархия"; Для каждого имякол Из мИменКолонок Цикл кол=рВетка.Колонки[имякол]; сек.Параметры[кол.Имя]=?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок); КонецЦикла; рТекст.Вывести(сек); // пар=Новый Структура; пар.Вставить("МассивИмёнКолонок",мИменКолонок); пар.Вставить("ТекущаяСекция",тМакет.ПолучитьОбласть("Запись")); пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии); пар.Вставить("ПоказыватьУровни",рПоказыватьУровни); пар.Вставить("Отступ",0); пар.Вставить("ШагОтступа",рШагОтступа); ВывестиДеревоЗначенийВТекст(рВетка,рТекст,пар); Иначе // очередная итерация, вывод в текстовый документ мИменКолонок=рПараметры.МассивИмёнКолонок; рСекция=рПараметры.ТекущаяСекция; рОтступ=рПараметры.Отступ; рШиринаКолонкиИерархии=рПараметры.ШиринаКолонкиИерархии; рПоказыватьУровни=рПараметры.ПоказыватьУровни; // строОтступы="_________________________________________________________________________________________________________"; строПробелы=" "; // пар=Новый Структура; пар.Вставить("МассивИмёнКолонок",мИменКолонок); пар.Вставить("ТекущаяСекция",рПараметры.ТекущаяСекция); пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии); пар.Вставить("ПоказыватьУровни",рПоказыватьУровни); пар.Вставить("ШагОтступа",рПараметры.ШагОтступа); пар.Вставить("Отступ",рОтступ+рПараметры.ШагОтступа); // Для каждого рПодветка Из рВетка.Строки Цикл рСекция.Параметры._HCS=Лев(строПробелы,рОтступ)+"\"+Лев(строОтступы,рШиринаКолонкиИерархии-рОтступ-1); Если рПоказыватьУровни Тогда рСекция.Параметры._Level=рПодветка.Уровень(); КонецЕсли; Для каждого имякол Из мИменКолонок Цикл рСекция.Параметры[имякол]=рПодветка[имякол]; КонецЦикла; рТекст.Вывести(рСекция); ВывестиДеревоЗначенийВТекст(рПодветка,рТекст,пар) КонецЦикла; // КонецЕсли; Исключение Сообщить("ВывестиДеревоЗначенийВТекст, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное); КонецПопытки; КонецПроцедуры
Источник
// Функция Дата прописью // Параметры: // ДП - Дата // Возвращаемое значение: // дата прописью // // Модификация для 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)); КонецЕсли; КонецЕсли; стрГод = Строка(_т)+" "+Строка(с)+" "+Строка(дс)+" "+Строка(е); КонецЕсли; Иначе КонецЕсли; стрГод = стрГод+" года"; стрГод = СтрЗаменить(стрГод," "," "); стрРез = Строка(стрДень)+" "+Строка(стрМес)+" "+Строка(стрГод); стрРез = СтрЗаменить(стрРез," "," "); Возврат стрРез; КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) сообщить(ДатаПрописью(РеквизитДатаНаФорме)); КонецПроцедуры
// ПрописьДата() // // Параметры: // Д - дата в формате ДД.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," ","")+дс+" "+е; КонецЕсли; Иначе КонецЕсли; стрГод = стрГод+" года"; стрРез = стрДень+" "+стрМес+" "+стрГод; //Сообщить(стрДень+" "+стрМес+" "+стрГод); Возврат стрРез; КонецФункции