Пример создания 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 Как узнать кто изменил документ в 1С (Журнал регистрации действий пользователей)? В процессе работы предприятия нередко возникает необходимость узнать кто, когда и что именно изменял в документе или справочнике программы.
Очень часто мне задают вопросы:
Как в 1С 8.2 посмотреть поменявшего документ? Как в 1с посмотреть изменившего документ? Как в 1С узнать кто и когда изменял документы? Как в 1С узнать кто изменил проводку в документе? Как посмотреть кто изменял документ в 1с? Журнал регистрации Содержит информацию о том, какие события происходили в информационной базе в определенный момент времени или какие действия выполнял тот или иной пользователь. Для каждой записи журнала, отражающей изменение данных, отображается статус завершения транзакции (транзакция завершена успешно, или же транзакция отменена).
Журнал регистрации доступен как в режиме 1С:Предприятие, так и в режиме Конфигуратор. Доступ к журналу регистрации возможен как из режима Конфигуратора (через меню Администрирование - Журнал регистрации ), так и из режима Предприятия (меню Сервис - Журнал регистрации ). В режиме Такси (Основное меню - Все функции - Стандартные - Журнал регистрации )
Вид журнала регистрации (Обычные формы и Такси):
Отбор в журнале регистрации (Обычные формы и Такси):
Используя средства работы со списками имеется возможность выгрузить журнал регистрации в табличный или, при необходимости, текстовый документ (через Действия - Вывести список) , который в дальнейшем может быть сохранен например в формате Excel , TXT или HTML. При этом существует возможность настройки уровня событий, которые будут фиксироваться в журнале регистрации, а также периодичности разделения журнала на отдельные файлы (в режиме конфигуратора меню Администрирование - Настройка журнала регистрации ).
И там же есть возможность сократить количество записей данного журнала до определенной даты, что делается для ускорения работы с механизмом анализа и регистрации событий в системе или за ненадобностью неактуальной информации.
Где хранится журнал регистрации В Файловой базе: в каталоге базы папка 1Cv8Log - это и есть директория содержащая журнал регистрации.
Если вы планируете перенести файловую базу данных и хотите сохранить историю журнала регистрации & вам обязательно надо скопировать папку 1Cv8Log в категорию новой базы 1С. Если необходимо очистить журнал регистрации 1С в файловой базе просто удалите папку 1Cv8Log.
В Клиент-серверной базе: C:\Program Files\1cv8\srvinfo\<Имя кластера сервера>\<Идентификатор базы на сервере>\1Cv8Log
С версии 8.3.5.1068 . Значительно переработали журнал регистрации для того, чтобы увеличить скорость выполнения запросов к журналу и повысить надёжность хранения данных.
Для этого, в том числе, потребовалось изменить формат хранения журнала регистрации. Теперь он хранится в одном файле базы данных SQLite. Этот файл имеет расширение lgd.
Версионирование объектов В некоторых конфигурациях 1С внедрен специальный механизм «Версионирование объектов».
По умолчанию версионирование выключено, чтобы включить откройте Сервис - Настройки учета - Настройка параметров учета
По кнопке «Настройка версионирования объектов» выбираем, какие справочники и документы нужно версионировать (наблюдать за тем, кто, что и когда изменил).
По умолчанию наблюдение за объектами информационной базы не ведется, поетому напротив каждого типа документов установлен признак «Не версионировать». Если нужно чтоб наблюдение велось, нужно установить «Версионировать» напротив интересующего журнала документов.
Все, при закрытии окна и нажатии на кнопку «Оk» наблюдение за объектами будет вестись.
Для того чтоб просмотреть все изменения которые кто-то делал в документе или справочнике нужно перейти в меню: Сервис - История изменений объектов
Категория:
Администрирование Загрузка данных в документ из табличного документа (в ТД скопировано из Excel) Частенько пользователи просят упростить ввод данных в программу используя копирование таблиц из Excel. Ниже я приведу пример как загрузить данные скопированные из Excel:
Создаем форму для загрузки данных:
внутри пишем код:
Код 1C v 8.х // Функция ПолучитьТЗИзМакета(ТабДок, КолонкаИндекса = 1)
ТаблицаДанных = Новый ТаблицаЗначений;
НомерКолонки = 0;
Пока Истина Цикл
НомерКолонки = НомерКолонки + 1;
ИмяКолонки = ТабДок.Область(1, НомерКолонки).Текст;
Если ПустаяСтрока(ИмяКолонки) Тогда
Прервать;
КонецЕсли;
ТаблицаДанных.Колонки.Добавить("К"+Строка(НомерКолонки));
КонецЦикла;
СчетчикКолонок = НомерКолонки - 1;
НомерСтроки = 1; ФлагПрерывания = Ложь;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
Стр = ТаблицаДанных.Добавить();
Для А = 1 ПО СчетчикКолонок Цикл
ТекстКолонки = ТабДок.Область(НомерСтроки, А).Текст;
Если ПустаяСтрока(ТекстКолонки) Тогда
Если А = КолонкаИндекса Тогда
Флагпрерывания = Истина;
ТаблицаДанных.Удалить(Стр);
КонецЕсли;
Иначе
Стр[А - 1] = ТекстКолонки
КонецЕсли;
Если Флагпрерывания Тогда
Прервать
КонецЕсли;
КонецЦикла;
Если Флагпрерывания Тогда
Прервать
КонецЕсли;
КонецЦикла;
Возврат ТаблицаДанных
КонецФункции
Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
тзДанных=ПолучитьТЗИзМакета(ЭлементыФормы.ПолеТД);
Закрыть(тзДанных);
КонецПроцедуры
В документ добавлена кнопка - Загрузка из Excel ее код:
Код 1C v 8.х //Функция преобразует строку вида 31.01.2015 в дату
Функция РазобратьДату(ИзмДата);
Возврат Дата(Сред(ИзмДата,7,4)+Сред(ИзмДата,4,2)+Сред(ИзмДата,0,2));
КонецФункции
Процедура ЗагрузитьИзЕкселНажатие(Элемент)
тзДанных = ПолучитьФорму("ФормаЗагрузкиИзExcel").ОткрытьМодально();
//ТЗ получили, загружаем:
ГрафикПлатежейКлиент.Очистить();
Для Каждого стр из тзДанных Цикл
нСтр = ГрафикПлатежейКлиент.Добавить();
нСтр.Дата = РазобратьДату(стр.К1);
нСтр.Сумма = стр.К2;
нСтр.СуммаАкта = стр.К3;
КонецЦикла;
КонецПроцедуры
Смысл в том что из Excel копируют таблицу:
Жмут на кнопку загрузить и в документе Табличная часть заполняется автоматически:
Категория:
Табличный документ 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; Категория:
Внешние источники данных Добавим документы ODF (OpenOffice/LibreOffice) в стандартную обработку Загрузки Табличного документа Доброго времени суток!
Обработку ЗагрузкаданныхизТабличногоДокументаконечно должен знать каждый 1С-ник. И сколько бы обработок такого плана не появлялось, эта остается классикой. Даже претензии можно предъявлять если вы в ней что-то не понимаете к самой 1С. Хотя какие претензии, исходный код открыть – изучай, не хочу…
Еще чем мне нравится эта обработка – тем что вы читаете данные из внешнего источника, показываете их с помощью объекта табличное поле и только затем выбираете алгоритм загрузки в 1С. При чем загрузка у Вас происходит в среде 1С без привлечения дополнительных компонентов. Без всяких выпадов в неизвестный объект OLE, полей которые не прочитались в обработке загрузки. Если вы видете данные в табличном поле, то они и будут грузиться по вашему алгоритму.
Но что-то в ней не хватает. Конечно стандарта офисных документов ODF (Open Document Format и между прочим ГОСТ Р ИСО/МЭК 26300-2010). Как говаривал мой начальник – есть чем себя занять. Из всех внешних загрузок, которые сейчас есть к сожалению самыми распостраненными являются OLE(Com+) технологии. Возможно что-то еще появиться, но пока примемся за них.
Залезаем в код и видим несколько однотипных функуций
Функция мПрочитатьТабличныйДокументИзExcel(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт
Функция мПрочитатьТабличныйДокументИзТекста(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт
Пора добавить свою:
Код 1C v 8.х
// Функция считывает в табличный документ данные из файла в формате ODF Calc(ods)
//
// Параметры:
// ТабличныйДокумент – ТабличныйДокумент, в который необходимо прочитать данные
// ИмяФайла – имя файла в формате ODF, из которого необходимо прочитать данные
// НомерЛистаCalc – номер листа книги Calc, из которого необходимо прочитать данные
//
// Возвращаемое значение:
// Истина, если файл прочитан, Ложь – иначе
//
Функция мПрочитатьТабличныйДокументИзCalc(ТабличныйДокумент, ИмяФайла, НомерЛистаCalc = 1) Экспорт
ВыбФайл = Новый Файл(ИмяФайла);
Если НЕ ВыбФайл.Существует() Тогда
Сообщить(“Файл не существует!”);
Возврат Ложь;
КонецЕсли;
Попытка
ServiceManager = Новый COMОбъект(“com.sun.star.ServiceManager”);
Desktop = ServiceManager.CreateInstance(“com.sun.star.frame.Desktop”);
Desktop.getCurrentFrame().getContainerWindow().setVisible(Ложь); //сделаем невидимым основное окно.
//установим параметры – не показывать таблицу Calc
Параметры = Новый COMSafeArray(“VT_DISPATCH”, 1);
Свойство = ServiceManager.Bridge_GetStruct(“com.sun.star.beans.PropertyValue”);
Свойство.Name = “Hidden”;
Свойство.Value = true;
Параметры.SetValue(0,Свойство);
Document = Desktop.LoadComponentFromURL(“file:///” + ИмяФайла, “_blank”, 0, Параметры);
Состояние(“Обработка файла Office Calc …”);
Листы = Document.getSheets();
Лист = Листы.getByIndex(НомерЛистаCalc-1);
Исключение
Сообщить(“Ошибка загрузки данных. Возможно неверно указан номер листа книги Calc.”);
Возврат ложь;
КонецПопытки;
ТабличныйДокумент.Очистить();
//Определение максимум ячейки с данными…
НульЯчейка = Лист.GetCellbyPosition(0,0);
НульКурсор = Лист.createCursorByRange(НульЯчейка);
НульКурсор.GotoEndOfUsedArea(1);
НульАдрес = НульКурсор.RangeAddress;
ПослСтрока = НульАдрес.EndRow;
ПослКолонка = НульАдрес.EndColumn;
//Для Column = 1 По ПослКолонка + 1 Цикл
// ТабличныйДокумент.Область(“C” + Формат(Column, “ЧГ=”)).ШиринаКолонки = Лист.getColumns.getByIndex(Column-1).Width;
//КонецЦикла;
Для Row = 1 По ПослСтрока + 1 Цикл
Если Лист.getCellByPosition(Column-1,Row-1).getType() = 0 Или Лист.getCellByPosition(Column-1,Row-1).getType() = 1 Тогда ТабличныйДокумент.Область(“R” + Формат(Row, “ЧГ=”) +”C” + Формат(Column, “ЧГ=”)).Текст = Лист.getCellByPosition(Column-1,Row-1).value;
ИначеЕсли Лист.getCellByPosition(Column-1,Row-1).getType() = 2 Тогда ТабличныйДокумент.Область(“R” + Формат(Row, “ЧГ=”) +”C” + Формат(Column, “ЧГ=”)).Текст = Лист.getCellByPosition(Column-1,Row-1).string;
КонецЕсли;
КонецЦикла;
//ServiceManager.quit();
Document.Dispose();
Document = 0;
Параметры = 0;
Desktop = 0;
ServiceManager = 0;
Возврат Истина;
КонецФункции
И добавим в форму выбора файла ods по тексту.
Код 1C v 8.х ДиалогВыбораФайла.Фильтр = “Табличный документ (*.mxl)|*.mxl|Лист Calc (*.ods)|*.ods|Лист Excel (*.xls)|*.xls|Текстовый документ (*.txt)|*.txt|dBase III (*.dbf)|*.dbf|”;
И выбор функции для ods
ИначеЕсли нРег(ФайлНаДиске.Расширение) = “.ods” Тогда
мПрочитатьТабличныйДокументИзCalc(ТабличныйДокумент,ДиалогВыбораФайла.ПолноеИмяФайла);
Вот так лучше.
Сайт
sikuda.ru Категория:
Работа с Microsoft Office и OpenOffice Универсальная функция для чтения данных из Excel в 1С Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х // Загрузка данных из Excel файла в ТаблицуЗначений
// Возвращает ТаблицуЗначений с данными
// ПутьДоExcel - путь до Excel файла
// НомерСтраницы - Номер страницы в Excel
// ПерСтрокаЗаголовок - первая строка Excel содержит имена столбцов
// ФормаИндикатора - Стандартная форма прогресса работы
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект(ПутьДоExcel);
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
ЗакрытьФормуИндиктаора = Ложь;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина;
ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.Открыть();
КонецЕсли;
ФормаИндикатора.КомментарийЗначения = "Загрузка данных из Excel...";
ТЗ = Новый ТаблицаЗначений();
Страница = Док.Sheets(НомерСтраницы);
МакСтрок = Страница.UsedRange.Rows.Count; // макс. колич. строк
МакСтолб = Страница.UsedRange.Columns.Count; // макс. колич. столбцов
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница.Cells(1,Столбец).Value;
ИмяСтолбца = СокрЛП(ИмяСтолбца);
ИмяСтолбца = СтрЗаменить(ИмяСтолбца," ","_");
КонецЕсли;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;
НачальнаяСтрока = 1;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2;
КонецЕсли;
Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;
ФормаИндикатора.ЭлементыФормы.Индикатор.Значение = НомСтрока/МакСтрок * 100;
КонецЦикла;
Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора.Закрыть();
КонецЕсли;
Возврат ТЗ;
КонецФункции
Пример вызова:
Код 1C v 8.х ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.НаименованиеОбработкиДанных = "Загрузка данных...";
ФормаИндикатора.Открыть();
ТЗ = ИзExcelВТаблицу(ФайлExcel,1,Истина,ФормаИндикатора);
Если ТЗ = Неопределено тогда
ФормаИндикатора.Закрыть();
Возврат;
КонецЕсли;
ФормаИндикатора.Закрыть();
или
Код 1C v 8.х ТЗ = ИзExcelВТаблицу(ФайлExcel);
Если ТЗ = Неопределено тогда
Возврат;
КонецЕсли;
Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х // Создаем в справочнике "ИмяСправочника" элемент
// ИмяЭлемента - Имя созданного элемента в справочнике "ИмяСправочника"
// ИмяРодителя - Имя родительского элемента (отсутствует если не древовидный).
// Разделитель \\ позволяет писать древовидный путь родителя из нескольких элементов
// Параметры - Соответствие содержащие список параметров для элемента
// СоздатьЕслиНетЭлемента - Создает элемент если нет. Иначе ищет и обновляет
Функция ЭлементСправочника(ИмяСправочника = "",ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить("Укажите имя спрачоника - ЭлементСправочника()");
Возврат Неопределено;
КонецЕсли;
Если ПустаяСтрока(ИмяЭлемента) тогда
Возврат Неопределено;
КонецЕсли;
// Создаем или ищем родителя
Родитель = Неопределено;
Если ИмяРодителя <> Неопределено тогда
ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника].ПустаяСсылка();
Пока НЕ ПустаяСтрока(ОбрабатИмяРодителя) цикл
ПозРазделителя = Найти(ОбрабатИмяРодителя,"\\");
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред(ОбрабатИмяРодителя,1, ПозРазделителя-1);
ОбрабатИмяРодителя = Сред(ОбрабатИмяРодителя,ПозРазделителя+2);
КонецЕсли;
ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник."+ИмяСправочника+" КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа";
ЗапросРодителя = Новый Запрос(ТексЗапроса);
ЗапросРодителя.УстановитьПараметр("Родитель", РодительГруппы);
ЗапросРодителя.УстановитьПараметр("Наименование", ИмяГруппы);
РезультатРодителя = ЗапросРодителя.Выполнить().Выгрузить();
// Создаем родителя в случае необходимости
Если РезультатРодителя.Количество() <> 0 тогда
РодительГруппы = РезультатРодителя[0].Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника].СоздатьГруппу();
ОбъектРодитель.Родитель = РодительГруппы;
ОбъектРодитель.Наименование = ИмяГруппы;
ОбъектРодитель.Записать();
РодительГруппы = ОбъектРодитель.Ссылка;
КонецЕсли;
КонецЦикла;
Родитель = РодительГруппы;
КонецЕсли;
// Создаем или ищем элемент
Элемент = Справочники[ИмяСправочника].НайтиПоНаименованию(ИмяЭлемента);
ОбъектЭлемент = Неопределено;
Если Элемент.Пустая() тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника].СоздатьЭлемент();
ОбъектЭлемент.Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли;
Иначе
ОбъектЭлемент = Элемент.ПолучитьОбъект();
КонецЕсли;
Если ОбъектЭлемент <> Неопределено тогда
// Устанвалвиаем доп. параметры
Если Параметры <> Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр.Ключ] = СтрПараметр.Значение;
КонецЦикла;
КонецЕсли;
Если Родитель <> Неопределено тогда
ОбъектЭлемент.Родитель = Родитель;
КонецЕсли;
ОбъектЭлемент.Записать();
Элемент = ОбъектЭлемент.Ссылка;
КонецЕсли;
Возврат Элемент;
КонецФункции
Автор:
borismor Категория:
Работа с Microsoft Office и OpenOffice Как выгрузить Таблицу значение в файл Excel? Код 1C v 8.х Процедура СохранитьТаблицуВФайлExcel(Таблица, ПолноеИмяФайла="", ОткрыватьДиалогВыбораФайла=Истина, ВыгружаемыеКолонки="") Экспорт
Если ПустаяСтрока(ПолноеИмяФайла) ИЛИ ОткрыватьДиалогВыбораФайла Тогда
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение документа Excel";
Диалог.Фильтр = "Документ Excel (*.xls)|*.xls";
Диалог.Расширение = "xls";
Диалог.ПолноеИмяФайла = ПолноеИмяФайла;
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойКаталогФайлов");
Если (Диалог.Выбрать()) И (НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла)) Тогда
ПолноеИмяФайла = Диалог.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
ФайлНаДиске = Новый Файл(ПолноеИмяФайла);
Попытка
// Загрузка Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Книга = ExcelПриложение.WorkBooks.Add();
Лист = Книга.WorkSheets(1);
Исключение
Сообщить("Ошибка при загрузке Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
Если ПустаяСтрока(ВыгружаемыеКолонки) Тогда
ТаблицаВыгрузки = Таблица.Скопировать();
Иначе
ТаблицаВыгрузки = Таблица.Скопировать(, ВыгружаемыеКолонки);
КонецЕсли;
Для Кол = 0 По ТаблицаВыгрузки.Колонки.Количество()-1 Цикл
Лист.Cells(1, Кол + 1).Value = ТаблицаВыгрузки.Колонки[Кол].Заголовок;
КонецЦикла;
Попытка
Для Стр = 0 По ТаблицаВыгрузки.Количество()-1 Цикл
Для Кол = 0 По ТаблицаВыгрузки.Колонки.Количество()-1 Цикл
Если ТипЗнч(ТаблицаВыгрузки[Стр][Кол]) = Тип("Число") Тогда
// Установним формат для типа Число
//Лист.Cells(Стр + 2, Кол + 1).NumberFormat = "0,00";
Лист.Cells(Стр + 2, Кол + 1).Value = ТаблицаВыгрузки[Стр][Кол];
Иначе
// Для всех других типов установим формат "Текстовый"
//Лист.Cells(Стр + 2, Кол + 1).NumberFormat = "@";
Лист.Cells(Стр + 2, Кол + 1).Value = Строка(ТаблицаВыгрузки[Стр][Кол]);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ExcelПриложение.DisplayAlerts = False;
Книга.SaveAs(ПолноеИмяФайла);
ExcelПриложение.ActiveWorkbook.Close();
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + ПолноеИмяФайла);
Исключение
Сообщить("Ошибка записи данных файла :" + ПолноеИмяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Как загрузить данные из Access в 1С ? Загружаем данные из Access в 1С
Код 1C v 8.х Файл = "C:\files\demo.mdb" ;
//СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Файл + "; Extended Properties=""Excel 8.0;HDR=NO;""";
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Файл + ";""";
Connection = Новый COMОбъект("ADODB.Connection");
Попытка
Connection.Open(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = "S_elect * FROM Table1";
Command.CommandType = 1;
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet = Command.Execute();
стр ="";
Пока RecordSet.EOF() = 0 Цикл
для н=0 по Recordset.Fields.Count -1 цикл
стр = стр + " " + Recordset.Fields(н).Value;
КонецЦикла;
Сообщить(стр);
стр ="";
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Connection.Close();
Код 1C v 7.x Акцесс = СоздатьОбъект("ADODB.CONNECTION");
Попытка
СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mybase.mdb;Uid=Admin;Pwd=";
Акцесс.Open(СтрокаПодключения);
Исключение
Сообщить("Все плохо:"+ОписаниеОшибки());
Возврат;
КонецПопытки;
Команда = СоздатьОбъект("ADODB.Command");
Команда.ActiveConnection=Акцесс;
ТекстСелект = "S_elect * FROM tblCustoms";
НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
Команда.CommandText=ТекстСелект;
Попытка
НаборЗаписей=Команда.Execute;
Исключение
Сообщить("Обломись:"+ОписаниеОшибки());
КонецПопытки;
Попытка
НаборЗаписей.MoveFirst();
Исключение //нет записей в рекордсете
НаборЗаписей.Close();
Возврат;
КонецПопытки;
Пока НаборЗаписей.EOF()=0 Цикл
ИНН = НаборЗаписей.Fields("INN").Value;
//ну и т.д.
НаборЗаписей.MoveNext();
КонецЦикла;
НаборЗаписей.Close();
// Для тех, у кого в базе Акцесс создана рабочая группа (есть файлик mdw), строка подключения будет такая:
СтрокаПодключения="Driver= Microsoft Access Driver (*.mdb)};systemDB=C:\wg.mdw;Dbq=C:\mybase.mdb;Uid=Admin;Pwd=";
Работа с ACCESS из 1С через DAO
Код 1C v 7.x Процедура Выполнить()
//фасВладелец = СтрЗаменить(фасВладелец," ","_");
Спр = СоздатьОбъект("Справочник.ТоварыВПрайсе");
Спр.ИспользоватьВладельца(ФасВладелец);
dbe = СоздатьОбъект("dao.DBEngine.36");
wksp = dbe.Workspaces(0);
db = 0;
Если ФС.СуществуетФайл(КаталогИБ()+"Pric_list.mdb")=0 Тогда //
db = wksp.CreateDataBase(КаталогИБ()+"Pric_list.mdb",";LANGID=0x0419;Cp=1251;Country=0"); //
db.Execute("Create table [" + Строка(фасВладелец) + "]
|(Rec_ind integer,
|Код text,
|Артикул text,
|Цена integer,
|Товар text,
|Единица text,
|Val text);"
);
db.Execute("Create index Rec_ind on ["+Строка(фасВладелец)+"] (Rec_ind);");
Иначе
db= wksp.OpenDataBase(КаталогИБ()+"Pric_list.mdb");
Попытка
rs = db.OpenRecordset(Строка(фасВладелец));
Исключение
Сообщить("Создается новая таблица");
КонецПопытки;
Если ПустоеЗначение(rs)= 1 Тогда
db.Execute("Create table [" + Строка(фасВладелец) + "]
|(Rec_ind integer,
|Код text,
|Артикул text,
|Цена integer,
|Товар text,
|Единица text,
|Val text);"
);
db.Execute("Create index Rec_ind on ["+Строка(фасВладелец)+"] (Rec_ind);");
КонецЕсли;
db.Execute("Delete * From ["+Строка(фасВладелец)+"];");
КонецЕсли;
rs = db.OpenRecordset(Строка(фасВладелец));
Y = 1;
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
лсЕдиницы = "";
Если Спр.асТовар.апТип=Перечисление.ТипТовара.Услуга Тогда
лсЕдиницы = "";
ИначеЕсли Спр.асТовар.апТип=Перечисление.ТипТовара.Весовой Тогда
лсЕдиницы = "г";
ИначеЕсли Спр.асТовар.апТип=Перечисление.ТипТовара.Штучный Тогда
лсЕдиницы = "шт.";
КонецЕсли;
Если Спр.ЭтоГруппа() = 0 Тогда
rs.AddNew();
rs.Rec_ind = Y;
rs.Код= Спр.асТовар.ПолныйКод();
rs.Артикул = Спр.асТовар.сАртикул;
rs.Цена = Спр.чЦена;
rs.Товар=Спр.асТовар.сПолнНаименование;
rs.Единица = лсЕдиницы;
rs.Val = Спр.асВалюта.Код;
rs.Update();
Y=Y+1;
КонецЕсли;
КонецЦикла;
db.Close();
Сообщить("Выгрузка завершена");
КонецПроцедуры
Код 1C v 7.x
Процедура ACCESS()
dbe=CreateObject("DAO.DBEngine.36");
wksp=dbe.Workspaces(0);
db=0;
// в ковычках имя фаила с расширением MDB
Если ФС.СуществуетФайл(КаталогПользователя()+"sr.mdb")=0 Тогда
// создание файла базы данных с русским порядком сортировки
db=wksp.CreateDataBase(КаталогПользователя()+"mars_sr.mdb",";LANGID=0x0419;CP=1251;COUNTRY=0");
// DDL - запрос на создание таблицы
// описание языка DDL (подмножество SQL) смотрите в хелпе по MS Access
// не пытайтесь делать это с другими форматами - DDL через DAO поддерживается только для MDB
//Создадим еще таблицу
db.Execute("CREATE TABLE BANKS
|(REC_IND INTEGER,
|BANKCODE INTEGER,
|BANKNAME TEXT ,
|ModifiedFlg BIT,
|ChangeSeqFlg BIT);"
);
// индекс на нужные поля
db.Execute("CREATE INDEX REC_IND ON BANKS (REC_IND);");
Иначе
// просто открываем базу данных в разделенном режиме
db=wksp.OpenDataBase(КаталогПользователя()+"sr.mdb");
// и очищаем имеющиеся данные
db.Execute("DELETE * FROM BANKS;");
КонецЕсли;
// rs-это как раз сама таблица, куда мы будем добавлять записи
rs=db.OpenRecordset("BANKS");
// добавление записи
rs.AddNew();
// присвоение значений полям
rs.REC_IND = "1";
rs.BANKCODE = "34";
rs.BANKNAME = "Инвест";
rs.ModifiedFlg = "1";
// запомним запись
rs.Update();
// и так далее ...
db.Close(); // закрытие базы данных
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Отправка отчетов из 1С по электронной почте (E-Mail) Автоматическая генерация отчета "Анализ заказов поставщикам"
Отчет анализ заказов является штатным отчетом конфигурации 1С Управление производственным предприятием. Обработка для генерации отчета, рассматриваемая в данной статье, позволяет программно создать и настроить форму отчета, запустить его выполнение. Полученный результат сохраняется в файл Microsoft Excel (XLS, XLSX) и может быть отправлен по электронной почте.
Предлагаемое решение состоит из трех файлов: Скачивать файлы может только зарегистрированный пользователь!
service.vbs служит для запуска 1С предприятия и генерации отчета;
emailer.vbs - VBS скрипт предназначен для отправки результатов выполнения запроса отчета на указанный при настройке адрес электронной почты;
rep_email.epf - сама внешняя обработка для генерации отчета, выполняющая настройки отображаемых показателей, группировок строк и столбцов, установки требуемых отборов отчета, обеспечивает выполнение запроса и формирования табличного документа по макету отчета и сохранение сформированного отчета в XLS файл.
Запуск отчета выполняется посредством VBS файла (vbscript) при помощи "Назначенных заданий". VBS программа обеспечивает запуск приложения 1С, устанавливает соединение с сервером 1С и передает управление внешней обработке через экспортную функцию ReportNow(), размещенную в общем модуле обработки по генерации отчета. Пример VBS Script для выполнения внешней обработки 1С из командной строки:
Код VBS ' Установить соединение с сервером 1С
Set v81 = CreateObject("V81.Application")
res = v81.Connect("Srvr=Server1C;Ref = db1C;Usr=User1C;Pwd=Password1C")
' Передать управление внешней обработке по генерации Отчета Анализ Заказов
res = v81.ExternalDataProcessors.Create("C:\1C\Service\rep_email.epf").ThisObject.Report()
v81.Exit(false)
' Дать возможность 1С закрыть все открытые файлы и выгрузиться из памяти
WScript.Sleep(5000)
' Вызвать VBS скрипт отправки почты по E-Mail
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\1C\ Service\emailer.vbs"
VBS E-Mail скрипт для отправки готового отчета в формате Excel создает новое электронное письмо на заданный адрес, в теле письма указывает пояснение к отчету, а в качестве вложения прикрепляет файл, создание и наполнение информацией которого была произведена при запуске service.vbs
Код VBS 'Отправить сообщение с помощью локальной службы SMTP
Const cdoSendUsingPickup = 1
'Отправить сообщение с помощью сети (SMTP через сеть)
Const cdoSendUsingPort = 2
Const cdoAnonymous = 0
Const cdoBasic = 1
Const cdoNTLM = 2
Set objMessage = CreateObject("CDO.Message")
' Тема сообщения и адрес отправителя
objMessage.Subject = "Ежедневный отчет Анализ заказов поставщикам"
objMessage.From = """Генератор отчетов"" "
' Получатели письма указываются через " ; "
objMessage.To = "email@domain.org; recv@domain.net; last@domain.ru"
' Содержимое тела письма.
objMessage.TextBody = "JSC AUTO SERVICE. Please find Orders reporting in attachment." & vbCRLF & _
"------------------------------------------" & vbCRLF & _
"Best regards, Auto report service" & vbCRLF & _
"Support line: it@domian.ru" & vbCRLF
' Добавляем файл - вложение для отправки отчета по EMail
objMessage.AddAttachment "C:\1C\Service\ЗаказыПоставщику.xls"
' Секция настроек SMTP сервера для отправки почты.
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
' Имя или IP адрес SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.domain.ru"
' Тип используемой авторизации, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
' Авторизация на SMTP server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "report@domain.ru"
' Пароль SMTP server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "youpassword"
' Порт SMTP Server port (обычно 25, но может быть и другим)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
' Использование SSL для соединения (False или True)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
' Время ожидания соединения с почтовым сервером
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
' Сохранить настройки CDO для отправки сообщения
objMessage.Configuration.Fields.Update
' Отправить созданное почтовое сообщение с вложением отчета в формате XLS по указанному адресу
objMessage.Send
Внешняя обработка по запуску отчета "Анализ заказов поставщику" состоит из двух процедур. Первая - "ReportNow() Экспорт" служит для определения входной точки передачи управления от VBS к 1С. Вторая - "ОткрытьОтчетПоИмени()" - выполняет действия по настройке критериев отбора отчета, группировке строк и столбцов, определению состава количественных показателей. Данный способ вызова отчетов стандартной конфигурации широко применяется в различных формах 1С, и по мере развития конфигурации может быть позаимствован как минимум из нескольких форм списка справочников (Контрагенты, Номенклатура и т.д.). Исходный код первой функции: >
Код 1C v 8.х Процедура ReportNow() Экспорт
// Вызывается из vbscript, выполняет работы с отчетом.
ОткрытьОтчетПоИмени("АнализЗаказовПоставщикам");
КонецПроцедуры
Сохранение отчета из 1С в Excel
Процедура формирования формы отчета принимает в качестве параметра название объекта метаданных конфигурации, в данном случае - "АнализЗаказовПоставщикам". Очевидно, что в зависимости от типа отчета процедура будет меняться пропорционально используемым реквизитам. В рассматриваемом примере добавляется отбор по контрагенту. Для своего ключевого поставщика заменить значение искомого наименования на нужное.
Код 1C v 8.х Процедура ОткрытьОтчетПоИмени(НазваниеОтчета) Экспорт
// получаем отчет и открываем форму
// для построения отчета по названию отчета
Отчет = Отчеты[НазваниеОтчета].Создать();
Форма = Отчет.ПолучитьФорму(, , );
Форма.Открыть();
// Выполнить настройку отчета по умолчанию
Отчет.УстановитьНачальныеНастройки();
// Добавить требуемый отбор по поставщику
ТекОтбор = Отчет.УниверсальныйОтчет.ПостроительОтчета.Отбор.ДоговорКонтрагентаВладелец;
ТекОтбор.Использование = Истина;
ТекОтбор.Значение = Справочники.Контрагенты.НайтиПоНаименованию("Поставщик");
ТекОтбор.ВидСравнения = ВидСравнения.Равно;
// Добавляем специфичное для нас измерение в отборе - например, "осталось отгрузить"
// в данном случае из отчета уйдут позиции, по которым все получено.
Отчет.УниверсальныйОтчет.ПостроительОтчета.Отбор.Добавить("ОсталосьОтгрузитьЕдиницОтчетов");
ТекОтбор1 = ОтчетОстатки.УниверсальныйОтчет.ПостроительОтчета.Отбор.ОсталосьОтгрузитьЕдиницОтчетов;
ТекОтбор1.Использование = Истина;
ТекОтбор1.Значение = 0;
ТекОтбор1.ВидСравнения = ВидСравнения.Больше;
// Состав отдельных ключевых показателей
// для каждого отчета можно посмотреть в конфигураторе
Отчет.СостояниеОтгрузкиПоЗаказу = истина;
Отчет.НеОтгружено = Истина;
Отчет.ОтгруженоЧастично = Истина;
// После завершения настроек нажмем программно кнопку "Сформировать"
Отчет.СформироватьОтчет(ФормаОтчета.ЭлементыФормы.ПолеТабличногоДокументаРезультат);
// Сформировать путь и имя файла для сохранения отчета
мПутьШаблон="C:\1C\Service";
мФайлШаблон="ЗаказыПоставщику.xls";
ИмяФайла = мПутьШаблон + "\" + мФайлШаблон;
// Полученные в отчете цифры и данные сохраним в файл Excel
Если Не ИмяФайла = Неопределено Тогда
Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат.СохранятьСвойстваОтображения = Истина;
Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
КонецЕсли;
// Закрыть форму отчета после завершения работы
ФормаОтчета.Закрыть();
КонецПроцедуры
Для того, чтобы отладить обработку в режиме 1С:Предприятие, запущенного из конфигуратора можно создать экранную форму обработки и разместить в ней следующую процедур автоматического запуска отлаживаемого отчета:
Код 1C v 8.х Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Отказ = истина;
ОткрытьОтчетПоИмени("АнализЗаказовПоставщикам");
КонецПроцедуры
Надеемся, что успешная комбинация внешней обработки для запуска отчета по расписанию и vbscript поможет в автоматизации бизнеса вашего предприятия. Данная редакция настроек больше ориентирована на менеджера поставщика для вашей компании, что отслеживать взаимное движение товаров и документов.
Источник
Руководство компании, хочет получать оперативную сводку продаж по фирме Категория:
Работа с Интернет, Почтой (Mail), FTP Быстрая загрузка данных большого размера файла Excel в многомерный Массив Код 1C v 8.х // OldthiefXXX
Перем СерверExcel;
Процедура КнопкаВыполнитьНажатие(Кнопка)
ФайлХЛС=СерверExcel.Application.Workbooks.Open(ДокументХЛС);
КонечнаяСтрокаДанных=ФайлХЛС.ActiveSheet.UsedRange.Rows.Count;
КоличествоКолонокДанных=ФайлХЛС.ActiveSheet.UsedRange.Columns.Count;
Состояние("Загрузка в память данных ведомости...");
ExcelЛист=ФайлХЛС.ActiveSheet;
Область = СерверExcel.Range(ExcelЛист.Cells(1,1), ExcelЛист.Cells(КонечнаяСтрокаДанных,КоличествоКолонокДанных));
МассивДанныхEXEL = Область.Value.Выгрузить();
КонецПроцедуры
Процедура ИнициализацииЕкселя()
Состояние("Происходит инициализация EXCEL...");
Попытка
СерверExcel1 = Новый COMОбъект("Excel.Application");
СерверExcel1.DisplayAlerts = 0;
Исключение
ЗапущенExcel = 0;
Сообщить(ОписаниеОшибки(),"!");
КонецПопытки;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Экспорт и Импорт данных 1С - Microsoft Excel Экспорт
Процедура ОсновныеДействияФормыЭкспорт(Кнопка) - выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel с указанным именем, используя преобразование данных к типу число и типу строка;
Код 1C v 8.х Процедура ОсновныеДействияФормыЭкспорт(Кнопка)
Попытка
Попытка
// Загрузка объекта Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
// Создадим книгу, по умолчанию в ней уже есть листы
Книга = ExcelПриложение.WorkBooks.Add();
// Используем первый лист книги Excel
Лист = Книга.WorkSheets(1);
// Сформировать шапку документа в первой строке листа
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Лист.Cells(1, Колонка).Value = стр.НазваниеРеквизита;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
// Выгрузить данные справочника
выборка = Справочники[ИмяСправочника].Выбрать();
СтрокаЛиста = 2;
Пока выборка.Следующий() Цикл
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Попытка
// Установить значение в строке и колонке
Если ТипЗнч(выборка[стр.НазваниеРеквизита])=Тип("Число") Тогда
// Установить формат для типа Число
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "0,00";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Формат(выборка[стр.НазваниеРеквизита],"ЧГ=0");
иначе
// Для всех других типов установим формат "Текстовый"
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "@";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Строка(выборка[стр.НазваниеРеквизита]);
КонецЕсли;
исключение
// в случае ошибки вывести номер строки и колонки
Сообщить("Ошибка установки значения для: " +
выборка[стр.НазваниеРеквизита]);
Сообщить("Стр: " +СтрокаЛиста+ " Кол: " +
Колонка+ " Рек: " + стр.НазваниеРеквизита);
КонецПопытки;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
СтрокаЛиста = СтрокаЛиста + 1;
Состояние("Экспорт из 1С в Excel " + СтрокаЛиста);
КонецЦикла;
// Сохраним созданную книгу в файл xls
Книга.SaveAs(имяФайла);
// Обязательно закроем соединение с COM объектом для освобождения памяти
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + имяФайла );
Исключение
// Обработка ошибок экспорта данных из 1С в Excel
Сообщить("Ошибка записи данных файла :" + имяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Импорт
Исходный код процедуры 1С для загрузки XLS файла:
Код 1C v 8.х Процедура ЧтениеXLSФайла(Элемент)
Если ПустаяСтрока(ИмяФайла) Тогда
Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
Возврат;
КонецЕсли;
Попытка
// Загрузка Microsoft Excel
Состояние("Загрузка Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
Попытка
// Открытие файла Microsoft Excel
Состояние("Открытие файла Microsoft Excel...");
ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
Исключение
Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Попытка
// Обработка файла Microsoft Excel
Состояние("Обработка файла Microsoft Excel...");
// Читаем данные первого листа книги
ExcelЛист = ExcelФайл.Sheets(1);
// Определить количество строк и колонок выбранного листа книги Excel
xlCellTypeLastCell = 11;
ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
Исключение
Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
// Закрыть COM соединение для экономии памяти
ExcelПриложение.Quit();
КонецПопытки;
// Создание описателя типов для таблицы значений
КЧ = Новый КвалификаторыЧисла(15,2);
КС = Новый КвалификаторыСтроки(50);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
// Очистить предыдущие значения
ТаблицаДокумента.Очистить();
ТаблицаДокумента.Колонки.Очистить();
// Создать колонки табличного документа
ТаблицаДокумента.Колонки.Добавить("Номер",ОписаниеТиповС,"Номер",5);
ТаблицаДокумента.Колонки.Добавить("Артикул",ОписаниеТиповС,"Артикул",11);
ТаблицаДокумента.Колонки.Добавить("Описание",ОписаниеТиповС,"Описание",25);
ТаблицаДокумента.Колонки.Добавить("Цена",ОписаниеТиповЧ,"Цена",6);
// Последовательное чтение строк с выбранного листа
Для Строка = 1 По ExcelПоследняяСтрока Цикл
// Обработка нажатия Ctrl + Break
ОбработкаПрерыванияПользователя();
// Добавить данные в табличную часть экранной формы
Стр=ТаблицаДокумента.Добавить();
Стр.Номер = Строка;
Попытка
Стр.Артикул = ExcelЛист.Cells(Строка, 1).Value;
Стр.Описание = ExcelЛист.Cells(Строка, 2).Value;
Стр.Цена = ExcelЛист.Cells(Строка, 3).Value;
Исключение
// Не редко происходит ошибка конвертации отдельной ячейки документа
Сообщить("Ошибка чтения строки файла Microsoft Excel." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
// Отобразить информацию о ходе выполнения обработки
Состояние("Обработка файла Microsoft Excel : "
+ "строка " + Строка + " из " + ExcelПоследняяСтрока);
КонецЦикла;
// Закрыть COM соединение для экономии памяти
ExcelПриложение.Quit();
// Отобразить результаты загрузки в форме элемента
ЭлементыФормы.ТаблицаДокумента.Значение = ТаблицаДокумента;
ЭлементыФормы.ТаблицаДокумента.СоздатьКолонки();
КонецПроцедуры // ЧтениеXLSФайла(Элемент)
Категория:
Работа с Microsoft Office и OpenOffice Чтение и Вывод данных в Excel Замечание: В Excel разделителем дробной части считается символ ",". Поэтому перед сохранением таблицы 1С в формате Excel замените в ней другой разделитель (например ".") на ",". Иначе в Excel с этими числами не удастся произвести вычисления, или они вообще не будут отображаться как числа. Например, в таблице 1С "15.2" отобразится в Excel как "15.фев".
Для 8.х заменить СоздатьОбъект( на Новый COMОбъект(
Чтение (Получение) данных из Excel
Доступ из 1С к Excel производится посредством OLE. Например, код
Код 1C v 7.x Попытка
Эксель = СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;
КонецПопытки;
позволит получить доступ через переменную "Эксель" к запущенному приложению Excel. А далее уже можно получить доступ к книге (файлу), листу и ячейке с данными.Чтобы открыть книгу (файл)
Код 1C v 7.x Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
//ПутьКФайлу - полный путь к файлу книги Excel.
//Выбор листа книги для работы с ним:
Лист = Книга.WorkSheets(НомерЛиста);
//или
Лист = Книга.WorkSheets(ИмяЛиста);
// где НомерЛиста - номер листа в книге, ИмяЛиста - имя листа в книге.
// Получение значения ячейки листа:
Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;
// где НомерСтроки, НомерКолонки - номер строки и номер колонки, на пересечении которых находится ячейка.
Важно: не забывайте поле выполнения нужных действий добавлять код
Код 1C v 7.x Эксель.Quit();
, иначе запущенный процесс останется незавершенным и будет занимать память и процессор компьютера.
Вывод данных в Excel
Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных. Открытие существующей книги описано выше, а для создания новой книги нужно использовать следующий код:
Код 1C v 7.x Попытка
Эксель = СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;
КонецПопытки;
Книга = Эксель.WorkBooks.Add();
Так как при создании книги в Excel автоматически создаются листы (Сервис->Параметры->Общие->Листов в новой книге), то нужно лишь произвести выбор листа, с которым будет вестись работа:
Код 1C v 7.x Лист = Книга.WorkSheets(НомерЛиста);
// либо добавить в книгу новый лист, если необходимо:
Лист = Книга.Sheets.Add();
Следующим шагом будет установка значения ячейки:
Код 1C v 7.x Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
// где НомерСтроки, НомерКолонки - номер строки и номер колонки, на пересечении которых находится ячейка.
И в конце нужно произвести запись созданной книги:
Код 1C v 7.x Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
Возврат;
КонецПопытки;
// где ПутьКФайлу - полный путь к файлу книги Excel (включая имя).
Важно: не забывайте, что в имени файлов не должно содержаться символов \ / : * ? " > < Категория:
Работа с Microsoft Office и OpenOffice Выгрузка данных в Excel с установкой разных параметров Код 1C v 8.х // Процедура выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel
// с указанным именем, используя преобразование данных к типу число и типу строка;
Процедура ОсновныеДействияФормыЭкспорт(Кнопка)
Попытка
Попытка
// Загрузка объекта Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
// Создадим книгу, по умолчанию в ней уже есть листы
Книга = ExcelПриложение.WorkBooks.Add();
// Используем первый лист книги Excel
Лист = Книга.WorkSheets(1);
// Сформировать шапку документа в первой строке листа
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Лист.Cells(1, Колонка).Value = стр.НазваниеРеквизита;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
// Выгрузить данные справочника
выборка = Справочники[ИмяСправочника].Выбрать();
СтрокаЛиста = 2;
Пока выборка.Следующий() Цикл
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Попытка
// Установить значение в строке и колонке
Если ТипЗнч(выборка[стр.НазваниеРеквизита])=Тип("Число") Тогда
// Установить формат для типа Число
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "0,00";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Формат(выборка[стр.НазваниеРеквизита],"ЧГ=0");
иначе
// Для всех других типов установим формат "Текстовый"
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "@";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Строка(выборка[стр.НазваниеРеквизита]);
КонецЕсли;
исключение
// в случае ошибки вывести номер строки и колонки
Сообщить("Ошибка установки значения для: " +
выборка[стр.НазваниеРеквизита]);
Сообщить("Стр: " +СтрокаЛиста+ " Кол: " +
Колонка+ " Рек: " + стр.НазваниеРеквизита);
КонецПопытки;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
СтрокаЛиста = СтрокаЛиста + 1;
Состояние("Экспорт из 1С в Excel " + СтрокаЛиста);
КонецЦикла;
// Сохраним созданную книгу в файл xls
Книга.SaveAs(имяФайла);
// Обязательно закроем соединение с COM объектом для освобождения памяти
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + имяФайла );
Исключение
// Обработка ошибок экспорта данных из 1С в Excel
Сообщить("Ошибка записи данных файла :" + имяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Код 1C v 7.x //Простейший пример вывода из 1С:Предприятия 7.7 в MS Excel. Обеспечение наличия у рабочей книги единственного листа,
//установка размера, жирности и цвета шрифта, ширины колонок, рамок и заливки ячеек. Выравнивание текста
//ячеек, группировка строк, установка числового формата ячеек, закрепление области.
Процедура Вывод()
Попытка
Application=СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки(),"!!!");
Сообщить("Возможно, MS Excel не установлен на этом компьютере.");
Возврат;
КонецПопытки;
//Создание рабочей книги
WorkBook=Application.WorkBooks.Add();
//Получение окна
Window=WorkBook.Windows(1);
//Установка невидимости окна для убыстрения вывода
Window.Visible=0;
//Обеспечение наличия у рабочей книги единственного листа
Если WorkBook.Worksheets.Count=0 Тогда
WorkBook.Worksheets.Add();
Иначе
Application.DisplayAlerts=0;//не выдавать предупреждений
Пока WorkBook.Worksheets.Count>1 Цикл
WorkBook.Worksheets(1).Delete();
КонецЦикла;
Application.DisplayAlerts=-1;//восстановление флага выдачи предупреждений
КонецЕсли;
//Получение рабочего листа
Worksheet=WorkBook.Worksheets(1);
//Задание имени рабочего листа
Worksheet.Name="Пример вывода";
//Заголовок документа
Worksheet.Range("A1").Value="Пример вывода из 1С:Предприятия в MS Excel";
Worksheet.Range("A2").Value="сегодня "+ТекущаяДата();
Worksheet.Range("A1:A2").Font.Size=14;//размер шрифта
Worksheet.Range("A1:A2").Font.Bold=-1;//жирный шрифт
//Задание ширины колонок
Worksheet.Columns(1).ColumnWidth=60;
Worksheet.Columns(2).ColumnWidth=15;
Worksheet.Columns(3).ColumnWidth=15;
//Шапка документа
Worksheet.Range("A4").Value="Первая колонка";
Для ы=7 по 10 Цикл//рамки
Worksheet.Range("A4").Borders(ы).LineStyle=1;
Worksheet.Range("A4").Borders(ы).Weight=-4138;//xlMedium
КонецЦикла;
Worksheet.Range("A4").Interior.ColorIndex=15;//заливка серым
Worksheet.Range("A4").HorizontalAlignment=-4108;//выравнивание текста по центру
Worksheet.Range("B4").Value="Вторая";
Для ы=7 по 10 Цикл
Worksheet.Range("B4").Borders(ы).LineStyle=1;
Worksheet.Range("B4").Borders(ы).Weight=-4138;
КонецЦикла;
Worksheet.Range("B4").Interior.ColorIndex=15;
Worksheet.Range("B4").HorizontalAlignment=-4108;
Worksheet.Range("C4").Value="Третья";
Для ы=7 по 10 Цикл
Worksheet.Range("C4").Borders(ы).LineStyle=1;
Worksheet.Range("C4").Borders(ы).Weight=-4138;
КонецЦикла;
Worksheet.Range("C4").Interior.ColorIndex=15;
Worksheet.Range("C4").HorizontalAlignment=-4108;
//Для группировки строк:
Worksheet.Outline.SummaryRow=0;//"итоговые" строки отображать сверху (если снизу, то 1)
//Вывод строк
Worksheet.Range("A5").Value="Объект аналитики";
Worksheet.Range("A5").Font.ColorIndex=5;//цвет шрифта - синий
Worksheet.Range("B5").Value=123.45;
Worksheet.Range("B5").Font.ColorIndex=5;
Worksheet.Range("C5").Value=678.9;
Worksheet.Range("C5").Font.ColorIndex=5;
Worksheet.Range("A6").Value="Объект аналитики";
Worksheet.Range("A6").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B6").Value=123.45;
Worksheet.Range("B6").Font.ColorIndex=3;
Worksheet.Range("C6").Value=678.9;
Worksheet.Range("C6").Font.ColorIndex=3;
Worksheet.Range("A7").Value="Объект аналитики";
Worksheet.Range("B7").Value=123.45;
Worksheet.Range("C7").Value=678.9;
Worksheet.Range("A8").Value="Объект аналитики";
Worksheet.Range("B8").Value=123.45;
Worksheet.Range("C8").Value=678.9;
Worksheet.Range("A9").Value="Объект аналитики";
Worksheet.Range("A9").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B9").Value=123.45;
Worksheet.Range("B9").Font.ColorIndex=3;
Worksheet.Range("C9").Value=678.9;
Worksheet.Range("C9").Font.ColorIndex=3;
Worksheet.Range("A10").Value="Объект аналитики";
Worksheet.Range("B10").Value=123.45;
Worksheet.Range("C10").Value=678.9;
Worksheet.Range("A11").Value="Объект аналитики";
Worksheet.Range("B11").Value=123.45;
Worksheet.Range("C11").Value=678.9;
Worksheet.Range("A12").Value="Объект аналитики";
Worksheet.Range("A12").Font.ColorIndex=5;//цвет шрифта - синий
Worksheet.Range("B12").Value=123.45;
Worksheet.Range("B12").Font.ColorIndex=5;
Worksheet.Range("C12").Value=678.9;
Worksheet.Range("C12").Font.ColorIndex=5;
Worksheet.Range("A13").Value="Объект аналитики";
Worksheet.Range("A13").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B13").Value=123.45;
Worksheet.Range("B13").Font.ColorIndex=3;
Worksheet.Range("C13").Value=678.9;
Worksheet.Range("C13").Font.ColorIndex=3;
Worksheet.Range("A14").Value="Объект аналитики";
Worksheet.Range("B14").Value=123.45;
Worksheet.Range("C14").Value=678.9;
Worksheet.Range("A15").Value="Объект аналитики";
Worksheet.Range("B15").Value=123.45;
Worksheet.Range("C15").Value=678.9;
Worksheet.Range("A16").Value="Объект аналитики";
Worksheet.Range("A16").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B16").Value=123.45;
Worksheet.Range("B16").Font.ColorIndex=3;
Worksheet.Range("C16").Value=678.9;
Worksheet.Range("C16").Font.ColorIndex=3;
Worksheet.Range("A17").Value="Объект аналитики";
Worksheet.Range("B17").Value=123.45;
Worksheet.Range("C17").Value=678.9;
Worksheet.Range("A18").Value="Объект аналитики";
Worksheet.Range("B18").Value=123.45;
Worksheet.Range("C18").Value=678.9;
//Установка рамок
Для НомСтр=5 по 18 Цикл
Для ы=7 по 10 Цикл
Worksheet.Range("A"+НомСтр).Borders(ы).LineStyle=1;
Worksheet.Range("B"+НомСтр).Borders(ы).LineStyle=1;
Worksheet.Range("C"+НомСтр).Borders(ы).LineStyle=1;
КонецЦикла;
КонецЦикла;
//Группировка строк
Worksheet.Range("7:8").Rows.Group();
Worksheet.Range("10:11").Rows.Group();
Worksheet.Range("14:15").Rows.Group();
Worksheet.Range("17:18").Rows.Group();
Worksheet.Range("6:11").Rows.Group();
Worksheet.Range("13:18").Rows.Group();
//Свёртка группировок до первого уровня
Worksheet.Outline.ShowLevels(1);
//Установка числового формата
Попытка
Worksheet.Range("B5:C18").NumberFormat="# ##0.00";
Исключение
Попытка
Worksheet.Range("B5:C18").NumberFormat="# ##0,00";
Исключение
КонецПопытки;
КонецПопытки;
//Установка видимости приложения и его окна
Application.Visible=-1;
Window.Visible=-1;
//Закрепление области
Worksheet.Range("A5").S_elect();
Window.FreezePanes = -1;
КонецПроцедуры //Вывод
Категория:
Работа с Microsoft Office и OpenOffice Загрузка данных из 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