Добрый день, уважаумое сообщество.
1с77. Самописная.
При чтении из Эксель файла есть ячкйка с значением #Н/Д. При попытке прочтения данной ячейки 1с77 вываливает ошибку "Несовпадение типов." а затем клент виснит. помогает только сняте задачи в диспечере устройств.
Пробовал
Цена=Лист.Cells(НомерСтроки,НомерКолонки).Text;
Попытка Исключение КонецПопытки;
! | http://pro1c.org.ua/index.php?act=announce&id=2: 4, 5 |
Доброго дня.
У загальному:
Цена = Лист.Cells(НомерСтроки, НомерКолонки).Value
Цена = Число(Строка(Лист.Cells(НомерСтроки,НомерКолонки).Value))
Naghual @ Сегодня, 11:11
,
Помилка: Несовпадение типов продовжує випадати. Які ще будуть у Вас ідеї?
Спробував:
спОшибки=СоздатьОбъект("СписокЗначений");
спОшибки.ДобавитьЗначение("#ПУСТО!");
спОшибки.ДобавитьЗначение("#ДЕЛ/0!");
спОшибки.ДобавитьЗначение("#ЗНАЧ!");
спОшибки.ДобавитьЗначение("#ССЫЛКА!");
спОшибки.ДобавитьЗначение("#ИМЯ?");
спОшибки.ДобавитьЗначение("#ЧИСЛО!");
спОшибки.ДобавитьЗначение("#Н/Д");
//Для англ. версии
спОшибки.ДобавитьЗначение("#NULL!");
спОшибки.ДобавитьЗначение("#DIV/0!");
спОшибки.ДобавитьЗначение("#VALUE!");
спОшибки.ДобавитьЗначение("#REF!");
спОшибки.ДобавитьЗначение("#NAME?");
спОшибки.ДобавитьЗначение("#NUM!");
спОшибки.ДобавитьЗначение("#N/A");
Если спОшибки.НайтиЗначение(СокрЛП(ЗагружаемаяОбласть.Cells(х,у).Text))<>0 Тогда
значЕ=ЗагружаемаяОбласть.Cells(х,у).Text;
Иначе
значЕ=ЗагружаемаяОбласть.Cells(х,у).Value;
КонецЕсли;
Щось не можу повторити таку поведінку. Поділиться проблемною часткою Екселя для експеріментів.
сч=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 Тогда
По перше, я питав про Ексель файл а ви привели код 1С.
По друге:
-
Если (число(Значение)>0) и (СтрДлина(Значение)=СтрДлина(число(Значение))) Тогда
тут (число(Значение)) вже буде помилка (двічі) при невірних даних екселю.спОшибки=СоздатьОбъект("СписокЗначений"); ....
Нащо створювати та наповнювати список кожного разу?
Цей код поки що тестовий... зліплений з кусків.
Підкажіть, як швидко Вам скинуті цей файл?
-
Если (число(Значение)>0) и (СтрДлина(Значение)=СтрДлина(число(Значение))) Тогда
не бачу в цьому сенсу
http://pro1c.org.ua/redirect.php?https://ru.files.fm/u/8z7cajzs
Excel.DisplayAlerts = 0;
Пока НомерСтроки < 40 Цикл
Если Excel.IsError(Лист.Cells(НомерСтроки, Колонка)) = -1 Тогда
НомерСтроки = НомерСтроки + 1;
Продолжить;
КонецЕсли;
Попытка
Значение = Лист.Cells(НомерСтроки, Колонка).Value;
Сообщить(Значение);
КонецПопытки;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Если Excel.IsError(Лист.Cells(НомерСтроки, Колонка)) = -1 Тогда
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua