В первую очередь у многих может возникнуть вопрос, зачем вдруг может понабиться «лезть» в базу MYSQL, читать и писать туда данные. Ответ на самом делал довольно простой, дело в том, что MYSQL - это самая популярная база данных, которую используют большинство движков сайтов, да и в целом веб разработчиков, при создании своих проектов. Бывает так, что других способов забрать данные с сайта, кроме как на прямую из базы данных нет. Так как мне приходилось делать интеграции с большим количеством разных сайтов, я пришел к тому, что для этих целей необходимо сделать свое решение для чтения / записи в MYSQL. При этом, хотелось работать с данными в привычном и удобно формате. Поэтому в качестве формата возвращаемых данных я выбрал JSON.
В прошлой статье //infostart.ru/1c/tools/1675452/ я описывал, как с помощью этой компоненты делал загрузку данных из WooCommerce (WordPress), сейчас хочу поделиться самой компонентой, а так же примерами кода для получения и записи данных.
Шаг №1. Установка компоненты
Компонента c использованием технологии Native API, работает как в 32-х, так и 64-х битной версии платформы. Компонента представляет из себя zip архив MYSQL2JSON.zip, внутри которого лежат следующие файлы:
Самый простой способ установки – это создание общего макета и загрузка данных в него:
- Нажимаем кнопку создать
- Пишем любое имя макета, например MYSQL2JSON
- Загружаем zip архив с компонентой
После того как мы поместили компоненту в макет, нам необходимо ее установить, для того, чтобы ее уже можно было использовать при написании кода в нашей конфигурации.
Существуют разные способы установки внешних компонент, не хотелось бы спорить про правильность того или иного способа. Пример:
УстановитьВнешнююКомпоненту("ОбщийМакет.MYSQL2JSON");
Если мы откроем справку по этой процедуре, то там будет следующий текст:
Примечание:
Метод работает только с компонентами, хранящимися в архиве.
Если для конфигурации свойство РежимИспользованияМодальности установлено в НеИспользовать, следует использовать метод НачатьУстановкуВнешнейКомпоненты.
Однако в данном примере как раз тот случай, когда использовать такой подход приемлемо. После выполнения процедуры, мы получим следующее сообщение:
Шаг №2. Работа с компонентой на встроенном языке
Подключаем нашу компоненту
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.MYSQL2JSON", "AddInNative", ТипВнешнейКомпоненты.Native);
AddInStarter = Новый("AddIn.AddInNative.AddInStarter");
Передаем все необходимые параметры в компоненту для получения данных из MYSQL:
ЗаписьJson = Новый ЗаписьJson;
ЗаписьJson.УстановитьСтроку();
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("Server", ДанныеИнтеграции.Server);
ПараметрыЗапроса.Вставить("Database",ДанныеИнтеграции.Database);
ПараметрыЗапроса.Вставить("Username",ДанныеИнтеграции.Username);
ПараметрыЗапроса.Вставить("Password",ДанныеИнтеграции.Password);
ПараметрыЗапроса.Вставить("Port",ДанныеИнтеграции.Port);
МакетТекстЗапросаЗаказы = ПолучитьМакет("ЗапросЗаказы");
ТексЗапросаПоЗаказам = МакетТекстЗапросаЗаказы.ПолучитьТекст();
ТексЗапросаПоЗаказам = СтрЗаменить(ТексЗапросаПоЗаказам, "XX.XX.XXXX", Формат(ДатаНачала, "ДФ=dd.MM.yyyy"));
ТексЗапросаПоЗаказам = СтрЗаменить(ТексЗапросаПоЗаказам, "YY.YY.YYYY", Формат(ДатаОкончания, "ДФ=dd.MM.yyyy"));
ПараметрыЗапроса.Вставить("SQL", ТексЗапросаПоЗаказам);
ЗаписатьJson(ЗаписьJson,ПараметрыЗапроса);
JSONЗаказы = AddInStarter.ЗапуститьФункцию(ЗаписьJson.Закрыть());
ДанныеИнтеграции это структура, куда в ключи «Server», «Database», «Username», «Password», «Port» мы пишем параметры подключения к MYSQL. Это все просто строковые данные. Такой подход позволяет менять параметры подключения к базе в одном месте. Пример:
ДанныеИнтеграции = Новый Структура;
ДанныеИнтеграции.Вставить("Server", "193.107.333.121");
ДанныеИнтеграции.Вставить("Database", "demo1");
ДанныеИнтеграции.Вставить("Username", "demo1");
ДанныеИнтеграции.Вставить("Password", "demo123");
ДанныеИнтеграции.Вставить("Port", "3306");
Все тексты запросов я обычно храню в макетах, запросы написаны на языке SQL, в примере видно, что не которые данные в тексте запроса, типа «XX.XX.XXXX» я заменяю на дату, чтобы в запросе делать отборов заказов с определенной даты. Про тексты запросов я подробно говорил вот в этой статье: //infostart.ru/1c/tools/1675452/
Ну самое главное, в переменную «JSONЗаказы» мы получаем JSON со всеми данными, которые мы получили с помощь SQL запроса.
Ну вот таким не хитрым способом мы преобразовываем JSON в соответствие, которым будет очень удобно работать:
Попытка
ЧтениеJSONЗаказы = Новый ЧтениеJSON;
ЧтениеJSONЗаказы.УстановитьСтроку(JSONЗаказы);
ТаблицаЗаказов = ПрочитатьJSON(ЧтениеJSONЗаказы,Истина);
ЧтениеJSONЗаказы.Закрыть();
Исключение
Возврат Неопределено;
КонецПопытки;
Напоследок, приведу пример кода, по работе со структурой данных по заказу:
Если ТаблицаЗаказов.Получить("error") = "Нет данных" Тогда
Возврат Неопределено;
ИначеЕсли ТипЗнч(ТаблицаЗаказов.Получить("data")) = Тип("Массив") Тогда
Для Каждого СтрокаЗаказа Из ТаблицаЗаказов["data"] Цикл
СтруктураЗаказа = Новый Структура;
НомерЗаказа = СтрокаЗаказа["order_id"];
РезультатПоиска = Документы.ЗаказПокупателя.НайтиПоРеквизиту("НомерНаСайте", НомерЗаказа);
Если Не ЗначениеЗаполнено(РезультатПоиска) Тогда
Клиент1С = "";
СтруктураЗаказа.Вставить("ИД", НомерЗаказа);
СтруктураЗаказа.Вставить("ДатаЗаказа", СтрокаЗаказа["date_created"]);
//Код по созданию струкруты заказа, перечислять все поля не имеет смысла
//Добавление структуры в массив заказов
МассивЗаказов.Добавить(СтруктураЗаказа);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если нет данных, то в ключ «error» будет записано значение «нет данных», ну а если все хорошо и действительно есть что загружать, в ключ «data» попадет массив данными о заказах, которых мы хотим получить из базы данных.
Шаг №3. Запись данных в MYSQL
В прошлом разделе мы подробно рассмотрели, как «читать» данные из MYSQL. Но помимо команды SELECT, внешняя компонента позволяет еще и записывать данные в базу:
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.MYSQL2JSON", "AddInNative", ТипВнешнейКомпоненты.Native);
AddInStarter = Новый("AddIn.AddInNative.AddInStarter");
ЗаписьJson = Новый ЗаписьJson;
ЗаписьJson.УстановитьСтроку();
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("Server", ДанныеИнтеграции.Server);
ПараметрыЗапроса.Вставить("Database",ДанныеИнтеграции.Database);
ПараметрыЗапроса.Вставить("Username",ДанныеИнтеграции.Username);
ПараметрыЗапроса.Вставить("Password",ДанныеИнтеграции.Password);
ПараметрыЗапроса.Вставить("Port",ДанныеИнтеграции.Port);
ПараметрыЗапроса.Вставить("Mode","2"); // не обязательный, 1-Select, 2-Update,Insert,Delete
МакетТекстЗапросаОстаток = ПолучитьМакет("ЗапросОстаток");
ТексЗапросаПоОстаткам = МакетТекстЗапросаОстаток.ПолучитьТекст();
ТексЗапросаПоОстаткам = СтрЗаменить(ТексЗапросаПоОстаткам, "значение2", Формат(Остаток, "ЧРД=.; ЧГ="));
ТексЗапросаПоОстаткам = СтрЗаменить(ТексЗапросаПоОстаткам, "МОЙ_КОД_1С", КодТовара);
ПараметрыЗапроса.Вставить("SQL", ТексЗапросаПоОстаткам);
ЗаписатьJson(ЗаписьJson,ПараметрыЗапроса);
JSONОстатки = AddInStarter.ЗапуститьФункцию(ЗаписьJson.Закрыть());
Как мы видим, для записи данных в структуру, которую мы передаем во внешнюю компонент добавить ключ «Mode». При это для команд изменения данных в БД значение ключа должно быть «2».
Ответы на вопросы:
1) На каком языке программирования был «написана» внешняя компонента?
Ответ: Внешняя компонента написана на Delphi
2) На каких релизах проводилось тестирование?
Ответ: Тестирование проводилось на релизах: 8.3.17.2306 (X32/x64), 8.3.21.1302 (X32/x64)