| 
    
            
         
         | 
    
  | 
v7: Несовпадение типов при загрузке из Excel | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        kobzon2    
     12.09.14 
            ✎
    09:52 
 | 
         
        Заполняю ТЗ из Excel. Бывает что пользователи в excelе собьют формулу или еще что и в ячейке, значение которой нужно установить получается #ЗНАЧ!. 1С выдает ошибку Несовпадение типов и намертво зависает.
 
        Попробовал вставить попытку не помогло: Для инСтроки=НСтрока По КСтрока Цикл ТзФ.НоваяСтрока(); Для ин=1 По ЧислоКолонок Цикл Попытка ТзФ.УстановитьЗначение(ТзФ.НомерСтроки,ин,Сокрлп(ВходExcel.ActiveSheet.Cells(инСтроки,ин).Value)); Исключение // Ошибка несоответствия типов Предупреждение(ОписаниеОшибки()); Возврат; КонецПопытки; КонецЦикла; КонецЦикла Что еще можно придумать?  | 
|||
| 
    1
    
        kosts    
     12.09.14 
            ✎
    10:18 
 | 
         
        (0) Попробовать отловить конкретное место ошибки. Выяснить какое значение у Value, если в ячейке #ЗНАЧ! . Может достаточно написать Если Value = Что_То Тогда и т.д.
 
        
     | 
|||
| 
    2
    
        FN    
     12.09.14 
            ✎
    10:21 
 | 
         
        спОшибки=СоздатьОбъект("СписокЗначений");
 
        спОшибки.ДобавитьЗначение("#ПУСТО!"); спОшибки.ДобавитьЗначение("#ДЕЛ/0!"); спОшибки.ДобавитьЗначение("#ЗНАЧ!"); спОшибки.ДобавитьЗначение("#ССЫЛКА!"); спОшибки.ДобавитьЗначение("#ИМЯ?"); спОшибки.ДобавитьЗначение("#ЧИСЛО!"); спОшибки.ДобавитьЗначение("#Н/Д"); //Для англ. версии спОшибки.ДобавитьЗначение("#NULL!"); спОшибки.ДобавитьЗначение("#DIV/0!"); спОшибки.ДобавитьЗначение("#VALUE!"); спОшибки.ДобавитьЗначение("#REF!"); спОшибки.ДобавитьЗначение("#NAME?"); спОшибки.ДобавитьЗначение("#NUM!"); спОшибки.ДобавитьЗначение("#N/A"); Если спОшибки.НайтиЗначение(СокрЛП(ЗагружаемаяОбласть.Cells(х,у).Text))<>0 Тогда значЕ=ЗагружаемаяОбласть.Cells(х,у).Text; Иначе значЕ=ЗагружаемаяОбласть.Cells(х,у).Value; КонецЕсли; Это из 7.7. В 8-ке можно попробовать через ТипЗнч определить тип значения, но я лично не пробовал.  | 
|||
| 
    3
    
        Zhuravlik    
     12.09.14 
            ✎
    10:22 
 | 
         
        (0) использовать Йоксель, и посмотреть как это выглядит в конверторе в таблицу значений     
         | 
|||
| 
    4
    
        FN    
     12.09.14 
            ✎
    10:22 
 | 
         
        (0) и переведи код на использование ComSafeArray - благо в 8-ке он поддерживается штатно.     
         | 
|||
| 
    5
    
        Zhuravlik    
     12.09.14 
            ✎
    10:23 
 | 
         
        (4) Вроде рубрика "7.7 и ранние"?..     
         | 
|||
| 
    6
    
        kobzon2    
     12.09.14 
            ✎
    10:31 
 | 
         
        (5) Да это 7.7     
         | 
|||
| 
    7
    
        FN    
     12.09.14 
            ✎
    10:34 
 | 
         
        (5) а блин, не увидел :)
 
        (6) лови готовый код На вход подаешь ВходExcel.ActiveSheet и на форме ТаблицаЗначений "ТЗ" заполняется данными с листа. Процедура ЗагрузитьИзЕкселя(Лист) Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language="javascript"; Скрипт.timeout=-1; Mas=Лист.UsedRange; Скрипт.addobject("Mas",Mas); Массив=Скрипт.eval("Массив=new VBArray(Mas.Value)"); спШирина=СоздатьОбъект("СписокЗначений"); Строк=Массив.ubound(1); Столбцов=Массив.ubound(2); Для у=1 по Столбцов Цикл ТЗ.НоваяКолонка(); спШирина.ДобавитьЗначение(1); КонецЦикла; Форма.ТЗ.Видимость(0); Для л=Массив.lbound(1) По Массив.ubound(1) Цикл Если л%10=0 тогда ТекстИнфо="Чтение файла: обработано "+л+" из "+Строк+" строк"; КонецЕсли; Форма.Обновить(0); ТЗ.НоваяСтрока(); Для к=Массив.lbound(2) По Массив.ubound(2) Цикл Если Скрипт.eval("typeof(Массив.getItem("+л+","+к+"))")="unknown" тогда Продолжить; КонецЕсли; Попытка значЕ=(Массив.getItem(л,к)); ТЗ.УстановитьЗначение(л,к,значЕ); Если СтрДлина(СокрЛП(Строка(ЗначЕ)))>спШирина.ПолучитьЗначение(к) тогда Если СтрДлина(СокрЛП(Строка(ЗначЕ)))<40 тогда спШирина.УстановитьЗначение(к,СтрДлина(СокрЛП(Строка(ЗначЕ)))); КонецЕсли; КонецЕсли; исключение Сообщить("Ошибка в строке:"+л+", в колонке:"+к); КонецПопытки; КонецЦикла; КонецЦикла; для ш=1 по спШирина.РазмерСписка() Цикл ТЗ.УстановитьПараметрыКолонки(ш,,,,,спШирина.ПолучитьЗначение(ш)*1.25); КонецЦикла; Форма.ТЗ.Видимость(1); КонецПроцедуры  | 
|||
| 
    8
    
        kobzon2    
     12.09.14 
            ✎
    11:01 
 | 
         
        (7) Чето как то я очкую работать со скриптами)     
         | 
|||
| 
    9
    
        FN    
     12.09.14 
            ✎
    11:12 
 | 
         
        (8) попробуй грузануть большую таблицу своим методом и с помощью скрипта - перестанешь очковать.     
         | 
|||
| 
    10
    
        kobzon2    
     12.09.14 
            ✎
    11:28 
 | 
         
        (9) В принципе мне (1) и (2) нравится, но 1 чето не получается получить значение Value.     
         | 
|||
| 
    11
    
        FN    
     12.09.14 
            ✎
    11:31 
 | 
         
        1 - нерабочее     
         | 
|||
| 
    12
    
        kobzon2    
     12.09.14 
            ✎
    12:35 
 | 
         
        (11) Сделал как в (2) - Спасибо!!!
 
        Еще не скромный вопрос: как код убирать в спойлер?  | 
|||
| 
    13
    
        kosts    
     12.09.14 
            ✎
    12:35 
 | 
         
        (11) Предложил универсальный способ ...
 
        Вот так можно еще Если Excel.IsError(Excel.ActiveSheet.Cells(1,1)) = True Тогда  | 
|||
| 
    14
    
        kosts    
     12.09.14 
            ✎
    12:41 
 | 
         
        Хотя и предложенный вариант вроде верный только тип нужно проверить
 
        http://stackoverflow.com/questions/2424718/how-to-know-if-a-cell-has-an-error-in-the-formula-in-c-sharp -2146826281 = #Div/0! -2146826246 - #N/A -2146826259 = #Name? -2146826288 = #Null! -2146826252 = #Num! -2146826265 = #Ref! -2146826273 = #Value!  | 
|||
| 
    15
    
        FN    
     12.09.14 
            ✎
    12:42 
 | 
         
        (13) хороший метод, лучше чем 2 (там только для двух языков сработает, а если локаль не рус/анг - то облом). 
 
        Тока в 7.7 True нет. Я лично уже давно гружу через ComSafeArray - разница в скорости огромна.  | 
|||
| 
    16
    
        FN    
     12.09.14 
            ✎
    12:43 
 | 
         
        (12) движок форума автоматом это делает для "простыней"     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |