Внешняя компонента для работы с MYSQL в формате JSON

25.06.23

Разработка - Разработка внешних компонент

В этой статье я хочу познакомить вас с собственным инструментом для получения данных из базы данных MYSQL, который я активно использовал для своих проектов.

Скачать файлы

Наименование Файл Версия Размер
Внешняя компонента для работы с MYSQL в формате JSON:
.zip 2,17Mb
2
.zip 2,17Mb 2 Скачать

В первую очередь у многих может возникнуть вопрос, зачем вдруг может понабиться «лезть» в базу MYSQL, читать и писать туда данные. Ответ на самом делал довольно простой, дело в том, что MYSQL - это самая популярная база данных, которую используют большинство движков сайтов, да и в целом веб разработчиков, при создании своих проектов. Бывает так, что других способов забрать данные с сайта, кроме как на прямую из базы данных нет. Так как мне приходилось делать интеграции с большим количеством разных сайтов, я пришел к тому, что для этих целей необходимо сделать свое решение для чтения / записи в MYSQL. При этом, хотелось работать с данными в привычном и удобно формате. Поэтому в качестве формата возвращаемых данных я выбрал JSON.

В прошлой статье //infostart.ru/1c/tools/1675452/ я описывал, как с помощью этой компоненты делал загрузку данных из WooCommerce (WordPress), сейчас хочу поделиться самой компонентой, а так же примерами кода для получения и записи данных.

 

Шаг №1. Установка компоненты

 

Компонента c использованием технологии Native API, работает как в 32-х, так и 64-х битной версии платформы. Компонента представляет из себя zip архив MYSQL2JSON.zip, внутри которого лежат следующие файлы:

Самый простой способ установки – это создание общего макета и загрузка данных в него:

  1. Нажимаем кнопку создать
  2. Пишем любое имя макета, например MYSQL2JSON
  3. Загружаем 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) 

обмен с интернет-магазином интеграция сайтом MYSQL внешняя компонента

См. также

Внешняя компонента WebSocket для 1С (c поддержкой Authorization token bearer)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента в виде библиотеки (.dll файл), позволяющая посылать команды и получать ответы по протоколу WebSocket из 1С. Компонента работает только на стороне "клиента".

4440 руб.

22.06.2020    16001    13    33    

19

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    51451    32    69    

41

Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.

Разработка внешних компонент Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Платформа 1С v8.1 Россия Платные (руб)

Аддон "Структура Обмена" (ExchangeStruc) - это компонента, которая обеспечивает доступ к разделяемым процессом структурам, аналогичным структурам 1С. Обеспечивает прозрачную передачу данных примитивных типов, в том числе Двоичных данных, в режиме Реального времени между разными контекстами (формами) или потоками одного процесса. В перспективе функционал будет расширен для обмена между процессами, даже разных версий платформ. Совместим с версиями Windows рабочих станций и серверов, с платформами 1С разных версий и релизов в режиме Native начиная с 8.2, и в режиме COM начиная с версий 7.7. По скорости чтения и записи лишь немногим уступает стандартной структуре 1С. НОВОЕ: Добавлен функционал регистрации компоненты COM в качестве OLE Auto (COMОбъект) для поддержки её работы в серверах старых версий 1С: 8.0 и 8.1, где работа с компонентами исключена. Теперь можно коммуникацию с Фоновыми заданиями на этих версиях проводить.

7200 руб.

19.04.2023    4632    1    0    

3

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    24999    129    93    

78

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44110    115    64    

58

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    34267    100    123    

107

Внешняя компонента для работы с Apach Kafka

Инструментарий разработчика Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример взаимодействия 1С с Apach Kafka посредством внешней компоненты, разработанной на основе официальной библиотеки librdkafka (the Apache Kafka C/C++ client library).

22.11.2023    2148    41    ivan1703    25    

37

Внешняя компонента GraphQL клиент для 1С

Разработка внешних компонент Платформа 1С v8.3 Платформа 1C v8.2 Платные (руб)

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    2245    1    0    

1
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. sinichenko_alex 171 26.06.23 05:37 Сейчас в теме
До сих пор до конца непонятно (уже вторая статья), в целом написано для каких целей используется компонента, но вопрос зачем столько времени было изобретать велосипед когда есть внешние источники данных которые гораздо лучше справляются со всеми этими задачами в 1С?
3. markbraer 32 26.06.23 07:53 Сейчас в теме
(1)была необходимость. Так как использовалось в тиражных решениях и нужно было, чтобы загрузка работала при любых условиях.
4. sinichenko_alex 171 26.06.23 07:54 Сейчас в теме
(3) если глубоко вдуматься, то в тиражных тоже можно использовать подход с внешними источниками данных. При этом подход с внешними источниками еще и кроссплатформенность автоматом даёт.
5. markbraer 32 26.06.23 08:03 Сейчас в теме
(4) их не получится встроить во внешюю обработку)) То есть такой вариант для продажи готового модуля не подходит
6. sinichenko_alex 171 26.06.23 08:04 Сейчас в теме
(5) Теперь понял. Вопрос во внешней обработке - ключевой :) Да. Там согласен, нет возможности использовать внешние источники данных. Изначально я думал, что речь о целой конфигурации. Вопрос снят. Спасибо за ответы.
2. akela2014 6 26.06.23 06:25 Сейчас в теме
Странный подход. Можно через mysql коннектор все запросы делать и результат уже как угодно обрабатывать.
Оставьте свое сообщение