Пример создания SQL запроса к EXEL. Код 1C v 8.3 [c83]
Здесь я расскажу как правильно формировать SQL запрос к EXEL дабы правильно подрубаться через разные методы подключения и создания ComОбьектов, так как в инете много разного пишут по этому поводу но конкретики что делать нет....
Приступим, создаем или открываем заполненную таблицу exel, далее заходим во вкладку данные выбираем "Из других источников и выбираем ИЗ Microsoft Quer" далее выбираете источник Базы Данных "Exel Files" далее будет выбор книги не стал делать скрин так как там просто нужно выбрать файл какой мы открываем("Пользователь /ПутьФайла/Файл"), далее появится форма создания запроса здесь выбираем нужный лист жмем стрелку переноса в столбцы запроса жмём далее, пропускаем все предложенные варианты, так как там будет предрлагатся задать правило отбора данных, порядок сортировки и тп. задача стояла в простом запросе так что пропускаем все условия, далее на заключительном шаге выбираем "Просмотр или изменение данных Microsoft Quer" жмём готово.
Откроется "Microsoft Query" представляет собой программу для переноса данных из внешних источников в программы Microsoft Office, в частности Microsoft Excel - это из справки о программе, а на деле это программа дает возможность строить правильный запрос к exel как сложные так и простые, о построении сложных подробнее можно почитать в справке о программе, а чтобы увидеть как обратится к exel из 1с достаточно нажать кнопку SQL так называемый режим SQL и мы увидим запрос SQL который можно использовать при написании выгрузки и загрузки exel... в моём случае загрузка в бд через ADODB.Connection упиралась в SQLзапрос, так как я не мог его построить правильно, а здесь уже готовый запрос который подходит по синтаксису к 1с.
Пример кода чтения EXEL.
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл=Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли; // Строка корнекта Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId =790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка Об_Конект.Open(Стр_Конект);
Исключение Сообщить(ОписаниеОшибки());
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь; КонецПопытки;
//формируем запрос
//Здесь есть нюанс первая строка данных всегда будет являться заголовком
//если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "SELECT `Лист1$`.Город,`Лист1$`.Заправка FROM`C:\Users\User_scan\Desktop\файл.xls`.`Лист1$``Лист1$`";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
//если неудача тогда след. присвоение должно взлететь
//Стр_SQL = "SELECT "+Стр_КолонкиВыбора+" FROM [A"+Ч_Начало+":AZ100000] WHERE "+Стр_УсловиеКлючей;
Попытка Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Номер = 1;
Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ... Номер = Номер +1;
//Сообщить("ВСЕ ОК!!!");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ... Об_РекордСет.MoveNext();
КонецЦикла;
Сообщить(Номер);
Об_Конект.Close();
// Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
[/pre]
Категория:
COM-объекты, WMI, WSH Excel файл как Внешний источник данных Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто.
1. В конфигурации добавляет новый объект метаданных типа "Внешние источники данных" и назовем его просто "Excel".
2. На закладке "Данные" созданного объекта "Excel" добавляем новую таблицу. При этом появится окно мастера добавления таблицы внешнего источника.
Выбираем первый пункт "Вручную", т.к. лично у меня второй пункт "Выбрать из списка таблиц внешнего источника данных" работает нестабильно.
Если Вы все же хотите попробовать добавить таблицу через второй пункт, то в качестве строки соединения в появившемся окне указываем:
Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\Documents and Settings\Admin\Мои документы\finance3.xls; DriverID =790
В этой строке укажите путь к своему файлу. Имя пользователя и пароль я не указывал.
Отмечу, что путь к файлу и строка соединения в дальнейшем не запоминается и нужны эти параметры единожды, чтобы создать автоматически описание полей таблицы источника.
Если соединение прошло нормально, то должен отобразиться список таблиц источника. Флажком можно выбрать нужную таблицу и ее поля.
3. Даем имя новой таблице "Данные". Переходим на вкладку таблицы "Данные". В поле "Имя в источнике данных" указываем имя листа в файле Excel и добавляем в конце знак "$". В моем случае это "Данные$". В табличной части "Поля" добавляем поля и редактируем их тип.
У каждого поля в свойствах должно быть задано как минимум "Имя" и "Имя в источнике данных".
4. Создаем процедуру в которой пишем подключение к источнику и запрос:
Код 1C v 8.х ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения=
"Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\Documents and Settings\Admin\Мои документы\finance2.xls; DriverID =790";
ВнешниеИсточникиДанных.Excel.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.Excel.УстановитьСоединение();
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| Данные.date КАК Дата,
| Данные.time КАК Время,
| Данные.account КАК Счет,
| Данные.amount КАК Сумма,
| Данные.currency КАК Валюта,
| Данные.category КАК Категория,
| Данные.parent КАК КатегорияРодитель
|ИЗ
| ВнешнийИсточникДанных.Excel.Таблица.Данные КАК Данные";
ТЗ = Запрос.Выполнить().Выгрузить();
Вот и все!
Источник:
passion-programmer
Параметры соединения для файла Excel выглядят вот так:
Файлы XLSX (версия Office 2007 и выше)
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\ФайлExcel.xlsx;
Файлы XLS (ранее)
Driver={Microsoft Excel Driver (*.xls)}; DriverID =790; DBQ=D:\ФайлExcel.xls; Категория:
Внешние источники данных Загрузка данных из MS Excel через объект ADODB Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.
Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB. Recordset
Здесь универсальная обработка по загрузке Номенклатуры из Excel:
Код 1C v 8.х // Функция для Платформы 1С 8.0 или 8.1
// Выполняет загрузку из файла Excel
//
// Параметры
// ПутьКФайлу - <Строка> - путь к файлу xls
//
// Автор: ---%%%Gmix 16.03.2006 12:38:48
//
// Возвращаемое значение:
// <Булево> – Истина загрузка произошла
// - Ложь загрузки не было
//
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл=Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId =790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;
// формируем запрос
// Здесь есть нюанс первая строка данных всегда будет являться заголовком
// если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "S_elect
| F1 as Артикул,
| F2 as Наименование,
| F3 as ПолноеНаименование
| FROM [A1:AZ100000]
| WHERE ((F1 Is Not Null) AND (F1 <>''))";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение
Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ...
Сообщить("");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ...
Об_РекордСет.MoveNext();
КонецЦикла;
Об_Конект.Close(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
Категория:
Конвертация данных, Обмен, Перенос Загрузка данных из MS Excel через объект ADODB Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.
Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB. Recordset
Код 1C v 8.х // Выполняет загрузку из файла Excel
// Параметры
// ПутьКФайлу - <Строка> - путь к файлу xls
// Автор: ---%%%Gmix 16.03.2006 12:38:48
// Возвращаемое значение:
// <Булево> – Истина загрузка произошла
// - Ложь загрузки не было
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл=Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId =790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;
// формируем запрос
// Здесь есть нюанс первая строка данных всегда будет являться заголовком
// если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "S_elect
| F1 as Артикул,
| F2 as Наименование,
| F3 as ПолноеНаименование
| FROM [A1:AZ100000]
| WHERE ((F1 Is Not Null) AND (F1 <>''))";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение
Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ...
Сообщить("");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ...
Об_РекордСет.MoveNext();
КонецЦикла;
Об_Конект.Close(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice