1
0
mirror of https://github.com/salexdv/mysql_1c.git synced 2024-12-12 10:03:35 +02:00

Первый коммит

This commit is contained in:
salexdv 2020-06-29 20:43:07 +03:00
parent 2f5848760e
commit 9a406c3cef
11 changed files with 1239 additions and 1 deletions

BIN
MySQL.epf Normal file

Binary file not shown.

140
README.md
View File

@ -1,2 +1,140 @@
# mysql_1c # mysql_1c
«Класс» для упрощения работы с MySQL из 1С. Позволяет просто выполнять любые виды запросов и получать данные в виде таблицы значений. «Класс» для упрощения работы с MySQL из 1С в Windows.
Позволяет просто выполнять любые виды запросов и получать данные в виде таблицы значений.
## Пример получения данных
```bsl
// Подключение к базе данных
ИмяODBC = "local_base";
ИмяБазы = "base_name";
ИмяПользователя = "base_name_user";
Пароль = "*******";
MySQL = Обработки.MySQL.Создать();
MySQL.Инициализация(ИмяODBC, ИмяБазы, ИмяПользователя, Пароль);
Если НЕ MySQL.УстановитьСоединение(Ложь) Тогда
Сообщить(MySQL.ОписаниеОшибки);
Возврат Ложь;
КонецЕсли;
// Получение таблицы значений и работа с ней
Запрос =
"SELECT order_id,
| order_date,
| order_summ,
| order_customer
|FROM tamble_orders
|WHERE order_loaded=""N""";
ТаблицаЗаказов = MySQL.ПолучитьТаблицуЗначенийПоЗапросу(Запрос);
Если ТаблицаЗаказов = Неопределено Тогда
Сообщить(MySQL.ОписаниеОшибки);
Возврат Ложь;
КонецЕсли;
Если ТаблицаЗаказов.Количество() = 0 Тогда
Сообщить("На сайте нет новых заказов для загрузки.");
Иначе
Для Каждого СтрокаТЗ ИЗ ТаблицаЗаказов Цикл
НомерЗаказа = СтрокаТЗ.order_id;
Покупатель = СтрокаТЗ.order_customer;
КонецЦикла;
КонецЕсли;
```
## Пример записи данных
```bsl
// Добавление новых записей в таблицу базы MySQL
// Одиночная запись
// Соответствие со значениями полей для новой записи таблицы
Товар = Новый Соответствие();
Товар["product_id"] = "158742";
Товар["product_name"] = "1С Управление торговлей 10.3";
Товар["product_price"] = 12000;
// Построение запроса
MySQL.СоздатьЗапрос("INSERT", "table_products", Товар);
// Выполнение
Если НЕ MySQL.ВыполнитьЗапрос() Тогда
Сообщить(MySQL.ОписаниеОшибки);
Возврат Ложь;
КонецЕсли;
// Несколько записей
// Массив в который вставляются соответстия
НовыеТовары = Новый Массив();
Товар = Новый Соответствие();
Товар["product_id"] = "158742";
Товар["product_name"] = "1С Управление торговлей, редакция 10.3";
Товар["product_price"] = 12000;
НовыеТовары.Добавить(Товар);
Товар = Новый Соответствие();
Товар["product_id"] = "158743";
Товар["product_name"] = "1С Управление торговлей, редакция 11";
Товар["product_price"] = 12500;
НовыеТовары.Добавить(Товар);
MySQL.СоздатьЗапрос("INSERT", "table_products", НовыеТовары);
Если НЕ MySQL.ВыполнитьЗапрос() Тогда
Сообщить(MySQL.ОписаниеОшибки);
Возврат Ложь;
КонецЕсли;
// Обновление полей записи
// Соответствие с новыми значениями полей
Товар = Новый Соответствие();
Товар["product_price"] = 13000;
Товар["product_rest"] = 10;
// В четвертом параметре можно указать условие, по которым осуществляется поиск записей для обновления
MySQL.СоздатьЗапрос("UPDATE", "table_products", Товар, "WHERE product_id='158742'");
Если НЕ MySQL.ВыполнитьЗапрос() Тогда
Сообщить(MySQL.ОписаниеОшибки);
Возврат Ложь;
Иначе
Сообщить("Обновлено товаров: " + MySQL.КоличествоИзменныхЗаписей);
КонецЕсли;
// Выполнение произвольного запроса
Запрос = "DELETE FROM table_products WHERE product_id='158742'";
Если НЕ MySQL.ВыполнитьЗапрос(Запрос) Тогда
Сообщить(MySQL.ОписаниеОшибки);
Возврат Ложь;
КонецЕсли;
```
Есть возможность разбить INSERT запрос с несколькими записями на подзапросы, чтобы не вставлять за раз много значений. Например, при добавлении в таблицу более 1000 записей, можно сделать это 10-ю запросами по 100 записей в каждом. Для этого достаточно вызвать код:
```bsl
MySQL.ЭлементовВЗапросе = 100;
```
После этого все массивные INSERTы будут делаться по 100 записей за раз.
Полный текст запроса можно получить так:
```bsl
MySQL.СоздатьЗапрос("INSERT", "table_products", НовыеТовары);
Сообщить(MySQL.ТекстЗапроса());
```
В случае, когда прямой доступ к MySQL запрещен, можно воспользоваться ssh-туннелем. Для этого в обработке есть настройки для запуска Putty.
```bsl
MySQL.ИспользоватьPutty = Истина;
MySQL.Putty = "c:\Program Files\PuTTY\putty.exe"; // Путь к программе Putty (Kitty)
MySQL.User_put = "ssh_user"; // Имя пользователя для установки ssh-соединения
MySQL.Pass_put = "******"; // Пароль
MySQL.Name_put = "session_name"; // Имя сохраненной сесии Putty с настройками соединения
```
### Основные методы:
* **Инициализация** - Первоначальная инициализация для сохранения параметров ODBC
* **ВыполнитьТестовоеПодключение** - Тестирование соединения
* **СоздатьЗапрос** - Создает INSERT/UPDATE/REPLACE/DELETE запросы на основе переданных параметров
* **ВыполнитьЗапрос** - Выполнение переданного или построенного запроса
* **ПолучитьТаблицуЗначенийПоЗапросу** - Выполняет запрос через Recordset и заполняет таблицу значений полученными данными
* **ПолучитьМассивЗначенийПоЗапросу** - Выполняет запрос через Recordset и заполняет массив значений полученными данными
* **ДобавитьЗапрос** - Добавляет текст запроса для выполнения в пакетном режиме
* **ЗакрытьСоединение** - Закрывает существующее подключение к базе MySQL

788
src/MySQL/ObjectModule.bsl Normal file
View File

@ -0,0 +1,788 @@
Перем мСоединение;
Перем мЗапись;
Перем мКоманда;
Перем мТекстЗапроса;
Перем мМассивЗначений;
// Функция возвращает строку, используемую для подключения к базе MySQL
//
Функция ПолучитьСтрокуСоединения()
СтрокаСоединения = "DSN=" + СокрЛП(ODBC) + ";";
СтрокаСоединения = СтрокаСоединения + "Database=" + СокрЛП(DB) + ";";
СтрокаСоединения = СтрокаСоединения + "Uid=" + СокрЛП(User) + ";";
СтрокаСоединения = СтрокаСоединения + "Pwd=" + СокрЛП(Pass) + ";";
Возврат СтрокаСоединения;
КонецФункции
// Функцяи создает и возвращает подключение к базе MySQL
//
Функция УстановитьСоединение(ТестовоеПодключение = Ложь, ВыводитьОшибку = Истина) Экспорт
ОписаниеОшибки = "";
ЗапуститьPuTTY();
мСоединение = Новый COMОбъект("ADODB.Connection");
Попытка
мСоединение.Open(ПолучитьСтрокуСоединения());
Исключение
ОписаниеОшибки = ОписаниеОшибки + ОписаниеОшибки() + Символы.ПС;
Если ВыводитьОшибку Тогда
Сообщить(ОписаниеОшибки);
КонецЕсли;
мСоединение = Неопределено;
КонецПопытки;
Если НЕ ТестовоеПодключение Тогда
СоздатьОбработчикЗаписей();
СоздатьОбработчикКоманд();
КонецЕсли;
Возврат (мСоединение <> Неопределено);
КонецФункции
// Процедура закрывает существующее подключение к базе MySQL
//
Процедура ЗакрытьСоединение() Экспорт
ОписаниеОшибки = "";
Если мСоединение <> Неопределено Тогда
ЗакрытьОбработчикЗаписей();
ЗакрытьОбработчикКоманд();
мСоединение.Close();
мСоединение = Неопределено;
КонецЕсли;
ЗавершитьPuTTY();
КонецПроцедуры
// Функция выполняет простые запросы (INSERT, DELETE, UPDATE)
// в базе MySQL
//
Функция ВыполнитьПростойЗапрос(ТекстЗапроса)
КоличествоИзменныхЗаписей = 0;
ОписаниеОшибки = "";
мКоманда.CommandText = ТекстЗапроса;
мКоманда.CommandType = 1;
Попытка
мКоманда.Execute(КоличествоИзменныхЗаписей);
Исключение
ОписаниеОшибки = "Не удалось выполнить запрос: " + ОписаниеОшибки();
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
// Выполнение переданного или построенного запроса
//
Функция ВыполнитьЗапрос(ТекстЗапроса = Неопределено) Экспорт
ОписаниеОшибки = "";
Если ТекстЗапроса = Неопределено Тогда
Если мМассивЗначений.Количество() = 0 Тогда
Возврат ВыполнитьПростойЗапрос(мТекстЗапроса);
Иначе
Для Каждого ЗначенияЗапроса ИЗ мМассивЗначений Цикл
Если НЕ ВыполнитьПростойЗапрос(СтрЗаменить(мТекстЗапроса, "&VALUES", ЗначенияЗапроса)) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецЕсли;
Иначе
Возврат ВыполнитьПростойЗапрос(ТекстЗапроса);
КонецЕсли;
КонецФункции
// Возвращает список полей для запросов INSERT и REPLACE
// в формате Поле1,Поле2,ПолеN
//
Функция ПолучитьТекстПолейЗапроса(ЗначенияПолей)
Текст = "";
Поля = ЗначенияПолей;
Если ТипЗнч(Поля) = Тип("Массив") Тогда
Поля = ЗначенияПолей[0];
ИначеЕсли ТипЗнч(Поля) = Тип("ТаблицаЗначений") Тогда
Колонки = Новый Соответствие();
Для Каждого Колонка ИЗ Поля.Колонки Цикл
Колонки[Колонка.Имя] = Истина;
КонецЦикла;
Поля = Колонки;
КонецЕсли;
Для Каждого Обход ИЗ Поля Цикл
Текст = Текст + Обход.Ключ + ",";
КонецЦикла;
Возврат Лев(Текст, СтрДлина(Текст) - 1);
КонецФункции
// Возвращает текст для UPDATE запроса с именами и значениями полей в виде
// ИмяПоля1=ЗначениеПоля1,ИмяПоля2=ЗначениеПоля2
//
Функция ПолучитьТекстДляЗапросаОбновления(ЗначенияПолей)
Текст = "";
НомерПоля = 0;
Для Каждого Обход ИЗ ЗначенияПолей Цикл
НомерПоля = НомерПоля + 1;
Текст = Текст + Обход.Ключ + "='" + Обход.Значение + "'";
Если НомерПоля < ЗначенияПолей.Количество() Тогда
Текст = Текст + "," + Символы.ПС;
КонецЕсли;
КонецЦикла;
Возврат Текст;
КонецФункции
// Заполняет массив со значениями полей для запросов INSERT и REPLACE
// Массив хранит значения в виде (ЗначенияПоля1,ЗначенияПоля2,ЗначенияПоляN),
// (ЗначенияПоля1,ЗначенияПоля2,ЗначенияПоляN), (ЗначенияПоля1,ЗначенияПоля2,ЗначенияПоляN)
// В массив значения записываются в количестве ЭлементовВОдномЗапросе
//
Функция ПодготовитьЗначенияЗапроса(ЗначенияПолей, ЭлементовВОдномЗапросе)
Значения = ЗначенияПолей;
Если ТипЗнч(Значения) <> Тип("ТаблицаЗначений") Тогда
Если ТипЗнч(Значения) = Тип("Соответствие") Тогда
Значения = Новый Массив();
Значения.Добавить(ЗначенияПолей);
КонецЕсли;
Текст = "";
НомерЗначения = 0;
ВсегоЗначений = Значения.Количество();
Для Каждого Значение ИЗ Значения Цикл
НомерЗначения = НомерЗначения + 1;
Текст = Текст + "(";
ТекстЗначений = "";
Для Каждого Обход ИЗ Значение Цикл
ТекстЗначений = ТекстЗначений + "'" + Обход.Значение + "',";
КонецЦикла;
Текст = Текст + Лев(ТекстЗначений, СтрДлина(ТекстЗначений) - 1) + ")";
Если ЭлементовВОдномЗапросе > 0 И НомерЗначения % ЭлементовВОдномЗапросе = 0 Тогда
мМассивЗначений.Добавить(Текст);
Текст = "";
КонецЕсли;
Если НомерЗначения < ВсегоЗначений И ЗначениеЗаполнено(Текст) Тогда
Текст = Текст + "," + Символы.ПС;
КонецЕсли;
КонецЦикла;
Иначе
Колонки = Новый Соответствие();
Для Каждого Колонка ИЗ Значения.Колонки Цикл
Колонки[Колонка.Имя] = Истина
КонецЦикла;
Текст = "";
НомерЗначения = 0;
ВсегоЗначений = Значения.Количество();
Для Каждого Значение ИЗ Значения Цикл
НомерЗначения = НомерЗначения + 1;
Текст = Текст + "(";
ТекстЗначений = "";
Для Каждого Колонка ИЗ Колонки Цикл
ТекстЗначений = ТекстЗначений + "'" + Значение[Колонка.Ключ] + "',";
КонецЦикла;
Текст = Текст + Лев(ТекстЗначений, СтрДлина(ТекстЗначений) - 1) + ")";
Если ЭлементовВОдномЗапросе > 0 И НомерЗначения % ЭлементовВОдномЗапросе = 0 Тогда
мМассивЗначений.Добавить(Текст);
Текст = "";
КонецЕсли;
Если НомерЗначения < ВсегоЗначений И ЗначениеЗаполнено(Текст) Тогда
Текст = Текст + "," + Символы.ПС;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(Текст) Тогда
мМассивЗначений.Добавить(Текст);
КонецЕсли;
КонецФункции
// Возвращает текст запроса, созданного функцией СоздатьЗапрос
//
Функция ТекстЗапроса() Экспорт
Если мМассивЗначений.Количество() = 0 Тогда
Возврат мТекстЗапроса;
Иначе
ТекстЗначений = "";
НомерЗначения = 0;
Для Каждого Значения ИЗ мМассивЗначений Цикл
НомерЗначения = НомерЗначения + 1;
ТекстЗначений = ТекстЗначений + Значения;
Если НомерЗначения < мМассивЗначений.Количество() Тогда
ТекстЗначений = ТекстЗначений + "," + Символы.ПС;
КонецЕсли;
КонецЦикла;
Возврат СтрЗаменить(мТекстЗапроса, "&VALUES", ТекстЗначений);
КонецЕсли;
КонецФункции
// Создает текст запроса INSERT, REPLACE, UPDATE на основе переданных
// параметров
//
Функция СоздатьЗапрос(ТипЗапроса = "INSERT", ИмяТаблицы, ЗначенияПолей, Условие = "", ЭлементовВОдномЗапросе = 0) Экспорт
ОписаниеОшибки = "";
мМассивЗначений = Новый Массив();
Если ЭлементовВОдномЗапросе = 0 Тогда
ЭлементовВОдномЗапросе = ЭлементовВЗапросе;
КонецЕсли;
ТипЗапроса = СокрЛП(ВРЕГ(ТипЗапроса));
ИмяТаблицы = СокрЛП(ИмяТаблицы);
Если НЕ ЗначениеЗаполнено(ИмяТаблицы) Тогда
ОписаниеОшибки = "Не указано имя таблицы";
Возврат Ложь;
КонецЕсли;
Если ТипЗапроса <> "DELETE" Тогда
Если НЕ ЗначениеЗаполнено(ЗначенияПолей) Тогда
ОписаниеОшибки = "Не заданы значения полей";
Возврат Ложь;
КонецЕсли;
Если ТипЗнч(ЗначенияПолей) <> Тип("Соответствие")
И ТипЗнч(ЗначенияПолей) <> Тип("Структура")
И ТипЗнч(ЗначенияПолей) <> Тип("Массив")
И ТипЗнч(ЗначенияПолей) <> Тип("ТаблицаЗначений") Тогда
ОписаниеОшибки = "Значения полей имеют неверный тип";
Возврат Ложь;
КонецЕсли;
Если ТипЗапроса = "UPDATE" И (ТипЗнч(ЗначенияПолей) <> Тип("Соответствие") И ТипЗнч(ЗначенияПолей) <> Тип("Структура")) Тогда
ОписаниеОшибки = "Для данного типа запроса в качестве значений полей можно передавать только соответствие или структуру";
Возврат Ложь;
КонецЕсли;
Если ЗначенияПолей.Количество() = 0 Тогда
ОписаниеОшибки = "Передан пустой список полей";
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ТипЗапроса = "INSERT" ИЛИ ТипЗапроса = "REPLACE" Тогда
мТекстЗапроса = ТипЗапроса + " INTO " + ИмяТаблицы + Символы.ПС;
мТекстЗапроса = мТекстЗапроса + "(" + ПолучитьТекстПолейЗапроса(ЗначенияПолей) + ")" + Символы.ПС;
мТекстЗапроса = мТекстЗапроса + " VALUES &VALUES" + Символы.ПС;
ПодготовитьЗначенияЗапроса(ЗначенияПолей, ЭлементовВОдномЗапросе);
ИначеЕсли ТипЗапроса = "UPDATE" Тогда
мТекстЗапроса = "UPDATE " + ИмяТаблицы + " SET " + Символы.ПС;
мТекстЗапроса = мТекстЗапроса + ПолучитьТекстДляЗапросаОбновления(ЗначенияПолей);
ИначеЕсли ТипЗапроса = "DELETE" Тогда
мТекстЗапроса = "DELETE FROM " + ИмяТаблицы;
Иначе
ОписаниеОшибки = "Неизвестный тип запроса";
Возврат Ложь;
КонецЕсли;
Если ТипЗапроса = "UPDATE" ИЛИ ТипЗапроса = "DELETE" Тогда
Если ЗначениеЗаполнено(Условие) Тогда
мТекстЗапроса = мТекстЗапроса + Символы.ПС + Условие;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции
// Добавляет текст запроса для выполнения в пакетном режиме
//
Функция ДобавитьЗапрос(Запрос) Экспорт
ТекстЗапроса = СокрЛП(Запрос);
Если Прав(ТекстЗапроса, 1) <> ";" Тогда
ТекстЗапроса = ТекстЗапроса + ";";
КонецЕсли;
Если ЗначениеЗаполнено(мТекстЗапроса) Тогда
мТекстЗапроса = мТекстЗапроса + Символы.ПС;
КонецЕсли;
мТекстЗапроса = мТекстЗапроса + ТекстЗапроса;
КонецФункции
// Функция выполняет запрос через Recordset и заполняет таблицу
// значений полученными данными
//
Функция ПолучитьТаблицуЗначенийПоЗапросу(ТекстЗапроса) Экспорт
ОписаниеОшибки = "";
ТаблицаЗначений = Неопределено;
Если мЗапись <> Неопределено Тогда
Попытка
мЗапись.Open(ТекстЗапроса);
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат Неопределено
КонецПопытки;
ТаблицаЗначений = Новый ТаблицаЗначений();
ИменаПолей = Новый Массив();
Для Каждого Field ИЗ мЗапись.Fields Цикл
ИменаПолей.Добавить(Field.Name);
ТаблицаЗначений.Колонки.Добавить(Field.Name);
КонецЦикла;
Если мЗапись.EOF() И мЗапись.BOF() Тогда
// Нет записей в запросе
Иначе
Попытка
// Считываем информацию из выборки
мЗапись.MoveFirst();
Пока НЕ мЗапись.EOF() Цикл
СтрокаТЗ = ТаблицаЗначений.Добавить();
Для Каждого Поле ИЗ ИменаПолей Цикл
СтрокаТЗ[Поле] = мЗапись.Fields.Item(Поле).Value;
КонецЦикла;
мЗапись.MoveNext();
КонецЦикла;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
ТаблицаЗначений = Неопределено
КонецПопытки;
КонецЕсли;
ЗакрытьОбработчикЗаписей();
Иначе
ОписаниеОшибки = "Невозможно выполнить запрос т.к. нет активного соединения";
КонецЕсли;
Возврат ТаблицаЗначений;
КонецФункции
// Функция выполняет запрос через Recordset и заполняет массив
// значений полученными данными
//
Функция ПолучитьМассивЗначенийПоЗапросу(ТекстЗапроса, ИмяПоля = Неопределено) Экспорт
ОписаниеОшибки = "";
МассивЗначений = Неопределено;
Если мЗапись <> Неопределено Тогда
Попытка
мЗапись.Open(ТекстЗапроса);
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат Неопределено
КонецПопытки;
МассивЗначений = Новый Массив();
Если мЗапись.EOF() И мЗапись.BOF() Тогда
// Нет записей в запросе
Иначе
Попытка
// Считываем информацию из выборки
мЗапись.MoveFirst();
Пока НЕ мЗапись.EOF() Цикл
Поле = ?(ИмяПоля = Неопределено, 0, ИмяПоля);
МассивЗначений.Добавить(мЗапись.Fields.Item(Поле).Value);
мЗапись.MoveNext();
КонецЦикла;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
МассивЗначений = Неопределено
КонецПопытки;
КонецЕсли;
ЗакрытьОбработчикЗаписей();
Иначе
ОписаниеОшибки = "Невозможно выполнить запрос т.к. нет активного соединения";
КонецЕсли;
Возврат МассивЗначений;
КонецФункции
Функция СоздатьЗаписьТаблицыПоСтруктуре(СтруктураДанных) Экспорт
Ошибка = Ложь;
ИмяТаблицы = Неопределено;
СтруктураДанных.Свойство("ИмяТаблицы", ИмяТаблицы);
Если ЗначениеЗаполнено(ИмяТаблицы) Тогда
Record = New COMОбъект("ADODB.RecordSet");
Попытка
Record.Open(ИмяТаблицы, мСоединение, 0, 4, 2);
Record.AddNew();
Для Каждого Обход ИЗ СтруктураДанных Цикл
Если Обход.Ключ <> "ИмяТаблицы" Тогда
ЗначениеПоля = Обход.Значение;
Если ТипЗнч(ЗначениеПоля) = Тип("ДвоичныеДанные") Тогда
ВремФайл = ПолучитьИмяВременногоФайла("bin");
ЗначениеПоля.Записать(ВремФайл);
Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 1; // Bynary data
Stream.Open();
Попытка
Stream.LoadFromFile(ВремФайл);
Исключение
Ошибка = Истина;
ОписаниеОшибки = "Не получить двоичные данные для записи:" + Символы.ПС + ОписаниеОшибки();
КонецПопытки;
Если НЕ Ошибка Тогда
Record.Fields(Обход.Ключ).Value = Stream.Read();
Stream.Close();
КонецЕсли;
Stream = Неопределено;
ИначеЕсли ТипЗнч(ЗначениеПоля) <> Тип("Число") Тогда
Record.Fields(Обход.Ключ).Value = Строка(ЗначениеПоля);
Иначе
Record.Fields(Обход.Ключ).Value = ЗначениеПоля;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Record.UpdateBatch();
Record.Close();
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Ошибка = Истина;
КонецПопытки;
Иначе
ОписаниеОшибки = "Не задано имя таблицы";
Ошибка = Истина;
КонецЕсли;
Возврат НЕ Ошибка;
КонецФункции
// Функция выполняет проверку соединения с базой MySQL
// Возвращает Истина в случае успешного соединения
// Ложь - если соединение не было установлено
//
Функция ВыполнитьТестовоеПодключение(ВыводитьОшибку = Истина) Экспорт
ОписаниеОшибки = "";
ПодключениеСоздано = УстановитьСоединение(ВыводитьОшибку);
ЗакрытьСоединение();
Возврат ПодключениеСоздано;
КонецФункции
// Функция возвращает объект "ADODB.Recordset",
// связанный с текущим соединением
//
Функция ПолучитьОбработчикЗаписей()
Если мСоединение <> Неопределено Тогда
Recordset = Новый COMОбъект("ADODB.Recordset");
Recordset.ActiveConnection = мСоединение;
Возврат Recordset;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Создает глобальный объект "ADODB.Recordset",
// связанный с текущим соединением
//
Функция СоздатьОбработчикЗаписей()
мЗапись = ПолучитьОбработчикЗаписей();
КонецФункции
// Закрывает объект "ADODB.Recordset"
//
Функция ЗакрытьОбработчикЗаписей()
Попытка
мЗапись.Close();
Исключение
КонецПопытки;
КонецФункции
// Функция возвращает объект "ADODB.Command",
// связанный с текущим соединением
//
Функция ПолучитьОбработчикКоманд()
Если мСоединение <> Неопределено Тогда
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = мСоединение;
Возврат Command;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Создает глобальный объект "ADODB.Command",
// связанный с текущим соединением
//
Функция СоздатьОбработчикКоманд()
мКоманда = ПолучитьОбработчикКоманд();
КонецФункции
// Закрывает объект "ADODB.Command"
//
Функция ЗакрытьОбработчикКоманд()
мКоманда = Неопределено;
КонецФункции
// Проверка реквизитов перед подключением
//
Функция РеквизитыСоединенияЗаполнены() Экспорт
ОписаниеОшибки = "";
Если НЕ ЗначениеЗаполнено(ODBC) Тогда
ОписаниеОшибки = "Не указано имя источника ODBC";
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(DB) Тогда
ОписаниеОшибки = "Не указано имя базы данных";
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(User) Тогда
ОписаниеОшибки = "Не указано имя пользователя";
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Pass) Тогда
ОписаниеОшибки = "Не указан пароль пользователя";
//Возврат Ложь;
КонецЕсли;
Если ИспользоватьPutty Тогда
Если НЕ ЗначениеЗаполнено(Putty) Тогда
ОписаниеОшибки = "Не указан путь к программе plink";
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Name_put) Тогда
ОписаниеОшибки = "Не указано имя настройки PuTTY";
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(User_put) Тогда
ОписаниеОшибки = "Не указано имя пользователя PuTTY";
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Pass_put) Тогда
ОписаниеОшибки = "Не указано пароль пользователя PuTTY";
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции
// Запуск putty
//
Процедура ЗапуститьPuTTY()
Если ИспользоватьPutty Тогда
Если Задержка_put = 0 Тогда
Задержка_put = 5;
КонецЕсли;
ЗапуститьПриложение(Putty + " -load " + Name_put + " -l " + User_put + " -pw " + Pass_put);
ТекДата = ТекущаяДата();
Пока ТекущаяДата() - ТекДата < Задержка_put Цикл
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Закрытие putty
//
Процедура ЗавершитьPuTTY()
Если ИспользоватьPutty Тогда
ЗапуститьПриложение("taskkill /IM plink.exe");
КонецЕсли;
КонецПроцедуры
// Установка параметров соединения
//
Процедура Инициализация(ИмяODBC, ИмяБазы, ИмяПользователя, Пароль) Экспорт
ОписаниеОшибки = "";
мМассивЗначений = Новый Массив();
мТекстЗапроса = "";
ODBC = СокрЛП(ИмяODBC);
DB = СокрЛП(ИмяБазы);
User = СокрЛП(ИмяПользователя);
Pass = СокрЛП(Пароль);
КонецПроцедуры
// Очищает текст запроса
//
Процедура ОчиститьТекстЗапроса() Экспорт
мТекстЗапроса = "";
КонецПроцедуры
мМассивЗначений = Новый Массив();
мТекстЗапроса = "";

1
src/MySQL/maps.txt Normal file
View File

@ -0,0 +1 @@


7
src/MySQL/renames.txt Normal file
View File

@ -0,0 +1,7 @@
02c0fdaf-dc46-418d-8473-8e8995a21409-->und\02c0fdaf-dc46-418d-8473-8e8995a21409
2eca2134-e84c-47c6-92de-38ec8adca96e.0\info-->und\2eca2134-e84c-47c6-92de-38ec8adca96e.0\info
2eca2134-e84c-47c6-92de-38ec8adca96e.0\text-->ObjectModule.bsl
copyinfo-->und\copyinfo
root-->und\root
version-->und\version
versions-->und\versions

View File

@ -0,0 +1,291 @@
{1,
{02c0fdaf-dc46-418d-8473-8e8995a21409},1,
{c3831ec8-d8d5-4f93-8a22-f9bfae07327f,
{1,
{4,0bc46fda-064b-4d30-bb35-46e4b6be1a28,b65468d6-edc4-46e8-b3ee-6c6ce4221770,
{0,
{0,
{0,0,2eca2134-e84c-47c6-92de-38ec8adca96e},"MySQL",
{1,"ru","My SQL"},""}
},00000000-0000-0000-0000-000000000000,"",00000000-0000-0000-0000-000000000000},4,
{2bcef0d1-0981-11d6-b9b8-0050bae0a95d,0},
{3daea016-69b7-4ed4-9453-127911372fe6,0},
{d5b0e5ed-256d-401c-9c36-f630cafd8a62,0},
{ec6bb5e5-b7a8-4d75-bec9-658107a699cf,13,
{
{0,
{25,
{2,
{0,
{0,0,855bf9d9-26d1-4750-a3da-8afdcbaa7ba7},"ODBC",
{1,"ru","Имя источника ODBC"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,9dd26e26-d7b6-4e39-b6ea-2eed8fae714c},"DB",
{1,"ru","Имя базы данных"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,2c2e9942-3321-4f7b-b41c-a41ba5a98625},"User",
{1,"ru","Имя пользователя"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,812f3e70-5004-4381-8cd6-e2ccf8b5055f},"Pass",
{1,"ru","Пароль"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,9c17d9a4-bc82-4b93-9559-0e469aafe164},"Putty",
{1,"ru","Putty"},""},
{"Pattern",
{"S"}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,146e43ce-eeb5-444b-9620-ea958d51586a},"User_put",
{1,"ru","User put"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,73a436cc-79f9-448d-a065-cda2a4858f9c},"Pass_put",
{1,"ru","Pass put"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,8d1272f7-8edc-461a-af40-5ea882808d9a},"ИспользоватьPutty",
{1,"ru","Использовать putty"},""},
{"Pattern",
{"B"}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,07471886-c2ce-4419-a477-990425a9c0b5},"Name_put",
{1,"ru","Name put"},""},
{"Pattern",
{"S",50,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,e60689c5-c914-4047-8742-e3a9cb75ea21},"Задержка_put",
{1,"ru","Задержка put"},""},
{"Pattern",
{"N",2,0,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,5ae1319d-4b65-4e9a-b293-117937b409bd},"ОписаниеОшибки",
{1,"ru","Описание ошибки"},""},
{"Pattern",
{"S"}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,f3fbe5ab-e349-4420-acff-092e9a54cee7},"ЭлементовВЗапросе",
{1,"ru","Элементов в запросе"},""},
{"Pattern",
{"N",5,0,1}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0},
{
{0,
{25,
{2,
{0,
{0,0,6c552ca2-6b18-4c1b-800e-c99171053e7f},"КоличествоИзменныхЗаписей",
{1,"ru","Количество изменных записей"},""},
{"Pattern",
{"N",10,0,0}
}
},0,
{0},
{0},0,"",0,
{"U"},
{"U"},0,00000000-0000-0000-0000-000000000000,2,0,
{5004,0},
{3,0,0},
{0,0},0,
{0},
{"S",""},0}
},0}
}
}
}
}

View File

@ -0,0 +1 @@
{3,1,0,"",0}

7
src/MySQL/und/copyinfo Normal file
View File

@ -0,0 +1,7 @@
{4,
{0},
{0},
{0},
{0,0},
{0}
}

1
src/MySQL/und/root Normal file
View File

@ -0,0 +1 @@
{2,02c0fdaf-dc46-418d-8473-8e8995a21409,}

3
src/MySQL/und/version Normal file
View File

@ -0,0 +1,3 @@
{
{216,0}
}

1
src/MySQL/und/versions Normal file
View File

@ -0,0 +1 @@
{1,7,"02c0fdaf-dc46-418d-8473-8e8995a21409",fd5ec58e-6ca0-42d7-aed4-eadabcda8925,"root",90379935-d3b5-40a1-b764-747314843385,"",0af3b619-528c-481e-80a5-9e023d7bec2c,"2eca2134-e84c-47c6-92de-38ec8adca96e.0",55e4eecd-b131-4425-a54c-0fc46f459fe0,"copyinfo",3470c372-75a6-484c-a87a-7ee754d5abb0,"versions",efeb2d2b-9c26-406c-bc34-344e9887c4cc,"version",b11151a7-b255-497f-a7ba-68694effec0c}