Имя: Пароль:
1C
1С v8
v8: Преобразование значения к типу Число не может быть выполнено
Ø (GROOVY 05.05.2014 23:53)
,
0 листопад
 
05.05.14
23:30
Не понятно, почему закрыли мою тему??? Проблема так и не решилась. А очень надо, не закрывайте и эту тему, пож-та!!!

Формирую внешнюю печ.форму сразу в Ворд. Проблема с реквизитом: в спр.ФЛ, на вкладке "Прочее" есть возможность вводить Заметки. Мы вводим Дату и Содержание. В случае, если у ФЛ заметки нет, при формировании этой внеш.печ.формы выдает сообщение об ошибке и не формирует:

Не удалось сформировать внешнюю печатную форму!
Преобразование значения к типу Число не может быть выполнено

Если Заметка заполнена, то все формируется. Опытным путем обнаружила, что если закомментировать строчку:  ш_ДовДата = ДатаПрописью(ДовДата);
то в любом случае печ.форма формируется, только в случае не заполнения Заметки, эти поля не выводятся и в печ.форму.
Вопрос, как сделать, чтобы печ.форма формиловалась без закомментирования этой строчки. Ведь в ней вызывается функция, которая возвращает Дату прописью.

Вот код:


Функция Печать() Экспорт

Выборка = СформироватьЗапросДляПечатиТрудовогоДоговораН().Выбрать();

Если Выборка.Следующий() Тогда
    
    // заметки Доверенность
    ВидЗ = Справочники.ВидыЗаметок.НайтиПоНаименованию("доверенность");
    Если  НЕ ВидЗ.Пустая() Тогда
        ВидЗаметки = ВидЗ.Ссылка;
        
        Содержание="";
        з=Новый Запрос;
        з.Текст=        
        "ВЫБРАТЬ
        |    Заметки.Дата,
        |    Заметки.Объект,
        |    Заметки.Содержание,
        |    Заметки.ВидЗаметки
        |ИЗ
        |    РегистрСведений.Заметки КАК Заметки
        |ГДЕ
        |    Заметки.Объект = &ФЛ
        |    И Заметки.ВидЗаметки = &Вид";
        
        з.УстановитьПараметр("ФЛ",Выборка.ФизЛицо);
        з.УстановитьПараметр("Вид", ВидЗаметки);
        
        ВыбЗаметка = з.Выполнить().Выбрать();
        Если ВыбЗаметка.Следующий() Тогда
            ДовДата = ВыбЗаметка.Дата;
            ДовНомер = ВыбЗаметка.Содержание;
        КонецЕсли;
    Иначе
        ДовДата = " ";
        ДовНомер = " ";
        Сообщить( "У физ.лица " + Выборка.ФизЛицо + " не заполнен ВидЗаметки");
    КонецЕсли;
    
    ш_ДовНомер = ДовНомер;
    ш_ДовДата = ДовДата;
    ш_ДовДата = ДатаПрописью(ДовДата);
    
КонецЕсли;
Макет = ПолучитьМакет("МакетДоверенность");
MSWord = Макет.Получить();

Попытка
    Документ = MSWord.Application.Documents(1);
    Документ.Activate();
    Замена = Документ.Content.Find;
    Замена.Wrap = 1;   //чтобы не писать каждый раз  Find
    Замена.Execute("ш_ДовНомер", , , , , , , , ,ш_ДовНомер,2);
    Замена.Execute("ш_ДовДата", , , , , , , , ,ш_ДовДата,2);
    MSWord.Application.Visible=Истина;
    MsWord.Activate();
Исключение
    Сообщить(ОписаниеОшибки());
    MSWord.Application.Quit();
КонецПопытки;

КонецФункции


Вот код фунукции, вызов которой приходится закомментировать, иначе ошибка:


Функция ДатаПрописью(ДП) Экспорт
    стрРез = "";
    Д=Формат(ДП,"ДЛФ=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));
                КонецЕсли;
            КонецЕсли;
            стрГод = Строка(_т)+" "+Строка(с)+" "+Строка(дс)+" "+Строка(е);
        КонецЕсли;
    Иначе
        
    КонецЕсли;
    стрГод = стрГод+" года";
    стрГод = СтрЗаменить(стрГод," "," ");
    стрРез = Строка(стрДень)+" "+Строка(стрМес)+" "+Строка(стрГод);
    стрРез = СтрЗаменить(стрРез," "," ");
    Возврат стрРез;
КонецФункции
1 Otkr
 
05.05.14
23:32
Никому неохота разбираться в гомнокоде
2 shuhard
 
05.05.14
23:33
(0) убейся наконец об стенку
3 PR
 
05.05.14
23:33
Ну вот, девушка еще и про правило 8 не знает. Бяда :))
4 PR
 
05.05.14
23:34
(2) Что злой такой?
5 Otkr
 
05.05.14
23:34
(4) А сам то, Роман)))
6 PR
 
05.05.14
23:35
(5) Я? Злой?! :)) Да я добрее Карлсона :))
7 листопад
 
05.05.14
23:35
Пять сообщений, и хоть бы одно по существу... И охота людям в 12ч.ночи гадости другим писать...
8 su_mai
 
05.05.14
23:37
9 PR
 
05.05.14
23:37
(7) Мадам, поймите, программисты 1С зарабатывают на жизнь тем, что как раз секут всякие эти преобразования к типу число, даты прописью и прочую труху :))
И тут либо открывайте книжки и начинайте потихоньку складывать буквы в слова, а слова в предложения, либо вызывайте этих колдунов, они вам за 2000 в час все наколдуют :))
10 Otkr
 
05.05.14
23:38
(9) Вооот! Первый пост по существу))))
11 листопад
 
05.05.14
23:43
(9) у всех разные способности, кто-то, как Вы выражаетесь, быстрее начинае "сечь", кто-то позже.
12 листопад
 
05.05.14
23:44
(9) Вы так усиленно свои услуги предлагаете: совсем плохо с деньгами?
13 su_mai
 
05.05.14
23:46
14 PR
 
05.05.14
23:46
(11) Да, а еще кто-то берет материалы и начинает изучать, а кто-то хочет, чтобы ему азы разжевали на форуме :))
15 Фокусник
 
05.05.14
23:46
(0) вместо
  ш_ДовДата = ДатаПрописью(ДовДата);

Поставь

Если ЗначениеЗаполнено(ДовДата) Тогда
  ш_ДовДата = ДатаПрописью(ДовДата);
Иначе
  ш_ДовДата = "";
КонецЕсли;
16 PR
 
05.05.14
23:47
(12) То есть у Газпрома по вашей логике тоже совсем труба с баблом? :))
17 листопад
 
05.05.14
23:48
(15) Спасибо, я уже тоже до этого дошла... щас посмотрю...
18 su_mai
 
05.05.14
23:48
(14) Не ну если один два вопроса, то нормально, а тут просто надо как то азы понять. Как тут объяснить?
19 листопад
 
05.05.14
23:48
(16) Вы и Газпром, я думаю, понятия несовместимые.
20 Фокусник
 
05.05.14
23:51
(19) не стОит...
21 GROOVY
 
модератор
05.05.14
23:52
Забаню ТС на сутки, думаю поможет ей в ее проблеме разобраться.
22 листопад
 
05.05.14
23:53
(21) Не надо. Я все уже сделала. Всем СПАСИБО!!!
23 GROOVY
 
05.05.14
23:53
Ну я же говорил...
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.