HelpF.pro

Создание и работа с БД 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/faq8/view/914.html