Имя: Пароль:
1C
1C 7.7
v7: Проверить пустое значение на бейсике
0 Maximysis
 
19.11.12
07:36
Всем доброго дня!
Сделал загрузку из экселя в документ. Теперь хочу его немного улучшить.
надо  проверять ячейку на пустоту, 1с7 пофиг((
я загружаю так:
Эксель = СоздатьОбъект("Excel.Application");
Книга = Эксель.WorkBooks.Open(ИмяПути+ИмяВыбрФайла);
Лист = Книга.WorkSheets(1);
Значение = Лист.Cells(х, у).Value;
Есть ли у Value метод проверки на пустое значение?
кто бейсик знает посоветуйте...
1 ЧеловекДуши
 
19.11.12
07:38
А причем тут 1С?
2 ЧеловекДуши
 
19.11.12
07:38
+ Мне тоже пофиг
3 ЧеловекДуши
 
19.11.12
07:39
+ Моё переменное = '' Вуаля
4 ЧеловекДуши
 
19.11.12
07:39
+ А так же

Моё переменное = Null

Вуаля
5 Maximysis
 
19.11.12
07:41
идея в проверке на nul на бейсике
если не 0 а nul то забью значение предопределенной строкой, а потом буду сравнивать. функция IsEmpty() вываливает ошибку, есть что другое??
6 Maximysis
 
19.11.12
07:42
ЧеловекДуши иди троль в другом месте
7 КонецЦикла
 
19.11.12
07:43
Если ПустоеЗначение(Значение) = 1
8 Maximysis
 
19.11.12
07:44
(7) для 1с7 одно и тоже "0" и "Null"
9 КонецЦикла
 
19.11.12
07:45
(8) Визуально что в ячейке находится?
Что-то не вкурю откуда у екселя null
10 ЧеловекДуши
 
19.11.12
07:46
(6)И вам не болеть.
Nul or Null, да мне побоку.
Смысл ты уловил. А по сути Value, в Екселе, всегда имеет текстовый тип. :)
11 ЧеловекДуши
 
19.11.12
07:48
+(8) Сори не посмотрел.
Делай так

Значение = СокрЛП(Лист.Cells(х, у).Value);

И далее проверяй на

Если ПустоеЗначение(Значение) = 1
12 КонецЦикла
 
19.11.12
07:51
(11) Ну-ка... что такого сделает СокрЛП() с пустой строкой?
Опустошит жыстачайчшым образом?
13 Maximysis
 
19.11.12
07:57
в ячейке может ничего не находица а может и быть цифра нуль, проблема в том что 1с не понимает разница, а вот бейсик..
14 Maximysis
 
19.11.12
07:58
(12) ничего не даст как будет пустая строка так и обрежется пустая строка.
15 Maximysis
 
19.11.12
07:59
(11) ПустоеЗначение ему все ровно если будет 0 или Null
16 Maximysis
 
19.11.12
08:00
или ""
17 Maximysis
 
19.11.12
08:00
идея проверять до получения в 1С
18 Maximysis
 
19.11.12
08:01
кто нибудь так заморачивался с екселем?
19 КонецЦикла
 
19.11.12
08:01
Делай запрос к листу екселя, там что хочешь твори
Или засасывай в ТЗ и твори там
Непонял нужен ноль или нет и вообще в чем проблема
20 ЧеловекДуши
 
19.11.12
08:01
(15)Какая нуль? Ты же про 1С 7.7?
Чтение из екселе через ОЛЕ?
Так тогда там всегда Строка.
21 ЧеловекДуши
 
19.11.12
08:02
+(18)Биться как дятел об одно и то же место?
Нет, ты первый :)
22 ЧеловекДуши
 
19.11.12
08:02
+(19)Ты ему еще намекни, как это сделать ;)
23 Maximysis
 
19.11.12
08:02
(19) повторяю 1С 7.7
24 КонецЦикла
 
19.11.12
08:02
ПустоеЗначение(0) = 1
ПустоеЗначение("") = 1

Это для справки
25 ЧеловекДуши
 
19.11.12
08:03
(23)Черз АДО, можно запрашивать запросы :)
26 Maximysis
 
19.11.12
08:04
(24) спасиб кэП!!!
27 КонецЦикла
 
19.11.12
08:04
(23)

База =СоздатьОбъект("ODBCDatabase");
   Если База.Соединение("DRIVER=Microsoft Excel Driver (*.xls); DBQ=" + СокрЛП(ИмяФайла)) = 0 Тогда
       Предупреждение("Ошибка открытия файла", 20);
       Возврат;
   КонецЕсли;

   RecordSetXLS =СоздатьОбъект("ODBCRecordSet");
   RecordSetXLS.УстБД(База);

   ТекстЗапроса ="
   |select *
   |from [Лист1$A1:AZ]
   |";

   ТЗ = RecordSetXLS.ВыполнитьИнструкцию(ТекстЗапроса);
28 КонецЦикла
 
19.11.12
08:04
(26) Фух...
29 ЧеловекДуши
 
19.11.12
08:04
+(24)Да просто у этого чудика в поле нарисовано "0", и если делать "СокрЛП(Value)", то всегда будет не пусто.
Ему надо преобразовать к нужному типу, типо

ПустоеЗначение(Число(Value))
30 ЧеловекДуши
 
19.11.12
08:04
(28)Тоже так подумал, ТС, тяжёлый :)
31 КонецЦикла
 
19.11.12
08:05
(29) Да, число нормально
32 КонецЦикла
 
19.11.12
08:05
А может ему и не число нужно?
33 ЧеловекДуши
 
19.11.12
08:06
(31)Нет, не нормально, там же ОЛЕ. Все имеет тип "Строка"
34 ЧеловекДуши
 
19.11.12
08:06
(32)Может, но ДНК не излечимо :)
35 Maximysis
 
19.11.12
08:07
(29)Ты не человек души а троль низнаю чего там)
СокрЛП(Value) что за бред!!
36 ЧеловекДуши
 
19.11.12
08:08
(35)Не груби, любитель НАТО, я не тролю в ветках про 1С, это святое.
37 ЧеловекДуши
 
19.11.12
08:10
(35)Держи...

   Попытка
       db=CreateObject("ADODB.Connection");
       db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ИмяФайла)+";Extended Properties=""Excel 8.0;HDR=1;IMEX=1""";
       db.Open();
       rs=CreateObject("ADODB.Recordset");
       rs.ActiveConnection = db;
       rs.CursorType = 3;
       rs.LockType = 2;
       rs.Source = "Select * from [Лист1$]";
       rs.Open();
   Исключение      
       Сообщить(ОписаниеОшибки(),"!");
       СтатусВозврата(0);
       Возврат;
   КонецПопытки;


   rs.MoveFirst();
   Пока rs.Eof()=0 Цикл    
       НомерСтроки=НомерСтроки+1;
       Если СледСтрокаДанных=0 Тогда
           СледСтрокаДанных=ОпределитьСдвигЕкселя(СдвигИндекса,rs);
           
           rs.MoveNext();
           Продолжить;
       ИначеЕсли Найти(ВРег(СокрЛП(rs.Fields(0+СдвигИндекса).Value)),"ИТОГ")>0 Тогда
           Прервать;
       ИначеЕсли СдвигИндекса>0 Тогда
           Если Найти(ВРег(СокрЛП(rs.Fields(0).Value)),"ИТОГ")>0 Тогда
               Прервать;
           Иначе
               ВсегоСтрокПоДокументу=ВсегоСтрокПоДокументу+1;
           КонецЕсли;
       Иначе
           ВсегоСтрокПоДокументу=ВсегоСтрокПоДокументу+1;
       КонецЕсли;
38 Maximysis
 
19.11.12
08:10
повторяю ячейка может быть пустая,а может быть 0
но при получение в тексте будет пустое значение?

Какое нато ты о чем????
39 ЧеловекДуши
 
19.11.12
08:11
+ Вот, еще

Процедура ЗаписатьДанныеЕксельЧерезADO(ТЗ_ДляЗаписи, ПутьИмяФайлаЕксель)
   
   //Попытка
   
       //ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьИмяФайлаЕксель)+";Extended Properties=""Excel 8.0;HDR=NO;""";//IMEX=1""";
       
       //Создадим файл Ексель...
       Catalog = 0;
       Catalog = СоздатьОбъект("ADOX.Catalog");
       Catalog.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьИмяФайлаЕксель)+";Extended Properties=""Excel 8.0;HDR=NO;""";//IMEX=1""";
       
       // Создание новой таблицы
       Table = СоздатьОбъект("ADOX.Table");
       // Имя таблицы
       Table.Name = "TestTable";
       Для Ном = 1 По 5 Цикл
           // Создание новой колонки
           Column = 0;
           Column = СоздатьОбъект("ADOX.Column");
           // Имя колонки
           Column.Name = "Col" + Ном;
           // Тип данных колонки
           Если Ном = 2 Тогда
               Column.Type = 202; // adVarWChar
           ИначеЕсли Ном = 3 Тогда
               Column.Type = 203; // adLongVarWChar
           Иначе
               Column.Type =5; // adDouble
           КонецЕсли;
           // Присоединение колонки к таблице
           Table.Columns.Append(Column);
           Column = 0;
       КонецЦикла;
       
       // Допустимые типы
       // adDouble = 5 Значение с плавающей точкой двойной точности
       // adDAte = 7 Дата
       // adCurrency = 6 Денежная сумма
       // adBoolean = 11 Булево
       // adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL
       // adLongVarWChar = 203 Длинное строковое значение
       
       // Присоединение созданной таблицы (листа) к книге Excel
       Catalog.Tables.Append(Table);
       
       //Возврат;
       
       db=0;
       db=CreateObject("ADODB.Connection");
       db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+СокрЛП(ПутьИмяФайлаЕксель)+";Extended Properties=""Excel 8.0;HDR=NO;IMEX=0"""; //""";//
       db.Open();
       
       //Узнаем количество таблиц и их наименований!!!
       тзТаблицы=0;
       тзТаблицы=СоздатьОбъект("ТаблицаЗначений");
       тзТаблицы.НоваяКолонка("Table","Строка");
       тзТаблицы.НоваяКолонка("Type","Строка");
       
       Catalog = 0;
       Catalog = СоздатьОбъект("ADOX.Catalog");
       Catalog.ActiveConnection = db;
       
       Для iCount = 0 По Catalog.Tables.Count-1 Цикл
           Если Catalog.Tables.Item(iCount).Type <> "VIEW" Тогда
               тзТаблицы.НоваяСтрока();
               TableName = Catalog.Tables.Item(iCount).Name;
               TableName = Лев(TableName,Найти(TableName,"$"));
               тзТаблицы.Table = TableName;
               тзТаблицы.Type  = Catalog.Tables.Item(iCount).Type;
           КонецЕсли;
       КонецЦикла;
       
       Если тзТаблицы.КоличествоСтрок()=0 Тогда
           db.Close();
           Возврат;
       КонецЕсли;
       
       rs=0;
       rs=CreateObject("ADODB.Recordset");
       
       шш1 = 1;
       Пока шш1 <= тзТаблицы.КоличествоСтрок() Цикл
           
           ИмяСтраницы = СокрЛП(тзТаблицы.ПолучитьЗначение(шш1,"Table"));
           Если ПустоеЗначение(ИмяСтраницы) = 1 Тогда
               тзТаблицы.УдалитьСтроку(шш1);
               Продолжить;
           КонецЕсли;
           
           //проверим таблицу!!!
           rs.ActiveConnection = db;
           rs.CursorType = 3;
           rs.LockType = 2;
           rs.Source = "Select * from ["+ИмяСтраницы+"]";
           rs.Open();
           
           Если rs.Fields.Count < 4  Тогда //это то что надо!!!
               Сообщить(""+Строка(rs.Fields.Count));
               тзТаблицы.УдалитьСтроку(шш1);
           КонецЕсли;
           
           rs.Close();
           
           шш1 = шш1 + 1;
       КонецЦикла;

       Если тзТаблицы.КоличествоСтрок()=0 Тогда
           db.Close();
           Возврат;
       КонецЕсли;
       
       //Произведем выбор из списка, интерактивно!!!
       СпсМеню = 0;
       СпсМеню = СоздатьОбъект("СписокЗначений");
       тзТаблицы.Выгрузить(СпсМеню,,,"Table");
       
       Если СпсМеню.РазмерСписка() > 1 Тогда
           ИмяСтраницы = "";
           Если СпсМеню.ВыбратьЗначение(ИмяСтраницы,"Выбрать загружаемый лист...",,60,0) <> 1 Тогда
               db.Close();
               Возврат;
           КонецЕсли;
       ИначеЕсли СпсМеню.РазмерСписка() = 1 Тогда
           ИмяСтраницы = СпсМеню.ПолучитьЗначение(1);
       Иначе
           db.Close();
           Возврат;
       КонецЕсли;
       
       //Начнем поэтапно считывать данне из таблиц!!!
       //rs=0;
       //rs=CreateObject("ADODB.Recordset");
       rs.ActiveConnection = db;
       rs.CursorType = 3;
       rs.LockType = 2;
       rs.Source = "Select * from ["+ИмяСтраницы+"]";
       rs.Open();
       
       Для Ном = 1 По 10 Цикл
           // Добавление новой записи
           rs.AddNew();
           
           rs.Fields(0).Value = Ном;
           rs.Fields(1).Value = "=10*20";
           rs.Fields(2).Value = "=20*50";
           
           // Обновление изменений в книге Excel
           rs.UpDate();
       КонецЦикла;
       
       // Закрываем соединение
       rs.Close();
       db.Close();
       
       rs = 0;
       db = 0;
       
       //rs.Fields.Count = количество колонок :) -1, т.к. начинется все с 0-ля
       
       //Еще один тест...
       СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+ПутьИмяФайлаЕксель+"; Extended Properties=""Excel 8.0;HDR=YES"";";
       
       Connection = СоздатьОбъект("ADODB.Connection");
       Connection.ConnectionString = СтрокаПодключения;
       Connection.Open();
       
       Command = СоздатьОбъект("ADODB.Command");
       Command.ActiveConnection = Connection;
       
       Command.CommandText = "CREATE TABLE [МояТаблица]
       |(Символьный char(255), Дата date, Целый int, Дробный float)";
       Command.Execute();
       
       Command.CommandText = "INSERT INTO [МояТаблица]
       |(Символьный, Дата, Целый, Дробный)
       |values ('АБВГДЕЁ', '12/4/1955', '1234567', '12345,6789')";
       Command.Execute();
       
       Command = 0;
       Connection.Close();        
       Connection = 0;
   //Исключение      
   //    Сообщить("Ошибка при загрузки данных из екселя!!!
   //    |Описание: "+ОписаниеОшибки(),"!");
   //    Возврат;
   //КонецПопытки;
   
КонецПроцедуры    // ЗаписатьДанныеЕксельЧерезADO(ТЗ_ДляЗаписи, ПутьИмяФайлаЕксель)
40 ЧеловекДуши
 
19.11.12
08:11
(38)Не отвлекайся, тролька
41 ЧеловекДуши
 
19.11.12
08:14
+ Процедура "ЗаписатьДанныеЕксельЧерезADO" не дописана.
Но если ты Прораммист 1С, то почерпнешь для себя нужную информацию. Хотя, я сомневаюсь.
42 Maximysis
 
19.11.12
08:18
что за бред! (39)
как всегда нержи бесполезно длинный код типа я самый умный, попробуй разберись))))))
43 ЧеловекДуши
 
19.11.12
08:20
(42)Там комментарии.
И там запись Excel через ADO, без самого Excel-ля. :)

А по сути там есть все, вплоть для получения списка страниц в екселе.
44 Maximysis
 
19.11.12
08:20
Кто с бейсиком работал люди отзовитесь
45 ЧеловекДуши
 
19.11.12
08:21
+(42)Я на другое и не расчитывал :)
46 ЧеловекДуши
 
19.11.12
08:21
+(44) Какой бейсик?

Вот тут ищи http://www.forum.mista.ru/find.php :)
47 Maximysis
 
19.11.12
08:23
(43)короче не знаешь Excel.Application  нечего тролить!
48 КонецЦикла
 
19.11.12
08:23
Еще есть вариант: выполнить макрос екселя из 1с по замене то что не нужно на то что нужно

ЗЫ. так и не понял что нужно автору
49 Maximysis
 
19.11.12
08:24
вопрос был не поро адо
50 Maximysis
 
19.11.12
08:24
(48) не выход доки будут разные, вписывать макрос в док при открытии геморойней((
51 ЧеловекДуши
 
19.11.12
08:25
(49)А вы неадекват. ;)
Вас даже (48) Многоуважаемый КонецЦикла не понимает :)
52 ЧеловекДуши
 
19.11.12
08:26
(50)Отдышись, и напиши нормально, что тебе надо. А то ЯнечегоНеПонимаю :)
53 КонецЦикла
 
19.11.12
08:28
(50) Можно запускать макрос из одного и того же шаблона
Он будет творить чудеса с файлом

ЗЫ. Ваш кеп
56 Maximysis
 
19.11.12
08:33
(53) да попробую если с бейсиком не разберусь(
57 КонецЦикла
 
19.11.12
08:34
Товарищи, будьте вежливы
59 ЧеловекДуши
 
19.11.12
08:35
(53)Ему не по может. У него же много екселей и разного формата :)
60 КонецЦикла
 
19.11.12
08:36
(56) Выведи Сообщить(Значение)
Увидишь что там такое получается
Далее орудуй по ситуации
Никто не понял нужен ноль или нет и что вообще нужно
61 Maximysis
 
19.11.12
08:50
(60)Нужен и ноль и пустое значение. Сейчас если пустое значение я заменяю на необходимые числа. Мне нужно отлавливать где в ексле пустое значение а где 0.
чтобы нуль не трогать.
62 Мимохожий Однако
 
19.11.12
08:52
(61)Зачем это семерке? Она всё равно не различает пустое значение и нуль, если считывает число.
63 КонецЦикла
 
19.11.12
08:53
Тогда ПустаяСтрока(), возможно, далее проверка на 0
64 Maximysis
 
19.11.12
09:02
(62) вот по этому я и хочу определять это не в семерке....
(63) Нет смотри. я загружаю ексел с ячейками а1=0 а2=null
ПустоеЗначение = Лист.Cells(а, 1).Value = Лист.Cells(а, 2).Value;
поэтом нужно чтото типа  Если Value.IsEmpty()=1 Тогда
текущаяСтрока="СтрокаИндификаторПустойСтроки";
Конецесли;
а потом при обработке сравнивать Если текущееЗначение="СтрокаИндификаторПустойСтроки" Тогда
текущееЗначение= ВычислитьЧтоТо();
КонецЕсли;
65 Мимохожий Однако
 
19.11.12
09:05
(64) к какой ошибке в семерке приводит то, что не можешь отличить Пустое значение от нуля?
66 vde69
 
19.11.12
09:06
Попытка
       ТекущееЗначениеФормулы = ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula;
       Если ТекущееЗначениеФормулы <> "" Тогда
           Если Лев(ТекущееЗначениеФормулы, 1) <> "=" Тогда
               Результат.Вставить("ЭтоФормула", Ложь);
               Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
           Иначе
               Результат.Вставить("ЭтоФормула", Истина);
               Если Лев(СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).text),1) = "#" Тогда
                   Результат.Вставить("ЗначениеЯчейки", Неопределено);
               Иначе
                   Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
               КонецЕсли;

               Если ПолучатьТекстФормулы Тогда  
                   Результат.Вставить("ТекстФормулы", СокрЛП(ТекущееЗначениеФормулы));
               КонецЕсли;
           КонецЕсли;
       Иначе
           Результат.Вставить("ЭтоФормула", Ложь);
           Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
       КонецЕсли;    
       
       Если ПолучатьОформление Тогда
           Результат.Вставить("ЦветЯчейки", СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).Interior.ColorIndex));
           // здесь можно добавить и другие....
       КонецЕсли;
       
   Исключение
       Результат = Неопределено;
   КонецПопытки;
67 Maximysis
 
19.11.12
09:08
(65) в 1С7 ПустаяСтрока и 0 равны.
68 Мимохожий Однако
 
19.11.12
09:10
(67)То что они это давно ясно )))
Повторюсь: зачем нужно различать? Должно быть, разное поведение в семерке?
В таком случае проще сначала запустить макрос и для пустого значения явно прописать нужное значение перед обработкой из 77
69 ЧеловекДуши
 
19.11.12
09:11
(66)Спасибо :)
А исключения в какой момент могут иметь место?
70 Maximysis
 
19.11.12
09:16
(66) нету проверки на пустое значение(
(67)Да нужно различать я писал (64).
да есть некрасивый вариант в ексели заменять 0 например на "#*123абв@!^",
и потом сравнивать при загрузке. то хотелось бы все проверять при загрузке....
71 vde69
 
19.11.12
09:18
(70) пустое значение вернет "неопределено"
а NULL в екселе в ячейке не может лежать...
72 Maximysis
 
19.11.12
09:34
(71)про Null я образно говорю)
Как я понял  если пустая ячейка то ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula;
вызовит ошибку и так поймать NUll??
73 vde69
 
19.11.12
09:39
в екселе есть функции ЕПУСТО, ЕНД

но приведеный мною код корректно все отрабатывает...
74 Popkorm
 
19.11.12
11:15
(61)
Значение = СокрЛП(Лист.Cells(х, у).Value);
Если Значение = "" Тогда

ИначеЕсли Значение = 0 Тогда

ИначеЕсли Значение = "0" Тогда


ИначеЕсли ПустоеЗначеине(Значение) = 1 Тогда
75 Maximysis
 
20.11.12
08:20
(74) Спасибо решил похожим способом
Если (ПустоеЗначеине(ЗначениеИзЕкселя)=0) и (ТипЗначенияСтр(ЗначениеИзЕкселя)="Число") Тогда
значение=ЗначениеИзЕкселя;
КонецЕсли;
Заметил что если в екселе был нуль то тип значения числовое, а если ячейка пустая то тип не определенный.
Тема закрыта.