Версия для печати темы (https://pro1c.org.ua/index.php?s=bb91b2ab51becec180a936a3d6df30e7&showtopic=44399)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ При попытке прочтения ячейки #Н/Д вываливается ошибка "Несовпадение типов" и виснет клиент

Автор: l2d808 27.02.18, 11:01

Добрый день, уважаумое сообщество.
1с77. Самописная.
При чтении из Эксель файла есть ячкйка с значением #Н/Д. При попытке прочтения данной ячейки 1с77 вываливает ошибку "Несовпадение типов." а затем клент виснит. помогает только сняте задачи в диспечере устройств.
Пробовал

Цена=Лист.Cells(НомерСтроки,НомерКолонки).Text;

также не помегает:
Попытка Исключение КонецПопытки;

Пдскажите пожалуйста, кто знает, как или прочитать эту ячейку или ее пропустить...


 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 4, 5
 

Автор: Naghual 27.02.18, 11:11

Доброго дня.
У загальному:

Цена = Лист.Cells(НомерСтроки, НомерКолонки).Value

У складному:
Цена = Число(Строка(Лист.Cells(НомерСтроки,НомерКолонки).Value))

Автор: l2d808 27.02.18, 11:33

Naghual @ Сегодня, 11:11 * ,
Помилка: Несовпадение типов продовжує випадати. Які ще будуть у Вас ідеї?


Спробував:

спОшибки=СоздатьОбъект("СписокЗначений");
        спОшибки.ДобавитьЗначение("#ПУСТО!");

        спОшибки.ДобавитьЗначение("#ДЕЛ/0!");

        спОшибки.ДобавитьЗначение("#ЗНАЧ!");

        спОшибки.ДобавитьЗначение("#ССЫЛКА!");

        спОшибки.ДобавитьЗначение("#ИМЯ?");

        спОшибки.ДобавитьЗначение("#ЧИСЛО!");

        спОшибки.ДобавитьЗначение("#Н/Д");

        //Для англ. версии

        спОшибки.ДобавитьЗначение("#NULL!");

        спОшибки.ДобавитьЗначение("#DIV/0!");

        спОшибки.ДобавитьЗначение("#VALUE!");

        спОшибки.ДобавитьЗначение("#REF!");

        спОшибки.ДобавитьЗначение("#NAME?");

        спОшибки.ДобавитьЗначение("#NUM!");

        спОшибки.ДобавитьЗначение("#N/A");


Если спОшибки.НайтиЗначение(СокрЛП(ЗагружаемаяОбласть.Cells(х,у).Text))<>0 Тогда
значЕ=ЗагружаемаяОбласть.Cells(х,у).Text;
Иначе
значЕ=ЗагружаемаяОбласть.Cells(х,у).Value;
КонецЕсли;

Не ловиться...
Та сама помилка...

Автор: Naghual 27.02.18, 11:34

Щось не можу повторити таку поведінку. Поділиться проблемною часткою Екселя для експеріментів.

Автор: l2d808 27.02.18, 11:43

сч=0;
                        НомерСтроки=1;
                        пока сч<40 цикл
                            //Сообщить(сч);
                            колонка=спр2.цена;
                            попытка
                                Значение = Лист.Cells(НомерСтроки, колонка).Value;
                                если ПустоеЗначение(Значение)=0 тогда
                                    Если (число(Значение)>0) и (СтрДлина(Значение)=СтрДлина(число(Значение))) Тогда
                                        спОшибки=СоздатьОбъект("СписокЗначений");
                                        спОшибки.ДобавитьЗначение("#ПУСТО!");
                                        
                                        спОшибки.ДобавитьЗначение("#ДЕЛ/0!");
                                        
                                        спОшибки.ДобавитьЗначение("#ЗНАЧ!");
                                        
                                        спОшибки.ДобавитьЗначение("#ССЫЛКА!");
                                        
                                        спОшибки.ДобавитьЗначение("#ИМЯ?");
                                        
                                        спОшибки.ДобавитьЗначение("#ЧИСЛО!");
                                        
                                        спОшибки.ДобавитьЗначение("#Н/Д");
                                        
                                        //Для англ. версии
                                        
                                        спОшибки.ДобавитьЗначение("#NULL!");
                                        
                                        спОшибки.ДобавитьЗначение("#DIV/0!");
                                        
                                        спОшибки.ДобавитьЗначение("#VALUE!");
                                        
                                        спОшибки.ДобавитьЗначение("#REF!");
                                        
                                        спОшибки.ДобавитьЗначение("#NAME?");
                                        
                                        спОшибки.ДобавитьЗначение("#NUM!");
                                        
                                        спОшибки.ДобавитьЗначение("#N/A");
                                        
                                        
                                        Если спОшибки.НайтиЗначение(СокрЛП(Лист.Cells(НомерСтроки,спр2.Цена).Text))<>0 Тогда
                                            Цена=Лист.Cells(НомерСтроки,спр2.Цена).Text;
                                        Иначе
                                            Цена=Лист.Cells(НомерСтроки,спр2.Цена).Text;
                                        КонецЕсли;
                                        
                                        сообщить("Проверка на ошбку: "+Цена);
                                        позиции=позиции+1;
                                        Сообщить(НомерСтроки);
                                        сч=0;
                                        Название=Строка(Лист.Cells(НомерСтроки,спр2.Наименование_по_прайсу).Value);//Название
                                        ПолноеНазвание=Название;
                                        Если (пустоеЗначение(спр2.Доп_Наим_Полн_Колонка)=0) Тогда
                                            ПолноеНазвание=ПолноеНазвание+"**"+Строка(Лист.Cells(НомерСтроки,спр2.Доп_Наим_Полн_Колонка).Value);//Дополнительное название к колонке рядом
                                        КонецЕсли;
                                        Если (пустоеЗначение(спр2.Доп_Наим_Полн_Колонка1)=0) Тогда
                                            ПолноеНазвание=ПолноеНазвание+"**"+Строка(Лист.Cells(НомерСтроки,спр2.Доп_Наим_Полн_Колонка1).Value);//Дополнительное название к колонке рядом
                                        КонецЕсли;
                                        Если (пустоеЗначение(спр2.Доп_Наим_колонка)=0) и (пустоеЗначение(спр2.Доп_Наим_Строка)=0) Тогда
                                            ПолноеНазвание=ПолноеНазвание+"**"+Строка(Лист.Cells(спр2.Доп_Наим_Строка,спр2.Доп_Наим_колонка).Value);//Дополнительное название в ячейке
                                        Иначе
                                            Если (пустоеЗначение(спр2.Доп_Наим_колонка)=0) или (пустоеЗначение(спр2.Доп_Наим_Строка)=0) Тогда
                                                Сообщить("Ошибка в координатах допонительного наименования в "+Значение+" на листе № "+НомерЛиста);
                                                Эксель.Quit();
                                                возврат;
                                            КонецЕсли;
                                        КонецЕсли;
                                        //сообщить(Название);
                                        Если пустоеЗначение(спр2.Код_по_прайсу)=0 Тогда
                                            код=Лист.Cells(НомерСтроки,спр2.Код_по_прайсу).Value;//Артикул
                                            //Сообщить(код);
                                        КонецЕсли;
                                        Если пустоеЗначение(спр2.ед_изм)=0 Тогда
                                            ед=Лист.Cells(НомерСтроки,спр2.ед_изм).Value;//Единицы измерения
                                            //сообщить(ед);
                                        КонецЕсли;
                                        ТЗ.НоваяСтрока();
                                        ТЗ.Артикул=код;
                                        ТЗ.Наименование=Название;
                                        ТЗ.ПолноеНаименование=ПолноеНазвание;
                                        Если ПустоеЗначение(спр2.Валюта)=0 Тогда
                                            ТЗ.Валютная_Цена=ОКР(Число(Цена),2);
                                            ТЗ.Валюта=спр2.Валюта;
                                            ТЗ.Цена="";
                                        Иначе
                                            ТЗ.Валютная_Цена="";
                                            ТЗ.Валюта=спр2.Валюта;
                                            ТЗ.Цена=окр(Число(Цена),2);
                                            ТЗ.Сайт=спр.Сайт;
                                            ТЗ.ДатаЗагрузки=спр.ДатаЗагрузки;
                                        КонецЕсли;
                                        ТЗ.Наименование=сокрЛП(ТЗ.Наименование);
                                        ТЗ.ПолноеНаименование=СокрЛП(ТЗ.ПолноеНаименование);
                                        
                                        ТЗ.ед_изм=ед;
                                        ТЗ.Сайт=спр.Сайт;
                                        ТЗ.ДатаЗагрузки=спр.Датазагрузки;
                                    Конецесли;
                                Иначе
                                    сч=сч+1;
                                Конецесли;
                                
                            Исключение
                                
                            КонецПопытки;
                            НомерСтроки=НомерСтроки+1;
                        КонецЦикла;




Пробовал проводить проверку на ошибку
Если Найти (Эксель.Cells(з1, з2).Formula,"#REF") =0 Тогда

Не ловит тоже...

Автор: Naghual 27.02.18, 11:44

По перше, я питав про Ексель файл а ви привели код 1С.
По друге:
-

Если (число(Значение)>0) и (СтрДлина(Значение)=СтрДлина(число(Значение))) Тогда
тут (число(Значение)) вже буде помилка (двічі) при невірних даних екселю.
-
спОшибки=СоздатьОбъект("СписокЗначений"); ....
Нащо створювати та наповнювати список кожного разу?

Автор: l2d808 27.02.18, 11:48

Цей код поки що тестовий... зліплений з кусків.
Підкажіть, як швидко Вам скинуті цей файл?

Автор: Naghual 27.02.18, 11:49

-

Если (число(Значение)>0) и (СтрДлина(Значение)=СтрДлина(число(Значение))) Тогда
не бачу в цьому сенсу

Автор: l2d808 27.02.18, 11:52

http://pro1c.org.ua/redirect.php?https://ru.files.fm/u/8z7cajzs

Цитата(Naghual @ 27.02.18, 11:49) *
не бачу в цьому сенсу

Я з Вами згоден. :-)

Автор: Naghual 27.02.18, 16:25

Excel.DisplayAlerts = 0;
Пока НомерСтроки < 40 Цикл
    Если Excel.IsError(Лист.Cells(НомерСтроки, Колонка)) = -1 Тогда
        НомерСтроки = НомерСтроки + 1;
        Продолжить;
    КонецЕсли;
    Попытка
        Значение = Лист.Cells(НомерСтроки, Колонка).Value;
        Сообщить(Значение);
    КонецПопытки;
    НомерСтроки = НомерСтроки + 1;
КонецЦикла;


Цитата(Zaval @ 27.02.18, 17:23) *
Я б спробував конструкцію "Попытка - Исключение"

Не спрацює, бо помилка виникає на стороні ОЛЄ-Сервера.

Автор: Zaval 27.02.18, 16:35

Цитата(Naghual @ 27.02.18, 16:25) *
Не спрацює, бо помилка виникає на стороні ОЛЄ-Сервера.

Тоді треба аналізувати "на тій стороні" - засобами Екселя. Або модифікувати там.

Автор: Naghual 27.02.18, 16:37

Цитата(Zaval @ 27.02.18, 17:35) *
Тоді треба аналізувати "на тій стороні" - засобами Екселя. Або модифікувати там.

Саме таке рішення я і запропонував:
 Если Excel.IsError(Лист.Cells(НомерСтроки, Колонка)) = -1 Тогда

Автор: Zaval 27.02.18, 16:46

Цитата(Naghual @ 27.02.18, 16:37) *
Саме таке рішення я і запропонував:

Варіант, але чи сприймає сам Ексель це як помилку?

Там в коді - жорстке обмеження кількості рядків.
Може, якщо зробити правильно - визначити робочу зону засобами Екселя - то проблема зникне?
Просто файлів читав багато, з таким не стикався...

Автор: Naghual 27.02.18, 16:50

Цитата(Zaval @ 27.02.18, 17:46) *
Варіант, але чи сприймає сам Ексель це як помилку?

Повинен. Я перевіряв - у мене працює.

А решта коду - то лише для тестування. )

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua