Загружаем данные из 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(); // закрытие базы данных
КонецПроцедуры
Иногда необходимо подключиться к другим (не 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");
КонецЕсли;
Возврат Зн;
КонецФункции
Источник