Новости для бухгалтера, бухучет, налогообложение, отчетность, ФСБУ, прослеживаемость и маркировка, 1С:Бухгалтерия

Вход или Регистрация

Показывать по 10 20 40 сообщений
Новая тема Ответить
Письмо в техподдержку 1С
[Прочее]

Вопрос: Как делать в 1Сv8 SQL запросы к COM Объекту ?( Excel)? Кто нибудь делал?

GeorgeU
читатель
офлайн
Дата регистрации: 28.01.2008
Сообщений: 68
Пост №1
 
06.04.2009 19:14

Добрый день! <br><br>Возникла проблема. Я сделал выгрузку из Excel в 1С8. Выгрузилось, но при выборочной проверке выяснилось, что выгрузка получилось некорректной. Объем строк в Excel более 14000. 4 Столбца. Итого получается, что надо проверить 56000 ячеек. Это трудно. <br>Возникла тогда у меня идея сделать программу проверки выгрузки. То есть находт в 1С документ, ищет его в Excel (путем перебора! ) и ставит 1 если нашла. Не нашла- ничего не ставит. <br>Всё бы хорошо, да долго. Перебор значений с критерием по трем столбцам занимает мн-о-о-о-го времени. Дня так по моим подсчетам два. Два дня. А время не терпит. <br>Тогда то дошло до меня, что запрос быстрее. Суть запроса- выбрать сразу например некую область из Excel       Range(А1:D14000) но фига не понимаю как обращаться к Com объекту! То есть простую вещь перебором цикла ДокЭксель.Sheets(1).Cells (n,7).Value (где n переменная) я понимаю. А чуть сложнее....увы.<br>Кто нибудь подскажет?

ПСВ
читатель
офлайн
Дата регистрации: 06.04.2009
Сообщений: 379
Пост №2
 
06.04.2009 22:56

"можно через АДО только смысла нет - все равно цикл рекордсета придется перебирать<br>попробуй этот способ надеюсь разберешься ((((<br><br>Процедура Кнопка1Нажатие(Элемент)<br> ПутьКФайлу = "C:\Files\Обмен1с\Nomenklatura.xls";<br>попытка<br> Ексель = Новый COMОбъект("Excel.Application") ;<br>исключение<br> Сообщить(ОписаниеОшибки()); <br> Сообщить("Не удалось инициализировать Excel"); <br> Возврат; <br>КонецПопытки; <br>//..................................................<br>попытка <br> ФайлЕксель = Ексель.Workbooks.Open(ПутьКФайлу); <br> //..............................................<br>КС = Новый КвалификаторыСтроки(250);<br>Массив = Новый Массив;<br>Массив.Добавить(Тип("Строка"));<br>ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);<br> //----будем считать что все данные в Эксель типа Строка---<br> ТЗ =Новый ТаблицаЗначений;<br> ТЗ.Колонки.Добавить("Колонка1",ОписаниеТиповС);<br> ТЗ.Колонки.Добавить("Колонка2",ОписаниеТиповС);<br> ТЗ.Колонки.Добавить("Колонка3",ОписаниеТиповС);<br> ТЗ.Колонки.Добавить("Колонка4",ОписаниеТиповС);<br> //-----и сравнивать их будем тоже со строкой--------------------<br> ТЗДокументы =Новый ТаблицаЗначений;<br> ТЗДокументы.Колонки.Добавить("Номер",ОписаниеТиповС);<br> ТЗДокументы.Колонки.Добавить("Организация",ОписаниеТиповС);<br> ТЗДокументы.Колонки.Добавить("Контрагент",ОписаниеТиповС);<br> ТЗДокументы.Колонки.Добавить("Склад",ОписаниеТиповС);<br><br><br>Колонки =1;<br>Строки =2; //заголовок не берем<br>КоличествоСтраниц = 1;<br>ТекНомерЛиста =1;<br><br> //сколько непустых строк<br> ВсегоКоличестовСтрок = Ексель.Sheets(ТекНомерЛиста).UsedRange.row + Ексель.Sheets(ТекНомерЛиста).UsedRange.Rows.Count - 1;<br> //сколько непустых колонок<br> //ВсегоКоличестовКолонок = Ексель.Sheets(ТекНомер).UsedRange.Column + Ексель.Sheets(ТекНомер).UsedRange.Columns.Count - 1<br> <br> для строки = 2 по ВсегоКоличестовСтрок цикл<br> //или<br> //Пока Ексель.Sheets(ТекНомер).Cells(Строки,1).Value <> Неопределено Цикл<br> НовСтрока =ТЗ.Добавить();<br> НовСтрока.Колонка1 = Ексель.Sheets(ТекНомерЛиста).Cells(Строки,Колонки ).Value;<br> НовСтрока.Колонка2 = Ексель.Sheets(ТекНомерЛиста).Cells(Строки,Колонки +1).Value;<br>       НовСтрока.Колонка3 = Ексель.Sheets(ТекНомерЛиста).Cells(Строки,Колонки +2).Value;<br> НовСтрока.Колонка4 = Ексель.Sheets(ТекНомерЛиста).Cells(Строки,Колонки +3).Value;<br><br> КонецЦикла;<br> //-------------------------------------------------------------------<br> МенеджерВТ =новый МенеджерВременныхТаблиц;<br> Запрос =Новый Запрос;<br> Запрос.МенеджерВременныхТаблиц =МенеджерВТ;<br> Запрос.Текст = "ВЫБРАТЬ Колонка1,колонка2,колонка3,колонка4<br> | ПОМЕСТИТЬ ВременнаяТаблицаЭксель <br> | ИЗ<br> | &ВнешнийИсточник как ВнешнийИсточник <br> |";<br> Запрос.УстановитьПараметр("ВнешнийИсточник",ТЗ);<br> Запрос.Выполнить();<br> <br> //----приводим все данные документов к строке т.к в запросе это сделать нельзя-------- <br> Запрос.Текст ="ВЫБРАТЬ<br> | Представление(ПоступлениеТоваровУслуг.Номер) как Номер ,<br> | Представление(ПоступлениеТоваровУслуг.Организация) как Организация, <br> | Представление(ПоступлениеТоваровУслуг.Контрагент) как Контрагент ,<br> | Представление(ПоступлениеТоваровУслуг.Склад) как Склад<br> | ИЗ<br> | Документ.ПоступлениеТоваровУслуг как ПоступлениеТоваровУслуг<br> |";<br> выборка = Запрос.Выполнить().Выбрать();<br> Пока выборка.Следующий() цикл<br> НовСтрока= ТЗДокументы.Добавить();<br> НовСтрока.Номер =Строка(выборка.Номер);<br> НовСтрока.Организация =Строка(выборка.Организация);<br> НовСтрока.Контрагент =Строка(выборка.Контрагент);<br> НовСтрока.Склад =Строка(выборка.Склад);<br> КонецЦикла;<br> <br> //------------------------------------------------------------- <br> Запрос.Текст = "ВЫБРАТЬ Номер,Организация,Контрагент,Склад<br> | ПОМЕСТИТЬ ВременнаяТаблицаДокументы <br> | ИЗ<br> | &ВнешнийИсточникДокументы как ВнешнийИсточникДокументы <br> |";<br> Запрос.УстановитьПараметр("ВнешнийИсточникДокументы",ТЗДокументы);<br> Запрос.Выполнить();<br> <br> //----соедиянем таблицы там где ВТ.Колонка1 будет NULL значит этих документов нет в Эксель--<br> //--запрос можно перевернуть и проверить что есть в Эксель и чего нет в 1 с<br> //| ИЗ ВременнаяТаблицаЭксель как ВТ<br> //|ЛЕВОЕ СОЕДИНЕНИЕ<br> //| ВременнаяТаблицаДокументы как ВТД<br> //<br> Запрос.Текст ="ВЫБРАТЬ <br> |ВТД.Номер,<br> |ВТД.Организация,<br> |ВТД.Контрагент, <br> |ВТД.Склад ,<br> | ВТ.Колонка1,<br> | ВТ.Колонка2,<br> | ВТ.Колонка3 ,<br> | ВТ.Колонка4<br> | ИЗ ВременнаяТаблицаДокументы как ВТД<br> |ЛЕВОЕ СОЕДИНЕНИЕ<br> | ВременнаяТаблицаЭксель как ВТ<br> | ПО <br> | ВТД.НОМЕР = ВТ.Колонка1 И<br> | ВТД.Организация = ВТ.Колонка2 И<br> | ВТД.Контрагент = ВТ.Колонка3 И<br> | ВТД.Склад       = ВТ.Колонка4 <br> | ГДЕ ВТ.Колонка1 ЕСТЬ NULL<br> |<br> |";<br> <br> //--------------------------------------------------------------------<br> <br> Список= Запрос.Выполнить().Выгрузить();<br> Список.ВыбратьСтроку();<br> //Пока выборка.Следующий() цикл<br> // Сообщить(выборка.Организация) ;<br> //конецЦикла;<br>исключение<br>Сообщить(ОписаниеОшибки()); <br>Ексель.Application.Quit();<br>конецПопытки;<br>КонецПроцедуры<br>"

ПСВ
читатель
офлайн
Дата регистрации: 06.04.2009
Сообщений: 379
Пост №3
 
07.04.2009 00:11

"через адо так<br><br>ПутьКФайлу = "C:\Files\Обмен1с\Nomenklatura.xls";<br>попытка<br> ЭксельСоединение = Новый COMОбъект("ADODB.Connection") ;<br> ЭксельСоединение.Open("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ПутьКФайлу + ";" +"Extended Properties=""""Excel 8.0;HDR=Yes;mode =Write""""");<br>исключение<br> Сообщить(ОписаниеОшибки()); <br> Сообщить("Не удалось инициализировать Excel"); <br> Возврат; <br>КонецПопытки; <br> Команда = Новый COMОбъект("ADODB.Command");<br>Команда.ActiveConnection = ЭксельСоединение;<br>Команда.CommandText = "select * from [Лист1$]" ;<br>Команда.CommandType = 1;<br><br> Рекордсет = Новый COMОбъект("ADODB.Recordset");<br> Рекордсет = Команда.Execute();<br> <br> <br>//Пока Рекордсет.EOF = 0 Цикл <br>// Для НомерСтолбца = 0 По Рекордсет.Fields.Count - 1 Цикл<br>// Сообщить (Рекордсет.Fields(НомерСтолбца).Value);<br>// КонецЦикла; <br>// Рекордсет.MoveNext();<br>//КонецЦикла;<br> Поле1 ="Колонка1";<br> Поле2 ="Колонка2";<br> Поле3 ="Колонка3";<br> Поле4 ="Колонка4";<br><br>Значение1="ТПК00000007";<br>Значение2="Торгово-производственная компания";<br>Значение3="ГлПоставщик";<br>Значение4="Склад1";<br><br>//гоняем фильтр рекордсета и можно в цикле<br> Рекордсет.Filter = """" + Поле1 + " like '" + Значение1 +"'" + " And " + <br> Поле2 +" like '" + Значение2 + "'" + " And " + <br> Поле3 + " like '" +Значение3 + "'" + " And " +<br> Поле4 + " like '" +Значение4 + "'" ; <br> //если не возвращается ни одна строка<br> Если Рекордсет.BOF = Истина Тогда<br> сообщить("не найдено");<br> Иначе <br> Сообщить(Рекордсет.Fields(Поле1).Value);<br> КонецЕсли;<br>Рекордсет.Close();<br>ЭксельСоединение.Close();<br>КонецПроцедуры<br>"

GeorgeU
читатель
офлайн
Дата регистрации: 28.01.2008
Сообщений: 68
Пост №4
 
07.04.2009 10:57

Добрый день ПСВ! <br><br>Во первых, большое спасибо. Очень любезно с Вашей стороны! <br>Во вторых сейчас буду разбираться. Может иногда задам один-другой вопросик, ок? <br><br><br>С уважением Георгий

Показывать по 10 20 40 сообщений

Читают тему:

1 гостей
Быстрый переход
Для технических специалистов
  • Книга жалоб и предложений по работе сайта
  • Для технических специалистов
  • Представление регламентированной отчетности
  • Говорильня
  • Бухгалтерский учет: обсуждаем проекты нормативных актов и рекомендаций по ведению учета от БМЦ
  • Новый порядок применения ККТ (онлайн кассы с передачей сведений в ФНС)
  • Интернет-конференция: Оформление командировок по новым правилам
  • МАРКИРОВКА
  • ЕГАИС
  • Учет, налогообложение, автоматизация