Перейти к содержимому

Разработка мобильных приложений 1С — Обмен данными

Мобильная разработка 1С - Обмен данными

Часть 0: Разработка мобильных приложений 1С – Быстрый старт!
Часть 1: Разработка мобильных приложений 1С — Аутентификация пользователя.
Часть 3: Разработка мобильных приложений 1С — Обмен данными.

Задача: Создать информационную систему по обмену данными между мобильным приложением на 1С, промежуточным сервером на основе Node.js и основной базой на 1С.

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

Промежуточный сервер необходим, для возможности организации работы с основной базой 1С, которую нельзя публиковать в открытый доступ, в целях безопасности.

Все исходные коды и выгрузки доступны в репозитории на GitHub.

Часть I – Простой прототип системы

Начнем с простого обмена данными, без дополнительных возможностей регистрации, авторизации и аутентификация, главное разработать простой рабочий прототип информационной системы.

Схема работы следующая:

  1. В мобильном приложении на 1С создается фотография и отправляется на промежуточный сервер в виде JSON.
  2. Промежуточный сервер получает данные и сохраняет для простоты в файлы.
  3. Основная база данных на 1С запрашивает информацию с промежуточного сервера, получает их в виде JSON с последующим сохранением в регистр сведений.

Разработка и тестирование прототипа производится в локальной сети, в завершающей части будет произведена установка промежуточного сервера в VDS на основе ОС Debian, так как в этом случае станет доступен публичный IP адрес.

Создание мобильного приложения на 1С

Мобильное приложение 1С
Мобильное приложение 1С

Для тестирования мобильного приложения будет использоваться реальное устройство, если есть необходимость, можно воспользоваться эмулятором Android, который идет в составе Android Studio.

Веб-сервер Apache из состава Open Server, мобильная платформа версии 8.3.20.40, о том как установить необходимые компоненты описано в предыдущих частях.

Как сделать фотографию при помощи мобильного приложения 1С описано в статье 1С Kafka, см. пункт «Создание приложения для мобильной платформы 1С». В мобильной приложении не используется «Коннектор», так как на момент написания, модуль не подходит для использования в мобильных приложениях, в результате чего будут использоваться стандартные средства 1С.

&НаКлиенте
Процедура Фото(Команда)
	
	Если НЕ СредстваМультимедиа.ПоддерживаетсяФотоснимок(ТипКамерыУстройства.Задняя) Тогда
		ДобавитьСообщение("Устройство не поддерживает фотографирование.");
		Возврат;
	КонецЕсли;
	
	РазрешениеФото = Новый РазрешениеКамерыУстройства(640, 480);
	
	ДанныеМультимедиа = СредстваМультимедиа.СделатьФотоснимок(ТипКамерыУстройства.Задняя, РазрешениеФото);
	Если ДанныеМультимедиа = Неопределено Тогда
		ДобавитьСообщение("Не удалось сделать фото.");
		Возврат;     
	КонецЕсли;

	ДвоичныеДанныеФото = ДанныеМультимедиа.ПолучитьДвоичныеДанные();
	ТекущаяФотография = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФото, УникальныйИдентификатор);
	
КонецПроцедуры
&НаКлиенте
Процедура Отправить(Команда)
	
	// Проверка наличия фотографии.
	Если НЕ ЭтоАдресВременногоХранилища(ТекущаяФотография) Тогда
		ДобавитьСообщение("Сначала фото, после отправка.");
        Возврат;            
	КонецЕсли;
	
	// Создание нового HTTP соединения.
	Попытка
		Соединение = Новый HTTPСоединение("192.168.0.96", 8000);
	Исключение
		ДобавитьСообщение(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	              
	// Формирование заголовков.
	Заголовоки = Новый Соответствие();
	Заголовоки.Вставить("Content-Type", "application/json; charset=utf-8");
	
	// Создание HTTP запроса с заголовками.
	Запрос = Новый HTTPЗапрос("/add", Заголовоки);

	// Формирование структуры данных для отправки.
	Данные = Новый Структура;
	Данные.Вставить("id", Строка(Новый УникальныйИдентификатор));
                                                      
    ДвоичныеДанныеФото = ПолучитьИзВременногоХранилища(ТекущаяФотография);  
	
	Данные.Вставить("data", Base64Строка(ДвоичныеДанныеФото)); 
	
	// Сериализация данных в JSON.
	ЗаписьJSON = Новый ЗаписьJSON; 
	ЗаписьJSON.УстановитьСтроку(); 
	
	ЗаписатьJSON(ЗаписьJSON, Данные);
	
	Данные = ЗаписьJSON.Закрыть();
	
	// Установка сериализованных данных в тело запроса.
	Запрос.УстановитьТелоИзСтроки(Данные, КодировкаТекста.UTF8);
	       
	// Отправка данных методом POST.
	Попытка
		Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
	Исключение  
		ДобавитьСообщение(ОписаниеОшибки());
		Возврат;
	КонецПопытки; 
	
	// Десериализация полученного ответа.
	Попытка     
		
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
		
		Ответ = ПрочитатьJSON(ЧтениеJSON, Истина);
		
	Исключение
		ДобавитьСообщение(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
      
	ДобавитьСообщение(Ответ["status"] + " : " + Ответ["message"]);
	
КонецПроцедуры

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

В команде «Отправить» создается HTTP соединение по локальному адресу 192.168.0.96 и порту 8000, в вашем случае IP адрес может отличаться, о том как определить внутренний локальный адрес, можно узнать из статьи Как узнать IP-адрес компьютера, планшета или смартфона.

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

Создание промежуточного сервера на Node.js

Промежуточный сервер создан на основе Node.js и веб-фреймворка Express, для этого понадобится любой удобный редактор кода с поддержкой языка программирования JavaScript, например VS Code и установленная среда выполнения Node.js.

Проект для Node.js инициализируется довольно просто, необходимо создать папку, далее запустить командную строку, перейти в папку проекта и выполнить команду:

npm init -y

Появится конфигурационный файл package.json, содержащий настройки и данные по проекту, исходя из которого видно, что необходимо создать файл index.js в котором будет располагаться основной код приложения.

Установка используемых библиотек и фреймворков производится с помощью команд:

npm i express dotenv body-parser

Запуск проекта осуществляется с помощью команды:

node index.js

Если необходимо взять проект с GitHub, тогда сначала нужно установить Git, по адресу https://gitforwindows.org/ или https://git-scm.com/ после выполнить копирование проекта с помощью команды:

git clone https://github.com/BlaginKostya/intersystem-data-exchange.git

Перейти в папку проекта и произвести инициализацию командой:

npm install

Это необходимо так как репозиторий не содержит все модули для работы, это сделано с целью оптимизации загрузки проектов в репозиторий, ограничения указывается в файле .gitignore.

Когда все указанные в файле package.json модули будут загружены, запуск проекта можно выполнить командой:

npm start

В текущей версии проекта обрабатываются три маршрута:

  1. GET /
  2. POST /add
  3. GET /get
import express from 'express';
import bodyParser from 'body-parser';
import dotenv from 'dotenv';
import { promises } from 'fs';

dotenv.config();

const host = process.env.HOST;
const port = process.env.PORT;

const app = express();

Пояснение кода:
Первым делом производится импорт необходимых компонентов и загрузка переменных из файла .env, после чего создается объект express, который используется для работы по протоколу HTTP.

// В случае корневого запроса GET, перенаправление на сайт.
app.get('/', (req, res) => {
	res.redirect('https://blagin.ru');
});

«/» — метод GET, корневой маршрут, в этом случае если обращение происходит по адресу: http://192.168.0.96:8000 происходит редирект на сайт.

// Получение и обработка данных от мобильного приложения 1С.
app.post('/add', async (req, res) => {

	try {

		// Деструктуризация входящего объекта JSON.
		const { id, data } = req.body;

		// В случае отсутствия данных, отправляем ошибку.
		if (!id || !data) {
			return res.status(400).json({
				status: 'error',
				message: 'В запросе отсутствуют необходимые данные.'
			});
		}

		// Сохраняем полученные данные в файл.
		await promises.writeFile(`files/${id}`, data);

		// Данные получены и обработаны.
		res.status(200).json({
			status: 'ok',
			message: 'Данные получены.'
		});

	} catch (error) {
		console.log(error.message);
		return res.status(500).json({
			status: 'error',
			message: error.message
		});
	}

});

«/add» — метод POST, обработка полученных данных из мобильного приложения 1С, входящие данные представляют из себя JSON, данные из которого сохраняются в файлы.

// Отправка данных основному приложению 1С.
app.get('/get', async (req, res) => {

	try {

		// Массив для объектов файлов.
		let arrayObjects = [];

		// Чтение всех файлов в директории.
		const files = await promises.readdir('files/');
		for (const name of files) {

			// Чтение конкретного файла из директории.
			const data = await promises.readFile(`files/${name}`);

			// Формирование объекта содержащего данные файла.
			const objectFile = {
				id: name,
				data: Buffer.from(data).toString()
			};

			// Добавление объекта в массив.
			arrayObjects.push(objectFile);
		}

		// Отправка данных.
		res.status(200).json({
			status: 'ok',
			message: arrayObjects
		});

		// Удаление отправленных файлов.
		for (const name of files) {
			await promises.unlink(`files/${name}`);
		}

	} catch (error) {
		console.log(error.message);
		return res.status(500).json({
			status: 'error',
			message: error.message
		});
	}

});

«/get» — метод GET, отправка сохранённых данных основному приложения 1С, производится чтение файлов, формирование объекта для последующей отправки в формате JSON, отправленные файлы удаляются.

Создание основной базы данных на 1С

Основная база данных 1С
Основная база данных 1С

Используемая версия платформы 8.3.20.1613, в разработке основного приложения 1С, будет использоваться удобный инструмент «Коннектор», как установить который описано в статье: Телеграм бот 1С.

Используется общая форма, выведенная в рабочую область начальной страницы и регистр сведений «Фотографии» в который будет производится сохранение полученных данных.

&НаСервереБезКонтекста
Процедура ПолучитьДанныеНаСервереБезКонтекста()
	
	// Запрос данных с промежуточного сервера.
	Результат = КоннекторHTTP.GetJson("http://192.168.0.96:8000/get"); 
	
	Если ТипЗнч(Результат) = Тип("Соответствие") И Результат["status"] = "ok" Тогда
		
		// Массив данных хранится в поле "message".
		МассивДанных = Результат["message"];

		ДатаСобытия = ТекущаяДата();
		
		// Сохранение полученных данных.
		НаборЗаписей = РегистрыСведений.Фотографии.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.ДатаСобытия.Установить(ДатаСобытия);
			
		Для каждого Данные Из МассивДанных Цикл
			
			ЗаписьНабора = НаборЗаписей.Добавить();
			ЗаписьНабора.ДатаСобытия	= ДатаСобытия;
			ЗаписьНабора.Идентификатор	= Данные["id"];
			ЗаписьНабора.Данные			= Данные["data"];
			
		КонецЦикла;
		
		НаборЗаписей.Записать();
		
	КонецЕсли;

КонецПроцедуры

Пояснение кода:
По команде «Получить данные» выполняется запрос к промежуточному серверу, по маршруту «/get», в результате получаем объект соответствие, в составе которого содержатся массив с данными, которые сохраняем в регистр сведений. На форме имеется динамический список, в котором отображается полученная информация.

Часть II – Регистрация, авторизация и аутентификация

Часть находится в работе.

Часть III – Backend на основе NestJS

Часть находится в работе.

Часть IV – Публикация промежуточного сервера

Часть находится в работе.

Используемые изображения:

1 комментарий для “Разработка мобильных приложений 1С — Обмен данными”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *