diff --git a/MySQL.epf b/MySQL.epf new file mode 100644 index 0000000..bb7f227 Binary files /dev/null and b/MySQL.epf differ diff --git a/README.md b/README.md index b784766..82b9e13 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,140 @@ # 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 \ No newline at end of file diff --git a/src/MySQL/ObjectModule.bsl b/src/MySQL/ObjectModule.bsl new file mode 100644 index 0000000..ffc9451 --- /dev/null +++ b/src/MySQL/ObjectModule.bsl @@ -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 = СокрЛП(Пароль); + +КонецПроцедуры + +// Очищает текст запроса +// +Процедура ОчиститьТекстЗапроса() Экспорт + + мТекстЗапроса = ""; + +КонецПроцедуры + +мМассивЗначений = Новый Массив(); +мТекстЗапроса = ""; \ No newline at end of file diff --git a/src/MySQL/maps.txt b/src/MySQL/maps.txt new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/src/MySQL/maps.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/MySQL/renames.txt b/src/MySQL/renames.txt new file mode 100644 index 0000000..f4331ad --- /dev/null +++ b/src/MySQL/renames.txt @@ -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 diff --git a/src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 b/src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 new file mode 100644 index 0000000..c1e4c93 --- /dev/null +++ b/src/MySQL/und/02c0fdaf-dc46-418d-8473-8e8995a21409 @@ -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} +} +} +} +} \ No newline at end of file diff --git a/src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info b/src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info new file mode 100644 index 0000000..c70b5f3 --- /dev/null +++ b/src/MySQL/und/2eca2134-e84c-47c6-92de-38ec8adca96e.0/info @@ -0,0 +1 @@ +{3,1,0,"",0} \ No newline at end of file diff --git a/src/MySQL/und/copyinfo b/src/MySQL/und/copyinfo new file mode 100644 index 0000000..08913bc --- /dev/null +++ b/src/MySQL/und/copyinfo @@ -0,0 +1,7 @@ +{4, +{0}, +{0}, +{0}, +{0,0}, +{0} +} \ No newline at end of file diff --git a/src/MySQL/und/root b/src/MySQL/und/root new file mode 100644 index 0000000..ea199b9 --- /dev/null +++ b/src/MySQL/und/root @@ -0,0 +1 @@ +{2,02c0fdaf-dc46-418d-8473-8e8995a21409,} \ No newline at end of file diff --git a/src/MySQL/und/version b/src/MySQL/und/version new file mode 100644 index 0000000..c23bfe2 --- /dev/null +++ b/src/MySQL/und/version @@ -0,0 +1,3 @@ +{ +{216,0} +} \ No newline at end of file diff --git a/src/MySQL/und/versions b/src/MySQL/und/versions new file mode 100644 index 0000000..62a26d3 --- /dev/null +++ b/src/MySQL/und/versions @@ -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} \ No newline at end of file