Имя: Пароль:
1C
1C 7.7
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 = Что_То Тогда и т.д.


ц0 = ВходExcel.ActiveSheet.Cells(инСтроки,ин);
ц1 = ц0.Value;
ц2 = Сокрлп(ц1);
ТзФ.УстановитьЗначение(ТзФ.НомерСтроки,ин,ц2);
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) движок форума автоматом это делает для "простыней"
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн