Часть 0: Разработка мобильных приложений 1С – Быстрый старт!
Часть 1: Разработка мобильных приложений 1С — Аутентификация пользователя.
Часть 3: Разработка мобильных приложений 1С — Обмен данными.
Задача: Создать информационную систему по обмену данными между мобильным приложением на 1С, промежуточным сервером на основе Node.js и основной базой на 1С.
Мобильное приложение генерирует данные, например это может быть фотография, голосовое сообщение или текстовая информация, после данные передаются на промежуточный сервер, где они временно хранятся и периодически запрашиваются основной базой 1С.
Промежуточный сервер необходим, для возможности организации работы с основной базой 1С, которую нельзя публиковать в открытый доступ, в целях безопасности.
Все исходные коды и выгрузки доступны в репозитории на GitHub.
Часть I – Простой прототип системы
Начнем с простого обмена данными, без дополнительных возможностей регистрации, авторизации и аутентификация, главное разработать простой рабочий прототип информационной системы.
Схема работы следующая:
- В мобильном приложении на 1С создается фотография и отправляется на промежуточный сервер в виде JSON.
- Промежуточный сервер получает данные и сохраняет для простоты в файлы.
- Основная база данных на 1С запрашивает информацию с промежуточного сервера, получает их в виде JSON с последующим сохранением в регистр сведений.
Разработка и тестирование прототипа производится в локальной сети, в завершающей части будет произведена установка промежуточного сервера в VDS на основе ОС Debian, так как в этом случае станет доступен публичный IP адрес.
Создание мобильного приложения на 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
В текущей версии проекта обрабатываются три маршрута:
- GET /
- POST /add
- 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С

Используемая версия платформы 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 – Публикация промежуточного сервера
Часть находится в работе.
Используемые изображения:

Очень интересная статья! Всё разложили по полочкам.