Выборка данных из DBF файлов запросом Код 1C v 8.х RS= Новый COMОбъект("ADODB .Recordset");
SSource = "S_elect * FROM nomen.dbf WHERE cost>100";
SConnect = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=nomen.dbf;Initial Catalog=D:\";
RS.Open(SSource,SConnect);
Пока RS.EOF() = 0 Цикл
//Сообщить (RS.Fields("Code").Value+" "+RS.Fields("Name").Value+" "+Строка(RS.Fields("Cost").Value)+" "+RS.Fields("Ed").Value);
Сообщить (RS.Fields("Code").Value+" "+Строка(RS.Fields("Cost").Value));
RS.MoveNext();
КонецЦикла;
RS.Close();
Категория:
XML, DBF, TXT, CSV Полезные процедуры работы с Active Directory (AD) Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка objNameSpace = ПолучитьCOMОбъект("WinNT:");
м = Новый Массив(); м.Добавить("domain"); // Computer User Group GlobalGroup domain
м2 = Новый COMSafeArray(м, "VT_VARIANT");
objNameSpace.Filter = м2;
Для каждого item Из objNameSpace Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "GlobalGroup") Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка objNameSpace = ПолучитьCOMОбъект("WinNT://"+СокрЛП(ИмяДомена));
м = Новый Массив();
м.Добавить(ТипГрупп); // Computer User Group GlobalGroup domain
м2 = Новый COMSafeArray(м, "VT_VARIANT");
objNameSpace.Filter = м2;
Для каждого item Из objNameSpace Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка
objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена) + "/" + СокрЛП(ИмяГруппы) + ", Group");
Для каждого item Из objNameSpace.Members() Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
Массив = ПолучитьСписокПользователейВГруппеДомена (СокрЛП(ИмяДомена), ИмяГруппы);
Для каждого элМассив из Массив Цикл
Если ВРег(элМассив) = ВРег(СокрЛП(ИмяПользователя)) Тогда // пользователь уже в группе
Результат = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка
element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Add(element_user.ADsPath); element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Remove(element_user.ADsPath);
element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект("","ADODB .Connection");
conn.Provider = "ADSDSOObject";
conn.Open("Active Directory Provider");
Исключение Предупреждение("Ошибка подключения к Active Directory!");
Возврат;
КонецПопытки;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока(Стр.Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC="+СокрЛП(Домен.Код)+"' WHERE SAMAccountName='"+Стр.Логин+"'";
rs = conn.Execute(query);
Пока НЕ rs.EOF() Цикл
obj = ПолучитьCOMОбъект(rs.Fields(0).Value);
Если obj.Class="user" Тогда
Стр.НоваяПочта=СокрЛП(obj.EmailAddress);
Если Стр.НоваяПочта<>Стр.СтараяПочта Тогда
Стр.Установить=Истина;
КонецЕсли;
КонецЕсли;
rs.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка получения почты для логина :"+Стр.Логин);
КонецПопытки;
КонецЕсли;
КонецЦикла;
conn.Close();
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ("WbemScripting.SWbemLocator");
Серв = COM.ConnectServer(СокрЛп(ИмяКомпьютера), "\root\cimv2", СокрЛП(Логин), СокрЛП(Пароль));
СписокПроцессов = Серв.execQuery("Sel ect * fr om Win32_Process Where Name = '"+СокрЛП(НазваниеПроцесса)+"'");
Для каждого item Из СписокПроцессов Цикл
item.Terminate();
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Код 1C v 8.х // coder1cv8 - Мой вариант получения почты 1С-ного пользователя:
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес="";
ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(СсылкаПользователь.Код));
Если ПользовательИБ<>Неопределено Тогда
Если ПользовательИБ.АутентификацияОС Тогда
ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/");
Попытка
ЮзерАД=ПолучитьCOMОбъект("WinNT:"+ПользовательОС+",user");
LDAP=ПолучитьCOMОбъект("LDAP://CN="+ЮзерАД.FullName+",OU=Common Users,OU=Regular Users,DC="+Домен+",DC=local");
Адрес=LDAP.Mail;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Адрес;
КонецФункции
Категория:
COM-объекты, WMI, WSH Прямые запросы к SQL серверу. Как то возникла ситуация, когда в справочник, с включенной проверкой на уникальность кода, из вне приходят элементы с такими же кодами. Отключать проверку нельзя. Пришлось делать затычку.
Подключение к SQL в общем то широко описано:
Код 1C v 8.х Функция Подключение(Сервер,БД)
cnn = Новый COMОбъект("ADODB .Connection");
cnn.ConnectionTimeOut = 0;
cnn.CommandTimeOut = 0;
cnn.connectionString = "SERVER="+Сервер+"; Database="+БД+"; DRIVER=SQL Server; UID=sa; PWD=*****;";
cnn.Open();
if cnn.State()=0 then
Сообщить("Не удалось соединиться с сервером");
cnn = 0;
Возврат Ложь;
endif;
cnn.Execute("SET NOCOUNT ON");
Возврат cnn;
КонецФункции
Сервер и БД можно получить и программно, но муторно. Эти данные можно взять из свойств БД на сервере 1С.
Название таблицы и полей в SQL можно получить с помощью команды 1С:
Цитата Глобальный контекст
ПолучитьСтруктуруХраненияБазыДанных (GetDBStorageStructureInfo)
Синтаксис:
ПолучитьСтруктуруХраненияБазыДанных(<Объекты метаданных>, <Имена базы данных>)
Параметры:
<Объекты метаданных> (необязательный)
Тип: Массив. Массив имен объектов метаданных или массив объектов метаданных, для которых требуется получить структуру таблиц базы данных.
<Имена базы данных> (необязательный)
Тип: Булево. Определяет, в каких терминах выдается информация о структуре хранения.
Истина - в терминах СУБД
Ложь - в терминах SDBL.
Значение по умолчанию: Ложь
Возвращаемое значение:
Тип: ТаблицаЗначений. Возвращает таблицу значений с описаниями структуры таблиц, индексов и полей базы данных в терминах SDBL или используемой СУБД, в зависимости от значения параметра "Имена базы данных".
Если параметр не используется, то возвращаемая таблица значений содержит информацию о структуре таблиц базы данных всех объектов метаданных.
Таблица значений включает следующие колонки:
ИмяТаблицыХранения(StorageTableName) – имя таблицы SDBL или базы данных;
ИмяТаблицы(TableName) – имя таблицы в терминах языка запросов (для тех у кого оно есть);
Метаданные(Metadata) – полное имя объекта метаданных;
...
Дальше нам нужно новый элемент справочника все ж таки записать, ну например :
Код 1C v 8.х
Попытка
спр.Записать();
Исключение
Сообщить("Не уникальный код "+стр.Код+" у элемента "+стр.Наименование);
Спр.УстановитьНовыйКод();
Спр.Записать();
КонецПопытки;
Все, делаем подмену.
Код 1C v 8.х подключение=Подключение(Сервер,База);
ТекстЗапроса="UPDATE Номенклатура
|SET Номенклатура._Code="+Формат(КодНужный,"ЧГ=0")+"
|FROM _Reference57 AS Номенклатура
|WHERE (CAST(Номенклатура._Folder AS int)=1)
|AND (Номенклатура._Code="+Формат(Спр.Код,"ЧГ=0")+")
|";
подключение.Execute(ТекстЗапроса);
Сообщить("Код "+КодБыл+" подменен на "+КодНужный);
Категория:
Запросы Прямое подключение к сторонним Базам Данных Иногда необходимо подключиться к другим (не 1С-ным) БД на том же SQL.
Вот примерный код такого подключения:
Код 1C v 8.х Connection = Новый COMОбъект("ADODB .Connection");
СтрокаПодключения = "Provider=SQLOLEDB.1;Password=" + Здесь пароль доступа + ";Persist Security Info=True;User ID=" + Здесь имя пользователя + ";Initial Catalog=" + Здесь имя БД + "; Data Source=" + Здесь имя сервера + ";";
//Ну и выполним какой-нибудь запрос с обходом:
Результат = Новый COMОбъект("ADODB .Command");
Результат.ActiveConnection = Connection; // работаем через это соединение
Результат.CommandTimeOut = Connection.CommandTimeOut; // таков тайм-аут
Результат.CommandType = "adCmdText"; // исполняем в точности процедуру
Результат.CommandText = " S_elect name as Наименование
| FROM
| dbo.sysobjects'";
Выборка = Результат.Execute(); // выполняем процедуру
Пока Выборка.Eof() = 0 Цикл
Сообщить(Выборка.Fields("Наименование").Value);
Выборка.MoveNext();
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Создание и работа с БД MySQL из 1С Появилась необходимость выложить часть данных из 1С в открытый доступ большому числу пользователей.
Что бы не нарушать условий лицензирования и обеспечить безопасность данных, было принято решение развернуть новую базу на MySQL. Так как особо модерировать ее никто не хочет, пришлось сделать управление MySQL-ной БД из 1С, и начал с создания структуры БД. Итак:
Создаем 2 справочника неирархических, один подчинен другому.
а.
Таблицы
б.
Колонки
Таблицы - реквизиты:
Автокод - Булево (Определяет необходимость нумеровать запись уникальным кодом, или отдать нумерование на откуп MySQL)
Таблицы - колонки:
ТипДанных - Число (в коде определим тип хранящихся данных по числу)
Длина - Число (длина хранящихся данных)
МожетБытьНоль - булево (может ли хранится пустое значение)
Связь - СсылкаНа таблицу (С которой есть связь все к одному)
Заполняем значениями справочники...
Теперь подключаемся:
Код 1C v 8.х Connection = Новый COMОбъект("ADODB .Connection");
СтрокаПодключения = "DRIVER={MySQL ODBC 5.1 Driver};OPTION=3;DATABASE=" + константы.lk_БД.Получить() + ";PWD=" + константы.lk_Пароль.Получить() + ";PORT=3306;SERVER=" + константы.lk_Сервер.Получить() + ";UID=" + константы.lk_Пользователь.Получить() + ";";
Connection.Open(СокрЛП(СтрокаПодключения));
Сначала удалим таблицы если они есть:
Код 1C v 8.х Результат = Новый COMОбъект("ADODB .Command");
Результат.ActiveConnection = Connection; // работаем через это соединение
Результат.CommandTimeOut = Connection.CommandTimeOut; // таков тайм-аут
Результат.CommandType = "adCmdText";
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Таблицы.Наименование КАК Таблица
| ИЗ
| Справочник.Таблицы КАК Таблицы";
ВыборкаТаблиц = Запрос.Выполнить().Выбрать();
Пока ВыборкаТаблиц.Следующий() Цикл
Результат.CommandText = " D_rop TABLE IF EXISTS " + ВыборкаТаблиц.Таблица + " ;";
Результат.Execute();
КонецЦикла;
Теперь приступим к созданию таблиц БД:
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Таблицы.Наименование КАК Таблица,
| Колонки.Наименование КАК Колонка,
| Колонки.ТипДанных,
| Колонки.Длина,
| Колонки.МожетБытьНоль,
| Колонки.Связь.Наименование КАК Связь
|ИЗ
| Справочник.Колонки КАК Колонки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Таблицы КАК Таблицы
| ПО Колонки.Владелец = Таблицы.Ссылка
|
|ИТОГИ ПО
| Таблица";
ВыборкаТаблиц = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаТаблиц.Следующий() Цикл
Скрипт = " CREATE TABLE " + ВыборкаТаблиц.Таблица + " ( " + символ(13) +
" " + ПолучитьКолонкуID(ВыборкаТаблиц.Таблица) + " int(11) NOT NULL " + ?(Справочники.Lk_Таблицы.НайтиПоНаименованию(ВыборкаТаблиц.Таблица).АвтоКод,"auto_increment","") + "," + символ(13);
Выборка = ВыборкаТаблиц.Выбрать();
Строчека = "" ;
Ключики = "";
Пока Выборка.Следующий() цикл
Строчека = Строчека + "`" + Выборка.Колонка + "` " + ПолучитьПродолжениеСкрипта(Выборка.ТипДанных,Выборка.длина,Выборка.МожетБытьНоль) + "," + символ(13);
ЕСли ЗначениеЗаполнено(Выборка.Связь) Тогда
Ключики = Ключики + ", KEY `FK_" + ВыборкаТаблиц.Таблица + "-" + Выборка.Колонка + "` (`" + Выборка.Колонка + "`),
| CONSTRAINT `FK_" + ВыборкаТаблиц.Таблица + "-" + Выборка.Колонка + "` FOREIGN KEY (`" + Выборка.Колонка + "`) REFERENCES `" + Выборка.Связь + "` (`" + ПолучитьКолонкуID(Выборка.Связь) + "`)" + Символ(13) ;
КонецЕсли;
КонецЦикла;
Скрипт = Скрипт + Строчека;
Скрипт = Скрипт + " PRIMARY KEY (" + ПолучитьКолонкуID(ВыборкаТаблиц.Таблица) + ") " + символ(13) + Ключики +
" ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
Сообщить("Таблица создана: " + ВыборкаТаблиц.Таблица);
Результат.CommandText = скрипт;
Результат.Execute();
КонецЦикла;
Connection.Close();
И под закуску недостающие функции, использованные в основном тексте:
Код 1C v 8.х Функция ПолучитьКолонкуID(зн) экспорт
ПрефиксКончился = Ложь;
Колонка = "";
Для сч = 1 по СтрДлина(зн) Цикл
Символик = Mid(зн,Сч, 1);
Если ПрефиксКончился Тогда
Колонка = Колонка + Символик;
КонецЕсли;
Если Символик = "_" Тогда
ПрефиксКончился = Истина;
КонецЕсли;
КонецЦикла;
Если Колонка = "" Тогда
Колонка = зн;
КонецЕсли;
Колонка = Колонка + "ID";
Возврат Колонка;
КонецФункции
Предполагается что название таблиц идут с префиксом например: prefix_NameTable
Код 1C v 8.х Функция ПолучитьПродолжениеСкрипта(ТипД,ДлинаД,Ноль) экспорт
Если ТипД = 1 тогда //строка
Зн = " varchar(" + Строка(ДлинаД) + ") " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 2 Тогда //число
Зн = " int(11) " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 3 Тогда //смаллчисло
Зн = " smallint(6) " + ?(Ноль, "null","NOT NULL");
ИначеЕсли типД = 4 тогда //текст
Зн = " text";
ИначеЕсли ТипД = 5 тогда // дата
Зн = " date " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 6 Тогда //смаллчисло
Зн = " bit(1) " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 7 Тогда // Дата и время
Зн = " dateTime " + ?(Ноль, "null","NOT NULL");
КонецЕсли;
Возврат Зн;
КонецФункции
Источник Категория:
COM-объекты, WMI, WSH Прямой SQL запрос к базе 7.7 из базы 8.x Код 1C v 8.х РабДата=Лев(СокрЛП(РабочаяДата),10);
//НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(ДобавитьМесяц(РабочаяДата, -1 ))),10);
НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
НачМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
МойЗапрос = "
|S_elect SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RG38027.SP38026) AS Ost
|FROM RG38027, SC172, _1SJOURN, DH38011
|WHERE (RG38027.SP38024 = SC172.ID) AND (CONVERT (DATETIME , RG38027.PERIOD) = CONVERT (DATETIME , '"+НачПрошлогоМесяца+"')) AND
|(RG38027.SP38025 = _1SJOURN.IDDOC) AND (RG38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|
|U_nion ALL
|
|S_elect SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) AS Ost
|FROM RA38027, SC172, _1SJOURN, DH38011
|WHERE (RA38027.SP38024 = SC172.ID) AND (RA38027.IDDOC=_1SJOURN.IDDOC) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) <= CONVERT (DATETIME , '"+РабДата+"')) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) > CONVERT (DATETIME , '"+НачМесяца+"')) AND
|(RA38027.SP38025 = _1SJOURN.IDDOC) AND (RA38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|HAVING SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) > 0
|ORDER BY SC172.DESCR";
Connection = Новый COMОбъект("ADODB .Connection");
//Connection.Provider = Провайдер;
Connection.ConnectionString = мдСтрокаПодключения;
//Сообщить(МойЗапрос);
Попытка
Connection.Open();
Исключение
Сообщить("Подключение - bad!");
КонецПопытки;
RS = Новый COMОбъект("ADODB .Recordset");
//RS.CursorType = 3;
RS.Open(МойЗапрос, Connection );
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КонтрагентНаименование", ПолучитьОписаниеТиповС(50),"Контрагент",30);
ТЗ.Колонки.Добавить("ИДДокумента", ПолучитьОписаниеТиповС(10));
ТЗ.Колонки.Добавить("НомерДок", ПолучитьОписаниеТиповС(10),"№ заявки",10);
ТЗ.Колонки.Добавить("ДатаДок", ПолучитьОписаниеТиповС(10),"дата заявки",10);
ТЗ.Колонки.Добавить("СуммаОстаток", ПолучитьОписаниеТиповЧ(10, 2),"Сумма",15);
Пока RS.EOF() = 0 Цикл
КонтрагентНаименование = RS.Fields("DESCR").Value;
ИДДокумента = RS.Fields("SP38025").Value;
НомерДок = RS.Fields("DOCNO").Value;
ДатаДок = RS.Fields("DATADOC").Value;
СуммаОстаток = Число(RS.Fields("Ost").Value);
Если СуммаОстаток = 0 Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Стр=ТЗ.Добавить();
Стр.КонтрагентНаименование = КонтрагентНаименование;
Стр.ИДДокумента = ИДДокумента;
Стр.НомерДок = НомерДок;
Стр.ДатаДок = Дата(ДатаДок);
Стр.СуммаОстаток = СуммаОстаток;
RS.MoveNext();
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Загрузка данных из 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(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
Категория:
Конвертация данных, Обмен, Перенос Как в 7.7 прочитать файл *.csv в UTF-8 Код 1C v 7.x Процедура Сформировать()
Перем Имя,Путь;
Если ФС.ВыбратьФайл(0,Имя,Путь,"","*.*|*.*","*")=0 Тогда
Возврат;
КонецЕсли;
Файл=Путь+Имя;
Стрим=СоздатьОбъект("ADODB .Stream");
Стрим.Type=2;
Стрим.charset="windows-1251";
Стрим.Open();
Стрим.LoadFromFile(Файл);
Стрим.charset="utf-8";
Стр=Лев(Стрим.ReadText(),255);
Сообщить(Стр);
КонецПроцедуры
// еще способ
Процедура Сформировать()
Перем Имя,Путь;
Если ФС.ВыбратьФайл(0,Имя,Путь,"","*.*|*.*","*")=0 Тогда
Возврат;
КонецЕсли;
Файл=Путь+Имя;
УТФ16=КаталогВременныхФайлов()+_GetPerformanceCounter()+"-unicode.txt";
ЦП1251=КаталогВременныхФайлов()+_GetPerformanceCounter()+"-cp1251.txt";
БАТ=КаталогВременныхФайлов()+_GetPerformanceCounter()+".bat";
Стр="@echo off
|chcp 1251 > nul
|chcp 65001 |>> """+УТФ16+""" cmd /u /c ""type """+Файл+""" & chcp 1251 > nul""
|chcp 1251 > nul
|type """+УТФ16+""" > """+ЦП1251+"""
|chcp 866 > nul";
Текст=СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(Стр);
Текст.Записать(БАТ);
КомандаСистемы(БАТ);
Текст=СоздатьОбъект("Текст");
Текст.Открыть(ЦП1251);
Для Сч=1 По Текст.КоличествоСтрок() Цикл
Сообщить(Лев(Текст.ПолучитьСтроку(Сч),255));
КонецЦикла;
ФС.УдалитьФайл(УТФ16);
ФС.УдалитьФайл(ЦП1251);
ФС.УдалитьФайл(БАТ);
КонецПроцедуры
Посмотрите еще:
Функции перекодировки текста в/из UTF-8 штатными средствами 1с 7.7 Категория:
COM-объекты, WMI, WSH Загрузка данных в 1С из FoxPro Deggy пишет:
Так сейчас так веду импорт из FoxPro-шных таблиц в восьмерку. Вот например заполнение справочника стран:
Код 1C v 8.х НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=\\192.168.***.***\server\baza\;
|Exclusive=No; Collate=Machine;NULL=NO;DELETED=YES;BACKGROUNDFETCH=NO;";
Connect = Новый COMОбъект("ADODB .Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
RS = Новый COMОбъект("ADODB .RecordSet");
RS.Open("Select * from country where !deleted()",Connect);
пока RS.EOF()=0 цикл
Если Число(RS.Fields("cntry_code").Value)>0 тогда
РезультатПоиска = Справочники.КлассификаторСтранМира.НайтиПоКоду(Число(RS.Fields("cntry_code").Value));
Если РезультатПоиска.Пустая() Тогда
НоваяСтрана = Справочники.КлассификаторСтранМира.СоздатьЭлемент();
НоваяСтрана.Код =Число(RS.Fields("cntry_code").Value);
НоваяСтрана.Наименование = СокрЛП(RS.Fields("cntry_name").Value);
НоваяСтрана.Записать();
Иначе
НайденнаяСтрана=РезультатПоиска.ПолучитьОбъект();
НайденнаяСтрана.Наименование=СокрЛП(RS.Fields("cntry_name").Value);
НайденнаяСтрана.Записать();
Сообщить("Страна с кодом "+ СокрЛП(RS.Fields("cntry_code").Value)+ "уже существует");
конецесли;
КонецЕсли;
сообщить("-------------------");
Сообщить(СокрЛП(RS.Fields("cntry_code").Value)+" " + СокрЛП(RS.Fields("cntry_name").Value));
RS.MoveNext();
КонецЦикла;
RS.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
Категория:
Конвертация данных, Обмен, Перенос Загрузка данных из текстовых файлов с выборкой через ADO. Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
// Параметры
// Стр_КаталогДанных - <Строка>
// Автор: Gmix 04.05.2006 12:22:09
// Возвращаемое значение:
// <Булево>
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB .Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB .Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB .Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimited;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции
Автор
Журавлев Михаил Викторович Категория:
XML, DBF, TXT, CSV Загрузка данных из 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 Пример чтения текста в кодировке ISO Код 1C v 7.x
Функция Перекодировка(Стр="",Кодировка="windows-1251")
Стрим = СоздатьОбъект("Adodb .Stream");
Стрим.Type = 2;
Стрим.Mode= 3;
Стрим.charset="iso-8859-5";
Стрим.Open();
Стрим.WriteText(Стр);
Стрим.Position=0;
Стрим.charset=Кодировка;
Рез=Стрим.ReadText(-1);
Стрим.Close();
Возврат Рез;
КонецФункции
//Если предыдущая функция не срабатывает, то попробуйте:
Стрим = СоздатьОбъект("Adodb .Stream");
Стрим.charset="iso-8859-5";
Стрим.Open();
Стрим.LoadFromFile("c:\WORK\H R\PSHRR848.C");
Стрим.Position=0; // здесь уже можно дергать нормальный текст
Стрим2 = СоздатьОбъект("Adodb .Stream");
Стрим2.charset="windows-1251";
Стрим2.Open();
Стрим2.WriteText(Стрим.ReadText);
Стрим2.Position=0;
Рез=Стрим2.ReadText(-1);
Стрим.Close();
Стрим2.Close();
//Выведем в Сообщить результаты
Message("2 = "+Рез);
Message("StrLen(Рез) = "+StrLen(Рез));
// Кратко
Стрим = СоздатьОбъект("Adodb .Stream");
Стрим.charset="iso-8859-5";
Стрим.Open();
Стрим.LoadFromFile("c:\WORK\H R\PSHRR848.C");
Рез=Стрим.ReadText();
Код 1C v 7.x //Код где, ни единого объекта. smaharbA
Процедура Сформировать()
Стр="Нажрися вотки и закуси ка селедкой! ";
База=""+_GetPerformanceCounter()+".txt";
УТФ=КаталогВременныхФайлов()+"УТФ"+База;
ИСО=КаталогВременныхФайлов()+"ИСО"+База;
ДОС=КаталогВременныхФайлов()+"ДОС"+База;
ОбратноДОС=КаталогВременныхФайлов()+"ОбратноДОС"+База;
Текст=СоздатьОбъект("Текст");
Текст.КодоваяСтраница(1);
Для Сч=1 По 10 Цикл
Текст.ДобавитьСтроку(Стр);
КонецЦикла;
Текст.Записать(ДОС);
Текст.Очистить();
КомандаСистемы("chcp 28595 > nul & echo off 2> """+ИСО+""" & for /f ""delims="" %i in ("+ДОС+") do (chcp 28595|>> """+ИСО+""" echo %i)");
// КомандаСистемы("cmd /c ""chcp 28595|> """+ИСО+""" echo "+Стр+"""");
Текст.КодоваяСтраница(0);
Текст.ДобавитьСтроку(Симв(255)+Симв(254));
Текст.Записать(УТФ);
КомандаСистемы("chcp 28595|> nul echo & cmd /u /c type """+ИСО+""" >> """+УТФ+"""");
КомандаСистемы("type """+УТФ+""" > """+ОбратноДОС+"""");
Текст.КодоваяСтраница(1);
Текст.Открыть(ОбратноДОС);
Для Сч=1 По Текст.КоличествоСтрок() Цикл
Сообщить(Текст.ПолучитьСтроку(Сч));
КонецЦикла;
КонецПроцедуры
Категория:
Полезные, Универсальные Функции Как получить выборку запросом из таблиц базы MySql Код 1C v 8.х //п_Текст - ТекстЗапроса... вернётся соответственно ТЗ
Функция Прямой_запрос_к_jabber(п_Текст) Экспорт
л_ТЗ = Новый ТаблицаЗначений;
л_число_попыток = 0;
л_Запрос_выполнен = Ложь;
Пока (л_Запрос_выполнен = Ложь) И (л_число_попыток <= 3) Цикл
Если (гл_Соединение_jb.State = 0) Или (гл_Соединение_jb.DefaultDatabase <> "log_1c") Тогда
гл_Соединение_jb = "";
л_Параметры_соединения = "DRIVER={MySQL ODBC 5.1 Driver};OPTION=3;DATABASE=BAZADANNIH_IMYA;PWD=PAROLLLLL;PORT=3306;SERVER=ip_adres_servera;UID=admin";
гл_Соединение_jb = Новый COMОбъект("ADODB .Connection");
Попытка
гл_Соединение_jb.Open(л_Параметры_соединения);
Исключение
КонецПопытки;
КонецЕсли;
л_Команда = Новый COMОбъект("ADODB .Command");
л_Команда.ActiveConnection = гл_Соединение_jb;
л_Команда.CommandText = п_Текст;
л_Команда.CommandType = 1;
л_Набор_записей = Новый COMОбъект("ADODB .Recordset");
л_Набор_записей.CursorType = 3;
л_число_попыток = л_число_попыток + 1;
Попытка
л_Набор_записей = л_Команда.Execute();
л_Запрос_выполнен = Истина;
Исключение
КонецПопытки;
КонецЦикла;
Если (л_Запрос_выполнен = Ложь) Тогда
Сообщить(ОписаниеОшибки());
Возврат(л_ТЗ);
Иначе
л_Число_колонок = л_Набор_записей.Fields.Count - 1;
Если (л_Число_колонок > -1) Тогда
Для Ф = 0 По л_Число_колонок Цикл
л_Колонка_добавлена = Ложь;
л_Префикс = "";
л_сч = 0;
Пока (л_Колонка_добавлена = Ложь) Цикл
Попытка
л_ТЗ.Колонки.Добавить(л_Префикс + л_Набор_записей.Fields(Ф).Name);
л_Колонка_добавлена = Истина;
Исключение
л_Префикс = ?(л_сч = 0, "_", "_" + л_сч + "_");
л_сч = л_сч + 1;
КонецПопытки;
КонецЦикла;
КонецЦикла;
Если (л_Набор_записей.EOF() = Истина) И (л_Набор_записей.BOF() = Истина) Тогда
Иначе
л_Набор_записей.MoveFirst();
Пока (л_Набор_записей.EOF() = 0) Цикл
л_стр = л_ТЗ.Добавить();
Для Ф = 0 По л_Число_колонок Цикл
л_стр[Ф] = л_Набор_записей.Fields(Ф).Value;
КонецЦикла;
л_Набор_записей.MoveNext();
КонецЦикла;
КонецЕсли;
КонецЕсли;
Попытка
л_Набор_записей.Close();
Исключение
КонецПопытки;
Возврат(л_ТЗ)
КонецЕсли;
КонецФункции
Немного кривое решение... но как шаблон вполне
Megas Категория:
COM-объекты, WMI, WSH Функция выборки данных из SQL сервера и передача во временную таблицу 1С Код 1C v 8.х Функция ЗапросSQL (SQLServer,Login,Password,ЗапросSQL)
СтрокаСоединения = ("Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");
СоединениеSQL = Новый ComObject("ADODB .Connection");
СоединениеSQL.ConnectionString=СтрокаСоединения;
Попытка
СоединениеSQL.Open();
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB .RecordSet");
ЗаписиSQL.ActiveConnection = СоединениеSQL;
ЗаписиSQL = СоединениеSQL.Execute (ЗапросSQL);
Таблица = Новый ТаблицаЗначений;
Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
//Сообщить(ИмяСтолбца);
КонецЦикла;
Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы
НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
//Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;
ЗаписиSQL.MoveNext();
КонецЦикла;
Состояние ("Закрываем соединение с SQL...");
ЗаписиSQL.Close();
СоединениеSQL.Close();
Возврат Таблица; // Возврат таблицы значений запроса SQL
КонецФункции
Категория:
COM-объекты, WMI, WSH Получения курса валют из Интернет Код 1C v 8.х Соединение = Новый HTTPСоединение("export.rbc.ru"); //готовим соединение
ИмяФайла = ПолучитьИмяВременногоФайла(".txt");
//строка-образец
//http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=USD&d1=18&m1=01&y1=2009&d2=17&m2=02&y2=2009&lastdays=30&separator=TAB&data_format=BROWSER&header=1
//http://export.rbc.ru/free/cb.5/free.fcgi?period=DAILY&tickers=USDEUR_BASKET&d1=08&m1=07&y1=2009&d2=22&m2=07&y2=2009&lastdays=14&separator=TAB&data_format=BROWSER&header=1
СтрокаСоединения="/free/"+Источник+"/free.fcgi?period=DAILY&tickers="+Валюта1+"&d1="+День1+"&m1="+Месяц1+"&y1="+Год1+"&d2="+День2+"&m2="+Месяц2+"&y2="+Год2+"&separator=%7C&data_format=BROWSER";
СтрокаСоединения=СтрЗаменить(СтрокаСоединения," ","");
Попытка //соединяемся
Соединение.Получить(СтрокаСоединения,ИмяФайла);
Исключение
Сообщить("Невозможно получить курс по адресу http://export.rbc.ru"+СтрокаСоединения);
КонецПопытки;
КурсыТекст=Новый ТекстовыйДокумент; //читаем результат запроса
КурсыТекст.Прочитать(ИмяФайла);
Код 1C v 8.х // еще пример
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект("MSXML2.XMLHTTP");
соминет.open ("GET", Адресс, Ложь);
соминет.send();
Возврат соминет.responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
// Медот преобразования даты времен 1Сv7
//Т=Строка(Дат);
//Возврат Сред(Т,7,4)+"/"+Сред(Т,4,2)+"/"+Лев(Т,2);
Возврат Формат(Дат,"ДФ=""гггг/ММ/дд""");
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
//Список - список валют
Для А = 1 по Список.Количество() цикл
Если Список[а-1].Пометка тогда
Сообщить("Загружаем курсы для "+Строка(Список[а-1].Значение));
Код = Строка(Список[а-1].Значение.Код);
Дат = ПериодС;
Пока Дат <= ПериодПо цикл
Стр = ПолучитьКакСтроку("http://cbrates.rbc.ru/tsv/"+Код+"/"+ПреобразоватьДату(Дат)+".tsv");
Поз = Найти(Стр,Символы.Таб);
Если Поз = 0 Тогда
Дат = Дат + 86400;
Продолжить;
КонецЕсли;
Кратность = Число(СокрЛП(Лев(стр,Поз-1)));
курс = Число(СокрЛП(Сред(Стр,Поз+1,СтрДлина(Стр)-Поз)));
Сообщить("Дата="+Строка(Дат)+" Курс="+Строка(курс)+" Кратность="+Строка(Кратность));
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Дат;
Запись.Валюта = Список[а-1].Значение.Ссылка;
Запись.Курс = Курс;
Запись.Кратность = Кратность;
Запись.Записать(Истина);
Дат = Дат + 86400;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Код 1C v 7.x // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB .Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
Категория:
COM-объекты, WMI, WSH