Создание и работа с БД 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" ) ;
КонецЕсли ;
Возврат Зн;
КонецФункции
Источник Опубликовано на сайте: https://HelpF.pro Прямая ссылка: https://HelpF.pro/faq/view/914.html