Загружаем данные из Access в 1С
Код 1C v 8.х Файл = "C:\files\demo.mdb" ;
СтрокаПодключения = "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( ) ;
СтрокаПодключения= "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 ;
Если ФС. СуществуетФайл( КаталогПользователя( ) + "sr.mdb" ) = 0 Тогда
db= wksp. CreateDataBase( КаталогПользователя( ) + "mars_sr.mdb" , ";LANGID=0x0419;CP=1251;COUNTRY=0" ) ;
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= db. OpenRecordset( "BANKS" ) ;
rs. AddNew( ) ;
rs. REC_IND = "1" ;
rs. BANKCODE = "34" ;
rs. BANKNAME = "Инвест" ;
rs. ModifiedFlg = "1" ;
rs. Update( ) ;
db. Close( ) ;
КонецПроцедуры
Иногда необходимо подключиться к другим (не 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( ) ;
КонецЦикла ;
Появилась необходимость выложить часть данных из 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" ) ;
КонецЕсли ;
Возврат Зн;
КонецФункции
Источник