Алгоритмы
Настройка поведения устройства с помощью JavaScript-шаблонов
Что такое алгоритмы
Общая информация о системе шаблонов
Алгоритмы — это JavaScript-шаблоны, которые определяют поведение устройства Инфоскан. С помощью них вы можете настроить все процессы: от дополнительных экранов перед измерением до отправки данных на внешние серверы.
Зачем нужны шаблоны
Настройка поведения
Определяет, что устройство делает после измерения: выводит QR-код, отправляет данные на сервер, сохраняет в историю.
Интеграция с системами
Позволяет подключить устройство к 1С, WMS, ERP и другим корпоративным системам через API.
Управление доступом
Настраивает авторизацию сотрудников, гостевой режим и мультиаккаунт.
Автоматизация
Позволяет настроить автоматическую отправку данных по расписанию.
Связь между шаблонами
Все шаблоны связаны между собой и работают в единой цепочке. Данные, полученные в одном шаблоне, доступны в других через переменную GLOBAL_VAR.
Авторизация
js_script_auth_mode — определяет, кто работает с устройством.
Подготовка
jsScriptItemType — дополнительные экраны перед измерением.
Действие
jsScriptAction — подтверждение перед отправкой.
Отправка
jsScriptFinishSend — отправка данных на сервер.
История
jsScriptHistorySensor — сохранение в историю.
API
jsScriptHttpHandler — доступ к данным через HTTP.
Доступные шаблоны
jsScriptItemType
Дополнительные экраны перед измерением — выбор типа упаковки, ввод количества, сканирование.
jsScriptFinishSend
Отправка данных — QR-код, HTTP, FTP, TCP, SOAP, 1С.
jsScriptHttpHandler
Входящие HTTP-запросы — API для получения данных.
jsScriptHistorySensor
Формат данных для истории измерений.
jsScriptAction
Действия после измерения перед отправкой.
js_script_auth_mode
Режим авторизации — вход сотрудника или гостевой режим.
jsScriptScheduler
Автоматическая отправка данных по расписанию.
jsScriptIdle
Отображение сетевой информации в режиме простоя.
jsScriptItemType
Дополнительные экраны перед измерением — выбор типа упаковки, ввод количества, сканирование ШК
Что такое jsScriptItemType
Расширение процесса измерения дополнительными шагами
Шаблон jsScriptItemType расширяет процесс измерения, добавляя дополнительные шаги перед началом работы. Это позволяет классифицировать объекты, считать количество и привязывать штрихкоды к результатам измерений.
jsScriptItemType.
Доступные шаги
Выбор типа упаковки
Отображает список кнопок для выбора типа упаковки (штука, коробка, паллета и т.д.). Результат сохраняется в переменную.
Ввод количества
Отображает экран ввода числа для указания количества объектов в упаковке.
Дополнительное сканирование
Активирует сканер и ожидает считывания штрихкода или QR-кода товара.
Подтверждение ШК
Показывает отсканированный код и запрашивает подтверждение у пользователя.
Цикличное измерение
Позволяет настроить повторное измерение следующего объекта без перезапуска шаблона.
Передача переменных между шаблонами
Значения, полученные на каждом шаге через nameResult, сохраняются в объекте args. Их можно передавать в другие шаблоны и использовать по необходимости.
Кроме того, для глобальной передачи данных между шаблонами используется переменная GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Важно: в шаблон jsScriptItemType можно передавать данные только из шаблонов js_script_auth_mode и jsScriptIdle, так как эти шаблоны отрабатывают с самого начала.
Например, результат выбора типа упаковки (resultItemTypeList1) и количество (resultItemTypeCount1) доступны в шаблоне jsScriptFinishSend для формирования итогового XML или JSON.
Совмещение шагов и условия
Все шаги можно совмещать между собой последовательно и добавлять условную логику. Это позволяет строить гибкие алгоритмы, где путь пользователя зависит от его выбора.
Например, кнопка «Штука» сразу запускает измерение, «Коробка» запрашивает количество, а «Упаковка» предлагает отсканировать дополнительный штрихкод.
Пример: Условная логика
var btnList2 = ['Штука', 'Коробка', 'Упаковка'];
return [
// === Список кнопок btnList2 ===
function (args) {
return {
page: 'ListButtonRowPage',
pageTitle: 'Введите тип упаковки',
nameResult: 'resultItemTypeList2',
pageButtons: [
`<div style="font-size: 85px; text-align: center; font-weight: bold;">${btnList2[0]}</div>`,
`<div style="font-size: 85px; text-align: center; font-weight: bold;">${btnList2[1]}</div>`,
`<div style="font-size: 85px; text-align: center; font-weight: bold;">${btnList2[2]}</div>`
]
};
},
// === Условие по resultItemTypeList2 ===
function (args) {
var index = args.resultItemTypeList2.index;
if (index === 1) {
return { page: 'CountPage', pageTitle: 'Введите количество', nameResult: 'resultCondCount1' };
}
else if (index === 2) {
return { page: 'AdditionalScanPage', pageTitle: 'Отсканируйте штрих-код', nameResult: 'resultCondScan1' };
}
return { page: 'InfoScanLitePage' };
}
];
«Штука» (index 0)
Сразу переходит к измерению без дополнительных шагов
«Коробка» (index 1)
Запрашивает количество штук в коробке
«Упаковка» (index 2)
Предлагает отсканировать дополнительный штрихкод
args.resultItemTypeList2.index содержит индекс выбранной кнопки (нумерация с 0). Используйте if/else для построения условной логики.
Выбор типа упаковки
Экран с кнопками для классификации объектов
Шаблон отображает список кнопок для выбора типа упаковки объекта. Пользователь нажимает нужную кнопку, и результат сохраняется в переменную для дальнейшего использования.
Переменная результата
resultItemTypeList1 — содержит выбранное значение (например, «Коробка», «Спайка», «Штука»).
Тип страницы
ListButtonRowPage — экран с горизонтальным списком кнопок.
Определите варианты упаковки
Создайте массив btnList1 с нужными вариантами. Текст кнопок отображается крупным шрифтом.
Пример кода
var btnList1 = ['Коробка', 'Спайка', 'Штука'];
return [
// === Список кнопок btnList1 ===
function (args) {
return {
page: 'ListButtonRowPage',
pageTitle: 'Введите тип упаковки',
nameResult: 'resultItemTypeList1',
pageButtons: [
`<div style="font-size: 85px; text-align: center; font-weight: bold;">${btnList1[0]}</div>`,
`<div style="font-size: 85px; text-align: center; font-weight: bold;">${btnList1[1]}</div>`,
`<div style="font-size: 85px; text-align: center; font-weight: bold;">${btnList1[2]}</div>`
]
};
}
];
btnList1. Добавьте нужные варианты упаковки в этот массив.
Настройка кнопок под ваши задачи
Шаблон ListButtonRowPage полностью гибкий. Вы можете задавать любые названия кнопок, добавлять или уменьшать их количество — просто измените массив btnList1.
Главное правило: при изменении количества кнопок обязательно регулируйте размер шрифта параметром font-size в стиле кнопки, чтобы элементы не вылезали за пределы экрана устройства.
Позиционирование текста
С помощью параметра text-align вы можете задать положение текста внутри кнопки:
text-align: center
Текст по центру кнопки — рекомендуется для коротких названий
text-align: left
Текст по левому краю — удобно для длинных слов и фраз
text-align: right
Текст по правому краю — для специфичных визуальных решений
Стилизация текста
Текст кнопок можно стилизовать на своё усмотрение, добавляя CSS-свойства прямо в атрибут style:
// Примеры стилизации:
<div style="font-size: 85px; text-align: center; font-weight: bold;">Коробка</div>
// Жирный текст:
<div style="font-size: 85px; text-align: center; font-weight: bold;">Штука</div>
// Курсив:
<div style="font-size: 85px; text-align: center; font-style: italic;">Паллета</div>
font-weight: bold
Делает текст жирным — выделяет важные элементы
font-style: italic
Курсивный текст — для особых случаев
Рекомендации по размеру шрифта
2–3 кнопки
font-size: 85px — крупный шрифт, кнопки заполняют экран
4–5 кнопок
font-size: 55–65px — уменьшите шрифт, чтобы кнопки помещались
6+ кнопок
font-size: 40–50px — обязательное уменьшение, иначе экран не вместит
Ввод количества объектов
Экран с числовой клавиатурой для ввода числа
Шаблон отображает экран с числовой клавиатурой для ввода числового значения. Используется для указания количества единиц товара в грузовой упаковке.
Переменная результата
resultItemTypeCount1 — содержит введённое числовое значение.
Тип страницы
CountPage — экран с числовой клавиатурой.
Настройте подсказку
Значение pageTitle отображается как подсказка. Переменная prev позволяет отобразить предыдущее значение в скобках.
Пример кода
return [
// === Ввод количества ===
function (args) {
var prev = null;
return {
page: 'CountPage',
pageTitle: 'Введите количество' + (prev ? ' (' + prev + ')' : ''),
nameResult: 'resultItemTypeCount1'
};
}
];
Гибкость шаблона
Шаблон CountPage — это универсальный экран ввода, который можно адаптировать под любые задачи. Изменяя всего одну строку — pageTitle — вы превращаете его из «Ввод количества» в совершенно другой инструмент.
Это делает шаблоны максимально гибкими: один и тот же код используется для ввода чисел, штрихкодов, веса, объёма или любых других данных — достаточно изменить текст подсказки.
Пример: Ручной ввод ШК
Превратите «Ввод количества» в «Ручной ввод штрих-кода» с помощью пинпада — достаточно изменить pageTitle:
return [
function (args) {
var prev = null;
return {
page: 'CountPage',
pageTitle: 'Введите штрих-код вручную: ' + (prev ? ' (' + prev + ')' : ''),
nameResult: 'resultItemTypeCount1'
};
}
];
Дополнительное сканирование
Активация сканера для считывания штрихкода
Шаблон активирует подключённый сканер штрихкодов и ожидает считывания кода. Поддерживается сканирование линейных штрихкодов и QR-кодов.
Зачем нужно дополнительное сканирование
Экран сканирования полезен, когда нужно привязать штрихкод к результату измерения — например, считать код товара перед взвешиванием или присвоить ID заказа.
Можно добавлять несколько таких экранов подряд — каждый считанный код сохраняется в свою переменную и передаётся дальше по шаблонам.
Переменная результата
resultItemTypeScan1 — содержит считанное значение штрихкода.
Тип страницы
AdditionalScanPage — экран сканирования с подсказкой.
Укажите подсказку
Текст pageTitle отображается на экране сканирования. Устройство будет ожидать считывания кода.
Пример кода
return [
// === Сканирование ШК ===
function (args) {
return {
page: 'AdditionalScanPage',
pageTitle: 'Отсканируйте штрих-код',
nameResult: 'resultItemTypeScan1'
};
}
];
Подтверждение ШК
Проверка штрихкода через внешний SOAP-сервис
Шаблон отображает отсканированный код и запрашивает подтверждение у пользователя. Устройство отправляет SOAP-запрос к внешнему сервису для проверки штрихкода и отображает наименование товара.
Назначение
Проверка корректности сканирования. Устройство отправляет SOAP-запрос на сервер для проверки штрихкода и отображает наименование товара для подтверждения.
Тип страницы
ConfirmBarcodePage — экран с отображением кода и кнопками подтверждения/отмены.
Пример кода
return [
// === Подтверждение ШК ===
function (args) {
return {
page: 'ConfirmBarcodePage',
pageTitle: 'Подтвердите наименование товара:',
nameResult: 'resultconfirmBarcode',
http: {
url: 'http://IP/check',
headers: {
'Accept': 'application/xml',
'Content-type': 'application/xml'
},
body: function () {
return '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>' +
'<m:CheckBarcode xmlns:m="iscan.com"><m:Barcode>' + BARCODE + '</m:Barcode></m:CheckBarcode>' +
'</soap:Body></soap:Envelope>';
},
resp: function (resp) {
var json = HELPER_JS.xmlToJson(resp);
var answer = json.Envelope && json.Envelope.Body && json.Envelope.Body.CheckBarcodeResponse;
if (!answer || !answer.Status) throw Error('Нет данных');
var serviceStatus = answer.Status["#text"] || answer.Status;
var serviceComment = answer.Comment && (answer.Comment["#text"] || answer.Comment);
if (serviceStatus === 'OK') {
return serviceComment;
}
throw Error(serviceComment);
}
}
};
}
];
HELPER_JS.xmlToJson(). При статусе OK — отображается наименование товара, иначе — выводится ошибка.
Пример POST-запроса
POST /Set/Xml HTTP/1.1
Content-Type: application/xml
Host: 192.168.10.48
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:CheckBarcode xmlns:m="iscan.com">
<m:Barcode>4600572256094</m:Barcode>
</m:CheckBarcode>
</soap:Body>
</soap:Envelope>
Ответ сервера:
<CheckBarcodeResponse xmlns="http://schemas.datacontract.org/2004/07/shr.weigher.service"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Comment>Конструктор LEGO 1000 шт.</Comment>
<Status>OK</Status>
</CheckBarcodeResponse>
Status: OK
Штрихкод успешно проверен. Наименование товара отображается на экране.
Comment
Наименование товара, привязанное к штрихкоду.
m:Barcode, содержащим значение отсканированного штрихкода. Сервер возвращает XML с наименованием товара и статусом проверки.
Цикличное измерение
Режим повторного измерения объектов
После завершения измерения устройство отображает экран с подсказкой для нового измерения. При подтверждении шаблон возвращается к первому шагу для нового цикла.
Переменная результата
resultItemType — используется для сброса цикла и возврата к началу шаблона.
Тип страницы
InfoScanLiteItemTypePage — экран с подсказкой для нового измерения.
Пример кода
return [
function (args) {
return {
page: 'InfoScanLiteItemTypePage',
pageTitle: 'Установите коробку еще раз',
nameResult: 'resultItemType'
};
}
];
«Установите коробку еще раз». При подтверждении шаблон возвращается к первому шагу для нового цикла измерения.
jsScriptFinishSend
Отправка результатов измерения — QR-код, HTTP, FTP, TCP
Что такое jsScriptFinishSend
Определение действий устройства после измерения
Шаблон jsScriptFinishSend определяет действия устройства после успешного измерения габаритов и веса. Это может быть вывод QR-кода на экран, отправка данных на внешний сервер через HTTP (XML/JSON), загрузка на FTP-сервер или передача по TCP.
jsScriptFinishSend.
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Доступные опции отправки
Вывод QR-кода
Формирует JSON с данными измерения и выводит QR-код на экран устройства.
Отправка по HTTP (XML/JSON)
Отправка данных на внешний сервер через POST-запрос в формате XML или JSON.
Отправка на FTP
Загрузка файла с данными измерения на FTP-сервер.
SENSOR.lengthFormat для получения значения длины.
Обязательная переменная _len
В начале каждого шаблона jsScriptFinishSend обязательно добавлять этот код:
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
Зачем это нужно: переменная SENSOR.lengthFormat содержит значение длины объекта. Однако на устройствах Инфоскан 3Д 60/90 эта переменная может быть не определена (возвращать null). Если не выполнить проверку, в баннере и в строке QR-кода на месте длины отобразится undefined.
Как работает: мы сохраняем значение в переменную _len, проверяем её на null и, если значение отсутствует, заменяем его на 0. Это гарантирует, что во всех выходных данных длина будет числом, а не ошибкой.
_len может встречаться переменная num. В этом нет ничего страшного — шаблоны писались в разное время. Суть одна и та же: проверка значения длины и замена null на 0.
QR-код
Вывод QR-кода на экран устройства
Шаблон формирует строку с данными измерения и выводит QR-код на сенсорный экран устройства. Пользователь может отсканировать код для передачи данных в мобильное приложение или другую систему.
Варианты вывода
QR-код со штрихкодом
Данные измерения + отсканированный ШК
Используйте этот вариант, когда к посылке привязан штрихкод. В строку QR-кода добавляется значение BARCODE первым элементом.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
qr: function () {
return {
body: function () {
return BARCODE + ';' + SENSOR.widthFormat + ';' +
SENSOR.heightFormat + ';' + _len + ';' +
SENSOR.weightFormat + ';' + SENSOR.volumeFormat + ';';
},
resp: function () {
return { banner: 'Короб успешно измерен', comment: '' };
}
};
}
};
QR-код без штрихкода
Только данные измерения
Используйте, когда сканер ШК не подключён или штрихкод не нужен. В строку попадают только параметры измерения.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
qr: function () {
return {
body: function () {
return SENSOR.widthFormat + ';' + SENSOR.heightFormat + ';' +
_len + ';' + SENSOR.weightFormat + ';' + SENSOR.volumeFormat + ';';
},
resp: function () {
return { banner: 'Короб успешно измерен', comment: '' };
}
};
}
};
QR-код в формате JSON
Структурированные данные для API
Используйте, когда принимающая система ожидает данные в формате JSON. Каждое поле подписано — удобно для парсинга.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
qr: function () {
return {
body: function () {
return '{"Length":"' + _len + '","Width":"' + SENSOR.widthFormat +
'","Height":"' + SENSOR.heightFormat +
'","Weight":"' + SENSOR.weightFormat + '"}';
},
resp: function () {
return { banner: 'Короб успешно измерен', comment: '' };
}
};
}
};
QR-код со строковым форматом
Ключ=Значение через точку с запятой
Используйте, когда нужен читаемый формат с подписями ключей. Удобно для интеграции с 1С и другими системами.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
qr: function () {
return {
body: function () {
return 'WIDTH=' + SENSOR.widthFormat + ';HEIGHT=' + SENSOR.heightFormat +
';LENGTH=' + _len + ';WEIGHT=' + SENSOR.weightFormat + ';';
},
resp: function () {
return { banner: 'Короб успешно измерен', comment: '' };
}
};
}
};
BARCODE, в строке QR-кода на месте переменной отобразится undefined. Убедитесь, что сканер активен или используйте шаблон без ШК.
Настраиваемое содержание QR-кода
Содержание QR-кода можно менять самостоятельно. Добавляйте строки, свои переменные с расчётами или переменные из других шаблонов.
Например, переменная GLOBAL_VAR из шаблона jsScriptItemType доступна в jsScriptFinishSend и может быть включена в итоговую строку QR-кода.
Доступные переменные
SENSOR.widthFormat
Ширина объекта
SENSOR.heightFormat
Высота объекта
SENSOR.lengthFormat
Длина объекта
SENSOR.weightFormat
Вес объекта
SENSOR.volumeFormat
Объём объекта
BARCODE
Считанный штрихкод (если сканер активен)
1C отправка
Отправка данных измерения в 1С через SOAP
Шаблон отправляет данные измерения на сервер 1С через SOAP-запрос. Используется для интеграции с корпоративными системами учёта.
12.3). Передача через запятую (12,3) встречается значительно реже.
Что обязательно настроить
Адрес отправки
Укажите URL-адрес SOAP-сервиса 1С без ?wsdl в поле url.
Авторизация
Укажите логин и пароль для доступа к сервису. Данные кодируются в Base64 через HELPER_JS.toBase64().
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) {
_len = 0;
}
return {
http: function() {
return {
url: 'Адрес', // Адрес отправки без ?wsdl
headers: {
'Content-type': 'application/xml',
'Authorization': 'Basic ' + HELPER_JS.toBase64('Логин' + ':' + 'Пароль')
},
body: function() {
return "<x:Envelope xmlns:x=\"http://schemas.xmlsoap.org/soap/envelope/\"" +
" xmlns:isc=\"iscan.com\">" +
"<x:Header/>" +
"<x:Body>" +
"<isc:SaveParametrs>" +
"<isc:Barcode>" + BARCODE + "</isc:Barcode>" +
"<isc:Length>" + _len + "</isc:Length>" +
"<isc:Height>" + SENSOR.heightFormat + "</isc:Height>" +
"<isc:Width>" + SENSOR.widthFormat + "</isc:Width>" +
"<isc:Weight>" + SENSOR.weightFormat + "</isc:Weight>" +
"<isc:Volume>" + SENSOR.volumeFormat + "</isc:Volume>" +
"<isc:ItemType>1</isc:ItemType>" +
"</isc:SaveParametrs>" +
"</x:Body>" +
"</x:Envelope>"
},
resp: function(resp, httpCode) {
if (httpCode == 200) {
if (HELPER_JS.xmlXPath(resp,
'/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Status/text()') == 'OK') {
return {
banner: BARCODE + ' - Успешно записан',
comment: HELPER_JS.xmlXPath(resp,
'/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Comment/text()') + ' '
}
}
if (HELPER_JS.xmlXPath(resp,
'/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Status/text()') == 'ER') {
throw Error(BARCODE + ' - ' + HELPER_JS.xmlXPath(resp,
'/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Comment/text()'))
}
throw Error(BARCODE + ' - Ошибка отправки данных на сервис')
} else {
throw Error('Ошибка, получен HTTP код: ' + httpCode +
', вместо ожидаемого HTTP кода 200')
}
}
}
}
}
Пример SOAP-запроса
Структура SOAP-конверта, который отправляется на сервер 1С:
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:isc="iscan.com">
<x:Header/>
<x:Body>
<isc:SaveParametrs>
<isc:Barcode>33456545456</isc:Barcode>
<isc:Length>123</isc:Length>
<isc:Height>123</isc:Height>
<isc:Width>321</isc:Width>
<isc:Weight>231</isc:Weight>
<isc:Volume>1234</isc:Volume>
<isc:ItemType>1</isc:ItemType>
</isc:SaveParametrs>
</x:Body>
</x:Envelope>
Barcode, Length и т.д.) подставляются динамически из переменных BARCODE, SENSOR.lengthFormat и других объектов устройства.
Поля SOAP-запроса
isc:Barcode
Штрихкод товара
isc:Length
Длина объекта
isc:Height
Высота объекта
isc:Width
Ширина объекта
isc:Weight
Вес объекта
isc:Volume
Объём объекта
isc:ItemType
Тип упаковки (значение по умолчанию: 1)
Обработка ответа
Сервер 1С возвращает статус выполнения. Шаблон обрабатывает три варианта:
OK — Успешно
Данные записаны. Отображается баннер с ШК и комментарием.
ER — Ошибка
Сервер вернул ошибку. Выводится сообщение с комментарием.
HTTP-ошибка
Неверный код ответа (ожидается 200).
Пример POST-ответа от сервиса
Пример SOAP-ответа, который возвращает сервер 1С при успешной обработке запроса:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:SaveParametrsResponse xmlns:m="iscan.com">
<m:return xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<m:Status xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OK</m:Status>
<m:Comment xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Стартер 2501.3708-40 11зуб 24В ЯМЗ ПРАМО(ELTRA)</m:Comment>
</m:SaveParametrsResponse>
</soap:Body>
</soap:Envelope>
Поля ответа
m:Status
Статус выполнения: OK — успешно, ER — ошибка.
m:Comment
Комментарий от сервера — наименование товара или описание ошибки.
m:return
Дополнительный элемент возврата (может быть пустым).
/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Status/text()/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Comment/text()SOAP
Отправка данных через SOAP-запрос с XML-телом
Шаблон отправляет данные измерения на внешний сервер через SOAP-запрос. Используется для интеграции с корпоративными системами, принимающими данные в формате XML.
12.3). Передача через запятую (12,3) встречается значительно реже.
Что обязательно настроить
Адрес сервера
Укажите URL SOAP-сервиса в поле url.
Авторизация
Укажите логин и пароль. Данные кодируются в Base64 через HELPER_JS.toBase64().
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) {
_len = 0;
}
return {
http: function () {
return {
url: 'адрес сервера',
headers: {
'Accept': 'application/xml',
'Content-type': 'application/xml',
'Authorization': 'Basic ' + HELPER_JS.toBase64('login' + ':' + 'password')
},
body: function () {
return "<LoadMeasuremtWithPrinting>" +
"<Width>" + SENSOR.width + "</Width>" +
"<Height>" + SENSOR.height + "</Height>" +
"<Length>" + _len + "</Length>" +
"<Weight>" + SENSOR.weight + "</Weight>" +
"<Volume>" + SENSOR.volumeFormat + "</Volume>" +
"<Barcode>" + BARCODE + "</Barcode>" +
"</LoadMeasuremtWithPrinting>"
},
resp: function (resp, httpCode) {
if (httpCode == 200) {
if (HELPER_JS.xmlXPath(resp,
'/soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Status/text()') == 'OK') {
return {
banner: BARCODE + ' - Успешно записан',
comment: ''
}
}
else {
throw Error(BARCODE + ' - Ошибка отправки данных на сервис')
}
}
else {
throw Error('Ошибка, получен HTTP код: ' + httpCode +
', вместо ожидаемого HTTP кода 200')
}
}
}
}
}
Разбор кода
Переменная _len
Сохраняет значение длины из SENSOR.lengthFormat. Если значение отсутствует (null), заменяется на 0.
http()
Функция, возвращающая объект с параметрами HTTP-запроса: адрес, заголовки и тело.
body()
Формирует XML-тело запроса с данными измерения: ширина, высота, длина, вес, объём и штрихкод.
resp()
Обрабатывает ответ сервера. При статусе OK — отображает баннер об успехе, иначе — выбрасывает ошибку.
Поля XML-запроса
Width
Ширина объекта
Height
Высота объекта
Length
Длина объекта
Weight
Вес объекта
Volume
Объём объекта
Barcode
Штрихкод товара
Пример POST-запроса
POST /xml/Set HTTP/1.1
Content-Length: 183
Content-Type: application/xml
Host: 192.168.10.49:8000
<LoadMeasuremtWithPrinting>
<Width>12.1</Width>
<Height>12.2</Height>
<Length>12.3</Length>
<Weight>1234</Weight>
<Barcode>1234567890</Barcode>
</LoadMeasuremtWithPrinting>
12.1, 12.2, 12.3. Это стандартный формат для данного шаблона.
Отправка данных в формате XML
HTTP POST-запрос с XML-документом
Шаблон отправляет данные измерения на внешний сервер через HTTP POST-запрос в формате XML. Подходит для интеграции с корпоративными системами, использующими XML-обмен данными.
Формат данных
XML-документ с тегами для длины, ширины, высоты и веса объекта.
Протокол
HTTP POST-запрос с Content-Type: application/xml.
Отправка данных в формате JSON
HTTP POST-запрос с JSON-объектом
Шаблон отправляет данные измерения на внешний сервер через HTTP POST-запрос в формате JSON. Наиболее распространённый формат для современных API и облачных сервисов.
Формат данных
JSON-объект с полями: size_a_mm, size_b_mm, size_c_mm, weight_g.
Протокол
HTTP POST-запрос с Content-Type: application/json.
FTP
Отправка данных и фотографий на FTP-сервер
Шаблон загружает файл с данными измерения на FTP-сервер. Подходит для интеграции с legacy-системами и серверами, принимающими данные через FTP-протокол.
Что обязательно настроить
Адрес и порт
Укажите URL сервера и порт через двоеточие (обычно 21).
Авторизация
Логин и пароль для доступа к FTP-серверу.
Варианты шаблонов
FTP — текстовый файл
Отправка данных измерения в .txt
Загружает текстовый файл с данными измерения на FTP-сервер. Имя файла — ШК + расширение .txt.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
ftp: function () {
return {
address: 'URL:PORT',
username: 'Логин',
password: 'Пароль',
pathDestination: BARCODE + '.txt',
body: function () {
return BARCODE + ';' + _len + ';' + SENSOR.heightFormat + ';' +
SENSOR.widthFormat + ';' + SENSOR.weightFormat + ';';
},
resp: function () {
return {
banner: 'Успешно записан на FTP',
comment: ''
}
}
}
}
}
Дополнительные опции:
Добавление даты и времени
Используйте переменную mDate для добавления даты в имя файла
Указание пути
Укажите путь к папке через слеши: "/infoscan/"
FTP — с фотографией
Отправка фото + данных измерения
Делает фотографию объекта с наложением текстовой информации (ШК, габариты, дата) и загружает на FTP-сервер в формате JPEG или PNG.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
var mDate = HELPER_JS.formatDate(new Date(), 'ddMMyyyy_hh-mm-ss');
return [
{
ftpCapture: function () {
return {
address: "URL:PORT",
username: "Логин",
password: "Пароль",
pathDestination: BARCODE + ".jpeg", // можно .png
isVideoRecord: false, // false — картинка, true — видео
label: {
text:
"[ИНФОСКАН] Штрих-код: " + BARCODE +
" Высота: " + SENSOR.heightFormat +
" \nШирина: " + SENSOR.widthFormat +
" Глубина: " + _len +
" Вес: " + SENSOR.weightFormat +
"\nОбъем: " + SENSOR.volumeFormat +
" Дата: " + mDate,
pointSize: 30,
color: "#ffa500",
layout: "TopToBottom", // по вертикали
sensorTopView: true,
sensorSideView: true,
quality: 40
},
resp: function () {
return {
banner: "Отправка фотографии завершена",
comment: ""
};
}
};
}
}
];
Описание параметров:
isVideoRecord
false — картинка, true — видео
layout
"TopToBottom" — по вертикали, "LeftToRight" — по горизонтали
sensorTopView
Включение линейки сверху
sensorSideView
Включение линейки сбоку
pointSize
Размер шрифта наложенного текста
color
Цвет текста на фото
quality
Качество JPEG (0–40)
Примеры фотографий:
TCP-порт
Отправка данных измерения через TCP-соединение
Шаблон отправляет данные измерения на внешний сервер через TCP-соединение. Используется для интеграции с системами, принимающими данные по протоколу TCP в реальном времени.
;) в последовательности: ширина, высота, длина, вес, штрихкод.
Что обязательно настроить
Адрес и порт
Укажите IP-адрес сервера и порт через двоеточие (например, 192.168.1.100:5556).
Формат данных
Данные передаются в формате: Ширина;Высота;Длина;Вес;ШК.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
tcp: function () {
return {
address: 'IP:5556',
body: function () {
return SENSOR.widthFormat + ';' + SENSOR.heightFormat + ';' + _len + ';' + SENSOR.weightFormat + ';' + BARCODE;
},
resp: function (r) {
return { banner: 'Успешно отправлен на TCP', comment: '' };
}
};
}
};
Разбор кода
Переменная _len
Сохраняет значение длины из SENSOR.lengthFormat. Если значение отсутствует (null), заменяется на 0.
tcp()
Функция, возвращающая объект с параметрами TCP-соединения: адрес сервера, тело запроса и обработчик ответа.
body()
Формирует строку данных измерения: ширина, высота, длина, вес и штрихкод, разделённые точкой с запятой.
resp()
Обрабатывает ответ сервера. Возвращает баннер об успешной отправке.
Поля данных в строке
SENSOR.widthFormat
Ширина объекта
SENSOR.heightFormat
Высота объекта
_len (SENSOR.lengthFormat)
Длина объекта
SENSOR.weightFormat
Вес объекта
BARCODE
Считанный штрихкод
Пример строки данных
При измерении объекта со следующими параметрами:
На TCP-сервер будет отправлена строка:
netcat или nc для прослушивания указанного порта.
Что такое jsScriptHttpHandler
Обработка входящих HTTP-запросов к устройству
Шаблон jsScriptHttpHandler определяет поведение устройства при получении входящих HTTP-запросов. Позволяет настроить обработку команд, передаваемых на устройство через REST API.
jsScriptHttpHandler.
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Как работает
Устройство слушает входящие HTTP-запросы на определённом порту. При получении запроса шаблон определяет, какую команду нужно выполнить и как ответить.
Внешняя система отправляет HTTP-запрос
На адрес устройства: http://IP/api/...
Шаблон обрабатывает команду
Определяет тип запроса (GET/POST) и выполняет соответствующее действие.
Устройство выполняет действие
Получение данных, проверка статуса, измерение — в зависимости от эндпоинта.
Возвращается ответ
JSON-объект с результатом выполнения команды или данными измерения.
Доступные эндпоинты
GET /api/data1/
Получение данных измерения (англоязычные ключи)
GET /api/data2/
Получение данных измерения (русскоязычные ключи)
GET /api/ping
Проверка доступности устройства
GET /api/status
Проверка статуса устройства
GET /api/measure
Получение данных измерения с фотографией
GET /api/network
Получение сетевых настроек устройства
POST /api/repeat
Повторное измерение
POST /api/reset
Сброс состояния устройства
Пример запроса
GET /api/data1/ HTTP/1.1
Host: 192.168.1.100
{
"width": "275",
"height": "192",
"length": "183",
"weight": "1234",
"barcode": "4600572256094",
"devCode": 1
}
jsScriptFinishSend.
API для 1С
Передача данных измерения в 1С через handlerDataResp
Шаблон handlerDataResp формирует структурированный ответ с данными измерения для внешних систем. Используется для передачи габаритов, веса и штрихкода в формате JSON.
jsScriptHttpHandler.
Пример кода
return {
handlerDataResp: function () {
try {
if (SENSOR == null) {
return {
width: '0',
height: '0',
length: '0',
weight: '0',
barcode: '',
devCode: DEV_CODE,
volume: '0'
}
}
return {
width: SENSOR.widthFormat,
height: SENSOR.heightFormat,
length: SENSOR.lengthFormat,
weight: SENSOR.weightFormat,
barcode: BARCODE,
devCode: DEV_CODE,
volume: SENSOR.volumeFormat
}
}
catch (e) {
console.error(e);
}
}
}
Разбор кода
handlerDataResp()
Основная функция-обработчик. Возвращает объект с данными измерения для внешней системы.
Проверка SENSOR == null
Если сенсор не активен или измерение не выполнено, функция возвращает нулевые значения вместо ошибки.
DEV_CODE
Уникальный код устройства. Позволяет идентифицировать, с какого устройства пришли данные.
Обработка ошибок
Блок try/catch перехватывает ошибки и логирует их в консоль, не прерывая работу устройства.
Поля ответа
width
Ширина объекта (мм)
height
Высота объекта (мм)
length
Длина объекта (мм)
weight
Вес объекта (г)
volume
Объём объекта (л)
barcode
Считанный штрихкод
devCode
Код устройства (число от 0 до 9999)
Пример JSON-ответа
При успешном измерении устройство вернёт:
{
"width": "275",
"height": "192",
"length": "183",
"weight": "1234",
"barcode": "4600572256094",
"devCode": 1,
"volume": "9.66"
}
Если сенсор не активен:
{
"width": "0",
"height": "0",
"length": "0",
"weight": "0",
"barcode": "",
"devCode": 1,
"volume": "0"
}
DEV_CODE содержит уникальный идентификатор устройства. Убедитесь, что он задан в настройках.
curl. Пример: curl http://IP/api/data
API data
Получение данных измерения
Шаблон возвращает данные последнего измерения: габариты, вес и штрихкод. Доступно несколько вариантов формата ответа — выбирайте подходящий под вашу задачу.
Шаблон 1: Основной
Стандартный формат ответа с англоязычными ключами. Подходит для интеграции с системами, ожидающими JSON с ключами на английском.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/data1/",
method: "GET",
resp: function (reqBody, reqHeaders) {
try {
if (SENSOR == null) {
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
width: "0", height: "0", length: "0",
weight: "0", barcode: "", devCode: DEV_CODE
})
};
}
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
width: SENSOR.widthFormat,
height: SENSOR.heightFormat,
length: _len,
weight: SENSOR.weightFormat,
barcode: BARCODE,
devCode: DEV_CODE
})
};
} catch (e) { console.error(e); }
}
}
];
}
};
{
"width": "275",
"height": "192",
"length": "183",
"weight": "1234",
"barcode": "4600572256094",
"devCode": 1
}
Шаблон 2: Русские ключи
Вариант с русскоязычными названиями полей. Удобно для интеграции с 1С и другими русскоязычными системами.
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/data2/",
method: "GET",
resp: function (reqBody, reqHeaders) {
try {
if (SENSOR == null) {
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
ширина: "0", высота: "0", длина: "0",
вес: "0", штрихкод: "", кодУстройства: DEV_CODE
})
};
}
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
ширина: SENSOR.widthFormat,
высота: SENSOR.heightFormat,
длина: _len,
вес: SENSOR.weightFormat,
штрихкод: BARCODE,
кодУстройства: DEV_CODE
})
};
} catch (e) { console.error(e); }
}
}
];
}
};
{
"ширина": "275",
"высота": "192",
"длина": "183",
"вес": "1234",
"штрихкод": "4600572256094",
"кодУстройства": 1
}
Полная кастомизация
Шаблоны полностью подлежат кастомизации. Вы можете менять:
Названия ключей
Заменяйте width на ширина, height на высота или любые другие названия.
Добавление полей
Добавляйте новые поля: дату, время, статус, пользовательские переменные и т.д.
Удаление полей
Убирайте ненужные поля — оставьте только те, которые требуются вашей системе.
Изменение пути
Меняйте /api/data1/ на любой удобный путь: /api/info/, /api/result/ и т.д.
Доступные переменные
SENSOR.widthFormat
Ширина объекта
SENSOR.heightFormat
Высота объекта
SENSOR.lengthFormat
Длина объекта
SENSOR.weightFormat
Вес объекта
SENSOR.volumeFormat
Объём объекта
BARCODE
Считанный штрихкод
DEV_CODE
Код устройства (число от 0 до 9999)
DEV_CODE может содержать только цифры от 0 до 9999.
curl http://IP/api/data1/ или откройте адрес в браузере.
API ping
Проверка доступности устройства
Шаблон проверяет доступность устройства по сети. Используется для мониторинга статуса подключения.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/ping",
method: "GET",
resp: function (reqBody, reqHeaders) {
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ message: "ok" })
};
}
}
];
}
};
Разбор кода
endpoint: "/api/ping"
Конечная точка API для проверки доступности устройства.
method: "GET"
HTTP-метод для проверки доступности.
code: 200
HTTP-код ответа — успешное выполнение запроса.
message: "ok"
Ответ сервера — устройство доступно.
Пример JSON-ответа
{
"message": "ok"
}
API measure
Получение данных измерения с фотографией
Шаблон возвращает данные последнего измерения: габариты, вес и фотографию объекта с наложенной текстовой информацией. Фото передаётся в формате Base64.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/measure",
method: "GET",
resp: function (reqBody, reqHeaders) {
var imgData = "";
if (Number(SENSOR?.weightFormat ?? 0) > 0) {
try {
var mDate = HELPER_JS.formatDate(new Date(), "ddMMyyyy_hh-mm-ss");
var f64 = HELPER_JS.lastDataFrameInBase64({
label: {
text: "[ИНФОСКАН]\n" +
"Высота: " + SENSOR.heightFormat +
" \nШирина: " + SENSOR.widthFormat +
" Глубина: " + _len +
" Вес: " + SENSOR.weightFormat +
"\nОбъем: " + SENSOR.volumeFormat +
" Дата: " + mDate,
pointSize: 30, color: "#ffa500",
sensorTopView: true, sensorSideView: true
}
});
imgData = f64?.data ?? "";
} catch (e) { imgData = ""; }
}
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
height_mm: SENSOR?.heightFormat ?? 0,
width_mm: SENSOR?.widthFormat ?? 0,
length_mm: _len,
weight_mg: SENSOR?.weightFormat ?? 0,
photos: [imgData]
})
};
}
}
];
}
};
Разбор кода
Проверка веса weightFormat > 0
Фото создаётся только если объект был взвешен (вес больше 0).
lastDataFrameInBase64()
Получает последний кадр с камеры и возвращает изображение в формате Base64.
Наложение текста
На фото наносится текстовая информация: габариты, вес, объём и дата.
sensorTopView / sensorSideView
Отображение линеек сверху и сбоку на фотографии.
Обработка ошибок
Блок try/catch перехватывает ошибки при создании фото.
Поля ответа
height_mm
Высота объекта (мм)
width_mm
Ширина объекта (мм)
length_mm
Длина объекта (мм)
weight_mg
Вес объекта (мг)
photos
Массив с фотографией объекта в формате Base64
Пример JSON-ответа
{
"height_mm": "192",
"width_mm": "275",
"length_mm": "183",
"weight_mg": "1234",
"photos": ["data:image/jpeg;base64,/9j/4AAQ..."]
}
photos будет пустым.
API reset
Сброс состояния устройства
Шаблон выполняет сброс состояния устройства. Используется для возврата устройства в начальное состояние после ошибок или завершения работы.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/reset",
method: "POST",
resp: function (reqBody, reqHeaders) {
var clicked = HELPER_JS.clickButtonReset();
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clickedCalib: clicked })
};
}
}
];
}
};
Разбор кода
endpoint: "/api/reset"
Конечная точка API для сброса состояния устройства.
method: "POST"
HTTP-метод для отправки команды на устройство.
HELPER_JS.clickButtonReset()
Имитирует нажатие кнопки «Сброс» на устройстве.
clickedCalib
Результат выполнения: true — команда выполнена, false — ошибка.
Пример JSON-ответа
{
"clickedCalib": true
}
API repeat
Повторное измерение
Шаблон запускает повторное измерение на устройстве. Используется для автоматического повтора измерения без физического взаимодействия с устройством.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/repeat",
method: "POST",
resp: function (reqBody, reqHeaders) {
var clicked = HELPER_JS.clickButtonRepeat();
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clickedCalib: clicked })
};
}
}
];
}
};
Разбор кода
endpoint: "/api/repeat"
Конечная точка API для запуска повторного измерения.
method: "POST"
HTTP-метод для отправки команды на устройство.
HELPER_JS.clickButtonRepeat()
Имитирует нажатие кнопки «Повторить» на устройстве.
clickedCalib
Результат выполнения: true — команда выполнена, false — ошибка.
Пример JSON-ответа
{
"clickedCalib": true
}
API status
Проверка статуса устройства
Шаблон возвращает статус устройства. Используется для проверки доступности и работоспособности устройства по сети.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
return {
defaultRoute: function () {
return [
{
endpoint: "/api/status",
method: "GET",
resp: function (reqBody, reqHeaders) {
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ Status: "OK" })
};
}
}
];
}
};
Разбор кода
endpoint: "/api/status"
Конечная точка API для проверки статуса устройства.
method: "GET"
HTTP-метод для получения данных.
code: 200
HTTP-код ответа — успешное выполнение запроса.
Status: "OK"
Статус устройства — работает нормально.
Пример JSON-ответа
{
"Status": "OK"
}
API network
Получение сетевых настроек устройства
Шаблон возвращает сетевые параметры устройства: IP-адрес, порт, логин, пароль и адрес API. Используется для автоматического определения настроек подключения.
Пример кода
var _len = SENSOR.lengthFormat;
if (_len == null) { _len = 0; }
var mDate = HELPER_JS.formatDate(new Date(), 'ddMMyyyy_hh-mm-ss');
return {
defaultRoute: function () {
return [
{
endpoint: "/api/network",
method: "GET",
resp: function (reqBody, reqHeaders) {
var ip = (function() {
var ifaces = HELPER_JS.networkInterfaces();
if (!ifaces || ifaces.length === 0) return '';
var m = ifaces.find(x => (x.name || '').toLowerCase() === 'end0');
if (m == null) m = ifaces.find(x => (x.name || '').toLowerCase() === 'wlan0');
return (m && m.ipV4) ? String(m.ipV4) : '';
})();
return {
code: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
Status: "OK",
ip: ip,
port: "80",
login: "admin",
password: "admin",
api: '/api/data'
})
};
}
}
];
}
};
Разбор кода
HELPER_JS.networkInterfaces()
Получает список сетевых интерфейсов устройства.
Поиск интерфейса
Сначала ищет проводной интерфейс end0, затем беспроводной wlan0.
endpoint: "/api/network"
Конечная точка API для получения сетевых настроек.
method: "GET"
HTTP-метод для получения данных.
Поля ответа
Status
Статус ответа: "OK"
ip
IP-адрес устройства
port
Порт устройства (по умолчанию "80")
login
Логин для доступа (по умолчанию "admin")
password
Пароль для доступа (по умолчанию "admin")
api
Адрес API для получения данных: "/api/data"
Пример JSON-ответа
{
"Status": "OK",
"ip": "192.168.1.100",
"port": "80",
"login": "admin",
"password": "admin",
"api": "/api/data"
}
API mera
Получение данных измерения в текстовом формате
Шаблон возвращает данные измерения в текстовом формате, включая вес, статус и счётчик обновлений. Используется для интеграции с внешними системами, которые ожидают простой текстовый ответ вместо JSON.
Пример кода
return {
defaultRoute: function() {
return [{
endpoint: '/api/mera.html',
method: 'GET',
resp: function(reqBody, reqHeaders) {
var strSensor = HELPER_JS.padLeft(SENSOR?.weightFormat ?? '000.000', 7, 0);
var countUpdate = GLOBAL_VAR.storeGet('countUpdate') ?? 0;
countUpdate += 1;
GLOBAL_VAR.storePut('countUpdate', countUpdate);
return {
code: 200,
headers: {
'Content-Type': 'text/html'
},
body: '+' + strSensor + '\nS\n' + countUpdate
};
}
}];
}
};
Разбор кода
endpoint: "/api/mera.html"
Конечная точка API для получения данных измерения в текстовом формате.
method: "GET"
HTTP-метод для получения данных.
Content-Type: text/html
Ответ возвращается в текстовом формате, а не в JSON.
HELPER_JS.padLeft()
Форматирует вес до 7 символов с ведущими нулями (например, +023.450).
GLOBAL_VAR.storeGet/storePut
Счётчик обновлений хранится в глобальном хранилище и инкрементируется при каждом запросе.
countUpdate
Количество обращений к API с момента запуска устройства.
Формат текстового ответа
+023.450
Вес, отформатированный до 7 символов с ведущими нулями и знаком + в начале.
S
Статус устройства. S — готов к работе.
1
Порядковый номер обращения к API (инкрементируется).
Пример текстового ответа
+023.450
S
1
Важные замечания
Оператор ??
Оператор Nullish Coalescing (??) возвращает правый операнд, если левый равен null или undefined. Поддерживается в Qt 5.15+.
Глобальное хранилище
GLOBAL_VAR.storeGet/storePut сохраняют данные между запросами. Счётчик сбрасывается при перезагрузке устройства.
Текстовый формат
Ответ возвращается как text/html, а не application/json. Каждое значение на отдельной строке.
Что такое jsScriptHistorySensor
Форматирование данных для истории измерений
Шаблон jsScriptHistorySensor определяет формат и структуру данных, сохраняемых в истории измерений. Позволяет настроить, какие поля записываются и как они форматируются.
jsScriptHistorySensor.
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Лимит записей
По умолчанию в истории хранится до 1000 записей измерений. При достижении лимита более новые данные перезаписывают старые (принцип FIFO — первым пришёл, первым ушёл).
1 000 записей
Стандартный лимит для большинства задач
10 000 записей
Расширение по запросу в техническую поддержку
100 000 записей
Максимальное расширение по запросу в техническую поддержку
Доступные поля
SENSOR.widthFormat
Ширина объекта
SENSOR.heightFormat
Высота объекта
SENSOR.lengthFormat
Длина объекта
SENSOR.weightFormat
Вес объекта
SENSOR.volumeFormat
Объём объекта
BARCODE
Считанный штрихкод
HELPER_JS.formatDate()
Форматирование текущей даты и времени
_order определяет порядок столбцов в истории. Изменяйте его для настройки отображения.
API для 1С
Формат данных для передачи в 1С
Шаблон формирует данные истории измерений в формате, удобном для передачи в 1С. Содержимое полностью настраивается под вашу задачу.
Пример кода
return {
historySensor: function() {
var obj = {
width: SENSOR.widthFormat,
height: SENSOR.heightFormat,
length: SENSOR.lenghtFormat,
weight: SENSOR.weightFormat,
barcode: BARCODE,
volume: SENSOR.volumeFormat,
_order: ['barcode', 'width', 'height', 'length', 'weight', 'volume', 'created', 'unique_index']
};
return obj;
}
};
Разбор кода
historySensor()
Основная функция, возвращающая объект с данными измерения.
_order
Массив, определяющий порядок столбцов в истории. Первый элемент — первый столбец.
barcode
Штрихкод товара — обычно первый столбец для удобства поиска.
Пример отображения в истории
| barcode | width | height | length | weight | volume |
|---|---|---|---|---|---|
| 4600572256094 | 275 | 192 | 183 | 1234 | 9.66 |
_order для настройки отображения столбцов в истории.
API history
Формат данных истории измерений
Шаблон формирует данные истории измерений с датой и временем. Доступно несколько вариантов формата — выбирайте подходящий под вашу задачу.
Шаблон 1: Основной
Стандартный формат с англоязычными ключами и датой.
return {
historySensor: function () {
var mDate = HELPER_JS.formatDate(new Date(), 'dd-MM-yyyy_hh:mm:ss');
var num = SENSOR.lengthFormat;
if (num == null) { num = 0; }
var obj = {
'width': SENSOR.widthFormat,
'height': SENSOR.heightFormat,
'length': num,
'weight': SENSOR.weightFormat,
'barcode': BARCODE,
'volume': SENSOR.volumeFormat,
'date': mDate,
_order: ['width', 'height', 'length', 'weight', 'barcode', 'volume', 'date', 'created', 'unique_index']
};
return obj;
}
};
{
"width": "275",
"height": "192",
"length": "183",
"weight": "1234",
"barcode": "4600572256094",
"volume": "9.66",
"date": "15-07-2026_14:30:25"
}
Шаблон 2: Русские ключи
Вариант с русскоязычными названиями полей — удобно для отображения в интерфейсе.
return {
historySensor: function () {
var mDate = HELPER_JS.formatDate(new Date(), 'dd-MM-yyyy_hh:mm:ss');
var num = SENSOR.lengthFormat;
if (num == null) { num = 0; }
var obj = {
'Ширина': SENSOR.widthFormat,
'Высота': SENSOR.heightFormat,
'Длина': num,
'Вес': SENSOR.weightFormat,
'Штрих-код': BARCODE,
'Объем': SENSOR.volumeFormat,
'Дата': mDate,
_order: ['Ширина', 'Высота', 'Длина', 'Вес', 'Штрих-код', 'Объем', 'Дата', 'created', 'unique_index']
};
return obj;
}
};
{
"Ширина": "275",
"Высота": "192",
"Длина": "183",
"Вес": "1234",
"Штрих-код": "4600572256094",
"Объем": "9.66",
"Дата": "15-07-2026_14:30:25"
}
Полная кастомизация
Шаблоны полностью подлежат кастомизации. Вы можете менять:
Названия ключей
Заменяйте width на Ширина, height на Высота или любые другие названия.
Порядок столбцов
Изменяйте массив _order для настройки отображения.
Добавление полей
Добавляйте свои переменные, расчёты или данные из других шаблонов.
created и unique_index добавляются автоматически системой — не удаляйте их из _order.
Что такое jsScriptAction
Действия после измерения перед отправкой данных
Шаблон jsScriptAction отрабатывает непосредственно после измерения, но перед выполнением шаблона jsScriptFinishSend (перед отправкой данных). Является подтверждением выполнения шаблона jsScriptFinishSend.
jsScriptAction.
Порядок выполнения шаблонов
Шаблон jsScriptAction выполняется в промежутке между измерением и отправкой данных:
Измерение
Устройство считывает габариты и вес объекта
jsScriptAction
Выполняется проверка/подтверждение данных перед отправкой
jsScriptFinishSend
Отправка данных на внешний сервер
Назначение
Подтверждение отправки
Пользователь подтверждает, что данные нужно отправить на сервер.
Контроль ВГХ
Проверка габаритов и веса перед отправкой — возможность скорректировать или отменить.
Визуальный контроль
Отображение данных измерения для визуальной проверки оператором.
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Подтверждение данных
Запрос подтверждения перед отправкой
Шаблон отображает экран с запросом подтверждения перед отправкой данных. Пользователь может подтвердить или отменить отправку.
Пример кода
return {
confirmSend: {
simple: function () {
return {
resp: function () {
return {
banner: 'Подтвердите отправку данных',
bannerColor: '#00FF00',
bannerFontPixelSize: 30,
comment: '',
content: '<h2 style="text-align: center;">Отправить данные в WMS?</h2>',
rejected: {
banner: 'Отправка данных отменена',
bannerColor: '#FF0000',
bannerFontPixelSize: 40,
comment: ''
}
};
}
};
}
}
};
Разбор кода
confirmSend
Объект, определяющий подтверждение отправки данных.
simple
Функция, возвращающая экран подтверждения.
banner
Текст на баннере при отображении экрана подтверждения.
bannerColor
Цвет баннера (зелёный — подтверждение, красный — отмена).
bannerFontPixelSize
Размер шрифта на баннере.
content
HTML-контент, отображаемый на экране подтверждения.
rejected
Настройки экрана при отмене отправки.
Экраны
content для отображения нужной информации: данные измерения, штрихкод, номер заказа и т.д.
Что такое js_script_auth_mode
Настройка режима авторизации устройства
Шаблон js_script_auth_mode определяет режим авторизации доступа к устройству. Позволяет настроить способ аутентификации пользователей и контроль доступа.
js_script_auth_mode.
Доступные режимы
Режим 1
Работа с устройством с авторизацией (сканирование ШК или QR-бейджа сотрудника) или из гостевого режима без отправки данных в систему.
Режим 2
Работа с устройством исключительно после авторизации (сканирование ШК или QR-бейджа сотрудника). Гостевой режим отключён.
Режим 3
Мультиаккаунт — работа нескольких контрагентов. Экран выбора клиента перед началом работы.
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Режим 1
Авторизация или гостевой режим
Работа с устройством с авторизацией (сканирование ШК или QR-бейджа сотрудника) или из гостевого режима без отправки данных в систему.
Пример кода
var mBarcode = BARCODE;
if (BARCODE == 'BARCODE') { mBarcode = '1000'; }
return {
settings: {
simple: function () {
return {
resp: function () {
return {
auth_mode_button_auth: 'Авторизация пользователя',
auth_mode_button_no_auth: 'Работа без авторизации',
}
}
}
}
},
simple: function () {
return {
resp: function () {
return {
hostname: 'hostname',
timeoutLogout: 300000,
buttonTextLogout: 'Гостевой',
};
}
};
},
http: function () {
return {
url: 'http://192.168.10.49:8000/json/login',
headers: {
'Content-Type': 'application/json',
'X-Tander-UserId': mBarcode
},
body: function () {
return '';
},
resp: function (resp, httpCode) {
var j = JSON.parse(resp);
if (httpCode == 200) {
return {
timeoutLogout: 300000,
buttonTextLogout: j.name
};
}
if (httpCode == 400 && j.message) {
throw Error('Ошибка ' + j.code + ':' + j.message);
}
throw Error('Неизвестная ошибка.');
}
};
}
}
Разбор кода
settings
Настройки экрана выбора режима — кнопки «Авторизация» и «Работа без авторизации».
simple
Настройки гостевого режима — заголовок, время автоматического выхода.
http
HTTP-запрос для проверки авторизации сотрудника по ШК/QR.
timeoutLogout
Время автоматического выхода (300000 мс = 5 минут).
buttonTextLogout
Текст кнопки выхода — в гостевом режиме «Гостевой», при авторизации — имя сотрудника.
Настройки
URL сервера авторизации
Измените http://192.168.10.49:8000/json/login на адрес вашего сервера.
Время выхода
Измените timeoutLogout для настройки времени автоматического выхода.
Текст кнопок
Измените auth_mode_button_auth и auth_mode_button_no_auth для кастомизации.
Режим 2
Только с авторизацией
Работа с устройством исключительно после авторизации (сканирование ШК или QR-бейджа сотрудника). Гостевой режим отключён.
Пример кода
var mBarcode = BARCODE;
if (BARCODE == 'BARCODE') { mBarcode = '1000'; }
return {
settings: {
simple: function () {
return {
resp: function () {
return {
auth_mode_button_auth: 'Авторизация пользователя',
auth_mode_button_no_auth: 'Работа без авторизации',
}
}
}
}
},
simple: function () {
return {
resp: function () {
return {
hostname: 'hostname',
timeoutLogout: 300000,
buttonTextLogout: 'Гостевой',
};
}
};
},
http: function () {
return {
url: 'http://192.168.10.49:8000/json/login',
headers: {
'Content-Type': 'application/json',
'X-Tander-UserId': mBarcode
},
body: function () {
return '';
},
resp: function (resp, httpCode) {
var j = JSON.parse(resp);
if (httpCode == 200) {
return {
timeoutLogout: 300000,
buttonTextLogout: j.name
};
}
if (httpCode == 400 && j.message) {
throw Error('Ошибка ' + j.code + ':' + j.message);
}
throw Error('Неизвестная ошибка.');
}
};
}
}
Разбор кода
settings
Настройки экрана авторизации — кнопки для выбора режима входа.
simple
Настройки сессии — заголовок, время автоматического выхода, текст кнопки.
http
HTTP-запрос для проверки авторизации сотрудника по ШК/QR на сервере.
Обязательная авторизация
В отличие от режима 1, гостевой режим не используется.
Отличия от режима 1
Нет гостевого режима
Пользователь не может начать работу без авторизации.
Полный контроль доступа
Все действия привязаны к авторизованному сотруднику.
Настройки
URL сервера авторизации
Измените http://192.168.10.49:8000/json/login на адрес вашего сервера.
Время выхода
Измените timeoutLogout для настройки времени автоматического выхода.
Режим 3
Выбор клиента
Шаблон отображает экран с кнопками для выбора клиента/пользователя. При нажатии кнопки ID клиента сохраняется в GLOBAL_VAR и используется во всех последующих шаблонах.
Пример кода
const TIMEOUT_LOGOUT = 50 * 100000000;
// Пары: [текст кнопки, userId]
const BUTTONS = [
['Клиент 1', 11111],
['Клиент 2', 2222],
['Клиент 3', 3333],
['Клиент 4', 4444],
['Клиент 5', 5555]
];
const makeButton = (text, id) => ({
timeoutLogout: TIMEOUT_LOGOUT,
buttonTextLogout: text,
name: `<h1>${text}</h1>`,
clicked: () => GLOBAL_VAR.authModePut('user', id),
});
return {
simple() {
console.log('req simple');
return {
resp() {
return {
pageTitle: 'Выберите клиента',
pageButtons: BUTTONS.map(([text, id]) => makeButton(text, id)),
};
},
};
},
};
Разбор кода
TIMEOUT_LOGOUT
Время автоматического выхода (мс). По умолчанию — очень большое значение (практически без ограничений).
BUTTONS
Массив пар [текст, ID]. Определяет кнопки на экране выбора клиента.
makeButton
Функция создания объекта кнопки с обработчиком нажатия.
GLOBAL_VAR.authModePut('user', id)
Сохраняет ID выбранного клиента в глобальную переменную.
pageTitle
Заголовок экрана — «Выберите клиента».
Настройка кнопок
Измените массив BUTTONS для добавления/удаления клиентов:
const BUTTONS = [
['Название кнопки', ID_клиента],
['Название кнопки', ID_клиента],
// ...
];
Текст кнопки
Первый элемент пары — текст, отображаемый на кнопке.
ID клиента
Второй элемент пары — числовой ID, сохраняемый в GLOBAL_VAR.
jsScriptFinishSend.
Что такое jsScriptScheduler
Планировщик задач и автоматическая отправка данных
Шаблон jsScriptScheduler определяет расписание автоматических действий устройства. Позволяет настроить периодическую отправку накопленных данных на внешний сервер по расписанию (cron).
jsScriptScheduler.
Для чего нужен
Отправка по расписанию
Автоматическая отправка накопленных измерений на сервер по cron-расписанию.
Накопление данных
Данные измерений собираются в очередь и отправляются пакетом.
Фильтрация
Возможность фильтровать данные перед отправкой.
Интеграция с WMS/ERP
Отправка данных в корпоративные системы учёта.
Как работает
Cron-расписание
Указывается время запуска (например, '* * * * *' — каждую минуту).
Сбор данных
Шаблон собирает данные измерений через функцию map.
Агрегация
Данные объединяются через reduce и фильтруются через filter.
Отправка
Пакет данных отправляется на сервер через HTTP-запрос.
Примеры cron-выражений
'* * * * *'
Каждую минуту
'0 * * * *'
Каждый час (в 0 минут)
'0 9 * * *'
Каждый день в 9:00
'0 9 * * 1-5'
Каждый рабочий день в 9:00
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
Автоматическая отправка
Отправка данных по cron-расписанию
Шаблон автоматически собирает данные измерений и отправляет их на внешний сервер по расписанию. Данные фильтруются, агрегируются и отправляются пакетом.
Пример кода
return {
scheduler: function () {
return {
cron: '* * * * *',
map: function (val) {
return {
"barcode": val.barcode,
"height": val.sensor.heightFormat,
"length": val.lengthFormat,
"width": val.sensor.widthFormat,
"weigh": val.sensor.weightFormat
}
},
reduce: function (accumulator, currentValue) {
accumulator.push(currentValue)
return accumulator
},
filter: function (arr) {
return arr.length === 1
},
process: function (arr) {
console.log('start process scheduler')
return [{
http: function () {
return {
url: 'http://192.168.10.251:8000/json/set',
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: function () {
var obj = {
items: arr
}
var b = JSON.stringify(obj)
console.log('body http scheduler', b)
return b
},
resp: function (resp, httpCode) {
console.log('http resp', resp)
if (httpCode != 200) {
throw Error('Error js from http -> ' + httpCode)
}
}
}
}
}]
}
}
},
viewStatus: function (val, status, exception) {
var msg = ''
if (status === 'WAIT_SEND') {
msg = 'Ожидание отправки. ' + JSON.stringify(val)
}
else if (status === 'FINISH_SEND') {
msg = 'Отправлен. ' + JSON.stringify(val)
}
else {
msg = 'Ошибка. ' + JSON.stringify(val) + ' -> ' + exception.what
}
console.log('viewStatus', msg)
return { msg: msg }
}
}
Разбор кода
cron
Cron-выражение для расписания запуска. '* * * * *' — каждую минуту.
map
Функция преобразования каждого измерения в нужный формат.
reduce
Функция агрегации — объединяет данные в массив.
filter
Функция фильтрации — отправляет только если есть данные.
process
Функция обработки — выполняет HTTP-запрос для отправки данных.
viewStatus
Функция отображения статуса отправки (ожидание, успех, ошибка).
Формат отправляемых данных
{
"items": [
{
"barcode": "4600572256094",
"height": "192",
"length": "183",
"width": "275",
"weigh": "1234"
}
]
}
Статусы отправки
WAIT_SEND
Данные ожидают отправки
FINISH_SEND
Данные успешно отправлены
Ошибка
Произошла ошибка при отправке
http://192.168.10.251:8000/json/set на адрес вашего сервера.
console.log() — данные будут отображаться в консоли устройства.
Что такое jsScriptIdle
Отображение сетевой информации в режиме простоя
Шаблон jsScriptIdle отвечает за вывод сетевой информации о текущем подключении. В режиме простоя на экране устройства отображается IP-адрес для удобства настройки и диагностики.
jsScriptIdle.
Возможности
Отображение IP-адреса
На экране устройства показывается текущий IP-адрес для удобства настройки.
QR-код с IP-адресом
Возможность отображения QR-кода с IP-адресом для быстрого подключения.
Диагностика сети
Удобный способ узнать IP-адрес устройства без дополнительных инструментов.
GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
QR-код
Отображение IP-адреса в виде QR-кода
Шаблон формирует QR-код с IP-адресом устройства. Позволяет быстро отсканировать адрес для подключения к устройству через мобильное приложение или браузер.
Пример кода
return {
qr: function () {
return {
type: 'code',
centerText: '',
body: function () {
var ifaces = HELPER_JS.networkInterfaces();
console.log('log_ifaces', ifaces);
if (!ifaces || ifaces.length === 0) {
return '';
}
// 1) end0
var m = ifaces.find(x => (x.name || '').toLowerCase() === 'end0');
// 2) wlan0
if (m == null) {
m = ifaces.find(x => (x.name || '').toLowerCase() === 'wlan0');
}
// 3) fallback: пусто
var ipv4 = (m && m.ipV4) ? String(m.ipV4) : '';
console.log('log_qr', ipv4);
return ipv4;
}
}
}
};
Разбор кода
type: 'code'
Тип генерации — код (не текст).
networkInterfaces()
Получает список сетевых интерфейсов устройства.
Поиск end0
Сначала ищет проводной интерфейс (Ethernet).
Поиск wlan0
Если нет проводного — ищет беспроводной (Wi-Fi).
ipv4
IPv4-адрес устройства для QR-кода.
Пример QR-кода
При сканировании QR-кода пользователь получает IP-адрес устройства для подключения.