Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
11 Дек 2017, 20:36
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Помогите разобраться с ADO и Excel  (Прочитано 14982 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн beztrud

Здравствуйте! 1с 8.3 самописная, Такси. Пробую в обработке грузить данные из экселя через ADO
&НаКлиенте
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.Фильтр = "Excel (*.xlsx; *.xls)|*.xlsx; *.xls";
ВыборФайла.МножественныйВыбор = Ложь;
Если НЕ ВыборФайла.Выбрать() Тогда
        ПоказатьПредупреждение(,"Файлы не выбраны", 5,"Внимание!");
Возврат
КонецЕсли;
Объект.Вычисления.Очистить();
НайтиФайл = ВыборФайла.ВыбранныеФайлы[0];
Объект.Файл=НайтиФайл;
СтрокаТабличнойЧасти = Элементы.Вычисления.ТекущиеДанные;
ВыполнитьЗагрузку(СтрокаТабличнойЧасти);
КонецПроцедуры

&НаСервере
Функция ВыполнитьЗагрузку(СтрокаТабличнойЧасти) Экспорт
Connection=Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Строка(Объект.Файл)+";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1""";
Попытка
Connection.Open(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
ТекстЗапроса =
"SELECT
|*
|FROM
|    [Лист1$] as Лист";
Выборка = Новый COMОбъект("ADODB.Recordset");
Попытка
Выборка.Open(ТекстЗапроса, Connection);
Исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат Ложь;
КонецПопытки;
Пока НЕ Выборка.EOF() Цикл
    СтрокаТабличнойЧасти=Объект.Вычисления.Добавить();
СтрокаТабличнойЧасти.ЧастьИзделия = Выборка.Fields("Часть изделия").value;
СтрокаТабличнойЧасти.ВысотаФасада = Выборка.Fields("Высота фасада").value;
СтрокаТабличнойЧасти.ШиринаФасада = Выборка.Fields("Ширина фасада").value;
СтрокаТабличнойЧасти.КоличествоФасадов = Выборка.Fields("Количество фасадов").value;
Если СтрокаТабличнойЧасти.КоличествоФасадов = 1 Тогда
СтрокаТабличнойЧасти.Примечание = "глухая";
Иначе
Если СтрокаТабличнойЧасти.КоличествоФасадов >1 И СтрокаТабличнойЧасти.КоличествоФасадов <5 Тогда
СтрокаТабличнойЧасти.Примечание = "глухе";
Иначе
СтрокаТабличнойЧасти.Примечание = "глухих";
КонецЕсли;
КонецЕсли;
СтрокаТабличнойЧасти.КвадратураФасадов = СтрокаТабличнойЧасти.ВысотаФасада*СтрокаТабличнойЧасти.ШиринаФасада*СтрокаТабличнойЧасти.КоличествоФасадов/1000000;
    Выборка.MoveNext();   
КонецЦикла;
Выборка.Close();
КонецФункции

Ругается:
{Обработка.ВычислениеПластика.Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (ВыполнитьЗагрузку)
ВыполнитьЗагрузку(СтрокаТабличнойЧасти);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'

НО!!! После нажатии "закрыть" все данные находятся в табличной части.
Вопросы:
1)Что нужно описать/дописать, чтобы не выскакивала ошибка
2)Как обратиться к полю в эксель, которое не содержит имени в первой строке, т.е HDR=NO
3)Если файл эксель создан в формате *.xlsx, то тоже ругается
{Обработка.ВычислениеПластика.Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft JET Database Engine): Внешняя таблица не имеет предполагаемый формат.
Проблемы с выполнением запроса

Заранее благодарю.


Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Нельзя этот тип передавать на Сервер ДанныеФормыЭлементКоллекции = ВыполнитьЗагрузку(СтрокаТабличнойЧасти);
Как обратиться к полю в эксель, которое не содержит имени в первой строке, т.е HDR=NO
Можно подробнее что надо то???

Если файл эксель создан в формате *.xlsx, то тоже ругается
Используй другой драйвер
http://www.connectionstrings.com/excel/
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Оффлайн beztrud

Цитировать
Нельзя этот тип передавать на Сервер ДанныеФормыЭлементКоллекции = ВыполнитьЗагрузку(СтрокаТабличнойЧасти);
А как правильно передать? И почему загрузка данных всё же происходит.

Цитировать
Как обратиться к полю в эксель, которое не содержит имени в первой строке, т.е HDR=NO
Вот я обращаюсь через Fields("Часть изделия").value Т.е "Часть изделия" это имя Столбца, а если данные начинаются с первой строки и не содержат заголовок "Часть изделия"?

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
1. Почему бы не коннектиться к Эксель через
ФайлЭксель = ПолучитьCOMОбъект(ИмяФайла);
тогда не важно XLS или XLSX

2. Вы грузите из Эксель по одной строке? Исключительно не оптимально и долго
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
к любой ячейке можно обратиться по координатам

ЗначениеЯчейки = ФайлЭксель.Sheets(1).Cells(СчСтроки,Ш).Value;
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн beztrud

1. Почему бы не коннектиться к Эксель через
ФайлЭксель = ПолучитьCOMОбъект(ИмяФайла);
тогда не важно XLS или XLSX

2. Вы грузите из Эксель по одной строке? Исключительно не оптимально и долго

Да, так и делал раньше, но вот хотелось бы просвятиться про АДО. Уж больно шустрый говорят. Если кому пригодиться вот код, которым я гружу сейчас.
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.Фильтр = "Excel (*.xlsx; *.xls)|*.xlsx; *.xls";
ВыборФайла.МножественныйВыбор = Ложь;
Если НЕ ВыборФайла.Выбрать() Тогда
        Предупреждение("Файлы не выбраны");
Возврат
КонецЕсли;
Состояние("Выполняется чтение файла Excel");
НайтиФайл = ВыборФайла.ВыбранныеФайлы[0];
Поле = Строка(НайтиФайл);
Объект.ВыбратьФайл=НайтиФайл;
Объект.Обработка.Очистить();
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;

Книга = Эксель.WorkBooks.Open(НайтиФайл);
Лист = Книга.WorkSheets(1);
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Для Строка = 1 По ВсегоСтрок Цикл
Состояние("Выполняется загрузка файла Excel",Строка);
СтрокаТабличнойЧасти=Объект.Обработка.Добавить();
СтрокаТабличнойЧасти.ЧастьИзделия=Лист.Cells(Строка,2).Value;
СтрокаТабличнойЧасти.Высота=Лист.Cells(Строка,4).Value;
СтрокаТабличнойЧасти.Высота=СтрокаТабличнойЧасти.Высота;
СтрокаТабличнойЧасти.Ширина=Лист.Cells(Строка,5).Value;
СтрокаТабличнойЧасти.Количество=Лист.Cells(Строка,6).Value;
СтрокаТабличнойЧасти.Примечание=Лист.Cells(Строка,7).Value;


Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
А как правильно передать? И почему загрузка данных всё же происходит.
Не нужно передавать этот тип

1. Создаем реквизит формы Таблица
2. Заполняем ее на клиенте (отключаемся от ADO)
3. Идем на сервер с контекстом
4. На сервере обходим таблицу формы ну и грузим все что нам требуется

5. Все!

Вот я обращаюсь через Fields("Часть изделия").value Т.е "Часть изделия" это имя Столбца, а если данные начинаются с первой строки и не содержат заголовок "Часть изделия"?
Так поставь всегда HDR=NO и смотри сам есть там данные или нет (не знаю как ты будешь это проверять)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
Чем плохо читать ячейки по координатам строки и столбца?

Все что надо это:
1. Начальная строка
2. Количество колонок
3. Признак когда остановиться
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн beztrud

Цитировать
Так поставь всегда HDR=NO и смотри сам есть там данные или нет (не знаю как ты будешь это проверять)
А как тогда обратиться к Field&

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
Зачем вообще знать имена?

Пока НЕ Об_РекордСет.EOF Цикл
                                   // Получаем данные из Об_РекордСет
                                   // ...
                                  Сообщить("");
                                  Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
                                     // Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
                                   КонецЦикла;
                                   // ...
                                   Об_РекордСет.MoveNext();
                        КонецЦикла;
Добавлено: 20 Июн 2014, 12:28

Изучайте
http://help1c.com/faq8/view/625.html
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!


Теги:
 

Помогите срочно!! В вкладке "Сервис"--> "Журнал регистрации" отражаются все операции как можно определить сделаны ли операции "задним числом" и как вычислить первоначальную информацию какой расчет поменял на другой?

Автор 2ronРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 4289
Последний ответ 24 Дек 2015, 15:34
от дфтын
Помогите подобрать Back-office и Front-office

Автор avrnskРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 5544
Последний ответ 07 Сен 2010, 12:01
от mohock
Помогите с отчётами в УТ 10.3. (Ведомость по товарам и ведомость по заказам)

Автор chum710Раздел Пользователям "1С - Предприятие 8"

Ответов: 2
Просмотров: 5879
Последний ответ 28 Мар 2012, 13:02
от chum710
Помогите с отчетом "Валовая прибыль"

Автор Dm109Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 4
Просмотров: 4358
Последний ответ 10 Сен 2015, 13:57
от Dm109
помогите с отчетом "характеристики контрагентов"

Автор Vasya PovarРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 1975
Последний ответ 07 Дек 2016, 15:53
от Kironten

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
164 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
56 Сообщений
alex0402
46 Сообщений
andron81_81
44 Сообщений
AIFrame
36 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
Golickoff Golickoff
28 Сообщений
BuhRust
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 348
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal