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/faq/view/914.html