Инструкция Алгоритмы Интеграция

Алгоритмы

Настройка поведения устройства с помощью JavaScript-шаблонов

JavaScript Гибкая настройка Интеграция

Что такое алгоритмы

Общая информация о системе шаблонов

Алгоритмы — это JavaScript-шаблоны, которые определяют поведение устройства Инфоскан. С помощью них вы можете настроить все процессы: от дополнительных экранов перед измерением до отправки данных на внешние серверы.

Шаблоны настраиваются в личном кабинете устройства во вкладке «Алгоритмы».

Зачем нужны шаблоны

Настройка поведения

Определяет, что устройство делает после измерения: выводит QR-код, отправляет данные на сервер, сохраняет в историю.

Интеграция с системами

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

Управление доступом

Настраивает авторизацию сотрудников, гостевой режим и мультиаккаунт.

Автоматизация

Позволяет настроить автоматическую отправку данных по расписанию.

Связь между шаблонами

Все шаблоны связаны между собой и работают в единой цепочке. Данные, полученные в одном шаблоне, доступны в других через переменную GLOBAL_VAR.

1

Авторизация

js_script_auth_mode — определяет, кто работает с устройством.

2

Подготовка

jsScriptItemType — дополнительные экраны перед измерением.

3

Действие

jsScriptAction — подтверждение перед отправкой.

4

Отправка

jsScriptFinishSend — отправка данных на сервер.

5

История

jsScriptHistorySensor — сохранение в историю.

6

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 расширяет процесс измерения, добавляя дополнительные шаги перед началом работы. Это позволяет классифицировать объекты, считать количество и привязывать штрихкоды к результатам измерений.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле 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 для построения условной логики.
jsScriptItemType

Выбор типа упаковки

Экран с кнопками для классификации объектов

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

Переменная результата

resultItemTypeList1 — содержит выбранное значение (например, «Коробка», «Спайка», «Штука»).

Тип страницы

ListButtonRowPage — экран с горизонтальным списком кнопок.

1

Определите варианты упаковки

Создайте массив 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 — обязательное уменьшение, иначе экран не вместит

Совет: перед развёртыванием на устройствах всегда проверяйте отображение кнопок на экране. Текст не должен обрезаться и выходить за границы кнопки.
jsScriptItemType

Ввод количества объектов

Экран с числовой клавиатурой для ввода числа

Шаблон отображает экран с числовой клавиатурой для ввода числового значения. Используется для указания количества единиц товара в грузовой упаковке.

Переменная результата

resultItemTypeCount1 — содержит введённое числовое значение.

Тип страницы

CountPage — экран с числовой клавиатурой.

1

Настройте подсказку

Значение 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'
        };
    }
];
Пример: Ручной ввод ШК
Пример отображения экрана «Ручной ввод ШК» на устройстве
jsScriptItemType

Дополнительное сканирование

Активация сканера для считывания штрихкода

Шаблон активирует подключённый сканер штрихкодов и ожидает считывания кода. Поддерживается сканирование линейных штрихкодов и QR-кодов.

Зачем нужно дополнительное сканирование

Экран сканирования полезен, когда нужно привязать штрихкод к результату измерения — например, считать код товара перед взвешиванием или присвоить ID заказа.

Можно добавлять несколько таких экранов подряд — каждый считанный код сохраняется в свою переменную и передаётся дальше по шаблонам.

Переменная результата

resultItemTypeScan1 — содержит считанное значение штрихкода.

Тип страницы

AdditionalScanPage — экран сканирования с подсказкой.

1

Укажите подсказку

Текст pageTitle отображается на экране сканирования. Устройство будет ожидать считывания кода.

Пример кода

return [
    // === Сканирование ШК ===
    function (args) {
        return {
            page: 'AdditionalScanPage',
            pageTitle: 'Отсканируйте штрих-код',
            nameResult: 'resultItemTypeScan1'
        };
    }
];
Пример: Дополнительное сканирование
Пример отображения экрана «Дополнительное сканирование» на устройстве
Важно: для работы сканирования необходимо включить сканер ШК в настройках устройства (раздел «Основные» → «Сканер ШК»).
jsScriptItemType

Подтверждение ШК

Проверка штрихкода через внешний 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);
                }
            }
        };
    }
];
Пример: Подтверждение ШК
Пример отображения экрана «Подтверждение ШК» на устройстве
Шаблон отправляет SOAP-запрос к внешнему сервису для проверки штрихкода. Ответ сервера парсится из XML в JSON с помощью 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

Наименование товара, привязанное к штрихкоду.

В запросе передаётся SOAP-конверт с тегом m:Barcode, содержащим значение отсканированного штрихкода. Сервер возвращает XML с наименованием товара и статусом проверки.
jsScriptItemType

Цикличное измерение

Режим повторного измерения объектов

После завершения измерения устройство отображает экран с подсказкой для нового измерения. При подтверждении шаблон возвращается к первому шагу для нового цикла.

Переменная результата

resultItemType — используется для сброса цикла и возврата к началу шаблона.

Тип страницы

InfoScanLiteItemTypePage — экран с подсказкой для нового измерения.

Пример кода

return [
    function (args) {
        return {
            page: 'InfoScanLiteItemTypePage',
            pageTitle: 'Установите коробку еще раз',
            nameResult: 'resultItemType'
        };
    }
];
После завершения измерения устройство отображает экран с подсказкой «Установите коробку еще раз». При подтверждении шаблон возвращается к первому шагу для нового цикла измерения.

jsScriptFinishSend

Отправка результатов измерения — QR-код, HTTP, FTP, TCP

QR-код HTTP FTP TCP
jsScriptFinishSend

Что такое jsScriptFinishSend

Определение действий устройства после измерения

Шаблон jsScriptFinishSend определяет действия устройства после успешного измерения габаритов и веса. Это может быть вывод QR-кода на экран, отправка данных на внешний сервер через HTTP (XML/JSON), загрузка на FTP-сервер или передача по TCP.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле jsScriptFinishSend.
Для передачи данных между шаблонами используйте переменную GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.

Доступные опции отправки

Вывод QR-кода

Формирует JSON с данными измерения и выводит QR-код на экран устройства.

Отправка по HTTP (XML/JSON)

Отправка данных на внешний сервер через POST-запрос в формате XML или JSON.

Отправка на FTP

Загрузка файла с данными измерения на FTP-сервер.

Важно: для Инфоскан 3Д 60/90 используйте 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.
jsScriptFinishSend

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: '' };
            }
        };
    }
};
С штрихкодом
Пример строки:
1234567890;275;192;183;1234;9.66;
1234567890 — ШК 275 — Ширина (мм) 192 — Высота (мм) 183 — Длина (мм) 1234 — Вес (г) 9.66 — Объём (л)

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: '' };
            }
        };
    }
};
Без штрихкода
Пример строки:
275;192;183;1234;9.66;
275 — Ширина (мм) 192 — Высота (мм) 183 — Длина (мм) 1234 — Вес (г) 9.66 — Объём (л)

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: '' };
            }
        };
    }
};
JSON-формат
Пример строки:
{"Length":"183","Width":"275","Height":"192","Weight":"1234"}
Length — Длина (мм) Width — Ширина (мм) Height — Высота (мм) Weight — Вес (г)

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: '' };
            }
        };
    }
};
Ключ=Значение
Пример строки:
WIDTH=275;HEIGHT=192;LENGTH=183;WEIGHT=1234;
WIDTH — Ширина (мм) HEIGHT — Высота (мм) LENGTH — Длина (мм) WEIGHT — Вес (г)
Важно: если сканер ШК не подключён, а выбран шаблон с BARCODE, в строке QR-кода на месте переменной отобразится undefined. Убедитесь, что сканер активен или используйте шаблон без ШК.

Настраиваемое содержание QR-кода

Содержание QR-кода можно менять самостоятельно. Добавляйте строки, свои переменные с расчётами или переменные из других шаблонов.

Например, переменная GLOBAL_VAR из шаблона jsScriptItemType доступна в jsScriptFinishSend и может быть включена в итоговую строку QR-кода.

Доступные переменные

SENSOR.widthFormat

Ширина объекта

SENSOR.heightFormat

Высота объекта

SENSOR.lengthFormat

Длина объекта

SENSOR.weightFormat

Вес объекта

SENSOR.volumeFormat

Объём объекта

BARCODE

Считанный штрихкод (если сканер активен)

jsScriptFinishSend

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

Дополнительный элемент возврата (может быть пустым).

XPath для парсинга
Статус: /soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Status/text()
Комментарий: /soap:Envelope/soap:Body/m:SaveParametrsResponse/m:Comment/text()
jsScriptFinishSend

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. Это стандартный формат для данного шаблона.
jsScriptFinishSend

Отправка данных в формате XML

HTTP POST-запрос с XML-документом

Шаблон отправляет данные измерения на внешний сервер через HTTP POST-запрос в формате XML. Подходит для интеграции с корпоративными системами, использующими XML-обмен данными.

Формат данных

XML-документ с тегами для длины, ширины, высоты и веса объекта.

Протокол

HTTP POST-запрос с Content-Type: application/xml.

Пример кода будет добавлен позже. Обратитесь к технической поддержке для получения готового шаблона.
jsScriptFinishSend

Отправка данных в формате 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.

Пример кода будет добавлен позже. Обратитесь к технической поддержке для получения готового шаблона.
jsScriptFinishSend

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)

Примеры фотографий:

FTP фото с одной камерой
Одна подключённая камера
FTP фото с двумя камерами
Две подключённые камеры
jsScriptFinishSend

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

Считанный штрихкод

Пример строки данных

При измерении объекта со следующими параметрами:

Ширина: 275 мм Высота: 192 мм Длина: 183 мм Вес: 1234 г ШК: 4600572256094

На TCP-сервер будет отправлена строка:

275;192;183;1234;4600572256094
Пример: TCP-порт
Пример работы TCP-порта — отправка данных измерения на сервер
Важно: убедитесь, что TCP-сервер доступен по указанному адресу и порту. Проверьте настройки сети и файрвола перед использованием.
Совет: для тестирования TCP-соединения можно использовать утилиты типа netcat или nc для прослушивания указанного порта.
jsScriptHttpHandler

Что такое jsScriptHttpHandler

Обработка входящих HTTP-запросов к устройству

Шаблон jsScriptHttpHandler определяет поведение устройства при получении входящих HTTP-запросов. Позволяет настроить обработку команд, передаваемых на устройство через REST API.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле jsScriptHttpHandler.
Для передачи данных между шаблонами используйте переменную GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.

Как работает

Устройство слушает входящие HTTP-запросы на определённом порту. При получении запроса шаблон определяет, какую команду нужно выполнить и как ответить.

1

Внешняя система отправляет HTTP-запрос

На адрес устройства: http://IP/api/...

2

Шаблон обрабатывает команду

Определяет тип запроса (GET/POST) и выполняет соответствующее действие.

3

Устройство выполняет действие

Получение данных, проверка статуса, измерение — в зависимости от эндпоинта.

4

Возвращается ответ

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
}
Важно: шаблон обрабатывает только входящие HTTP-запросы. Для исходящих запросов (отправка данных на сервер) используйте jsScriptFinishSend.
Подробное описание каждого эндпоинта вы найдёте в соответствующих вкладках меню слева.
jsScriptHttpHandler

API для 1С

Передача данных измерения в 1С через handlerDataResp

Шаблон handlerDataResp формирует структурированный ответ с данными измерения для внешних систем. Используется для передачи габаритов, веса и штрихкода в формате JSON.

Важно: данные отображаются только в том случае, если на устройстве было проведено успешное измерение. Если измерение не выполнено или выполнено с ошибкой, API вернёт значения по умолчанию (нули).
Адрес API
http://[ip-адрес устройства]/api/data
Пример: http://192.168.1.100/api/data
GET Для забора данных используется GET-запрос
Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле 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
jsScriptHttpHandler

API data

Получение данных измерения

Шаблон возвращает данные последнего измерения: габариты, вес и штрихкод. Доступно несколько вариантов формата ответа — выбирайте подходящий под вашу задачу.

Данные отображаются только в том случае, если на устройстве было проведено успешное измерение.

Шаблон 1: Основной

Стандартный формат ответа с англоязычными ключами. Подходит для интеграции с системами, ожидающими JSON с ключами на английском.

Адрес API
http://[ip-адрес устройства]/api/data1/
GET Пример: http://192.168.1.100/api/data1/
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); }
                }
            }
        ];
    }
};
Пример JSON-ответа:
{
    "width": "275",
    "height": "192",
    "length": "183",
    "weight": "1234",
    "barcode": "4600572256094",
    "devCode": 1
}

Шаблон 2: Русские ключи

Вариант с русскоязычными названиями полей. Удобно для интеграции с 1С и другими русскоязычными системами.

Адрес API
http://[ip-адрес устройства]/api/data2/
GET Пример: http://192.168.1.100/api/data2/
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); }
                }
            }
        ];
    }
};
Пример JSON-ответа:
{
    "ширина": "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/ или откройте адрес в браузере.
jsScriptHttpHandler

API ping

Проверка доступности устройства

Шаблон проверяет доступность устройства по сети. Используется для мониторинга статуса подключения.

Адрес API
http://[ip-адрес устройства]/api/ping
Пример: http://192.168.1.100/api/ping
GET Для проверки доступности используется GET-запрос

Пример кода

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"
}
Совет: используйте этот эндпоинт для регулярной проверки доступности устройства. Если устройство не отвечает — проверьте сетевое подключение.
jsScriptHttpHandler

API measure

Получение данных измерения с фотографией

Шаблон возвращает данные последнего измерения: габариты, вес и фотографию объекта с наложенной текстовой информацией. Фото передаётся в формате Base64.

Данные отображаются только в том случае, если на устройстве было проведено успешное измерение (вес > 0).
Адрес API
http://[ip-адрес устройства]/api/measure
Пример: http://192.168.1.100/api/measure
GET Для получения данных используется GET-запрос

Пример кода

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 будет пустым.
Совет: изображение в формате Base64 можно декодировать и отобразить в браузере или сохранить как файл.
jsScriptHttpHandler

API reset

Сброс состояния устройства

Шаблон выполняет сброс состояния устройства. Используется для возврата устройства в начальное состояние после ошибок или завершения работы.

Адрес API
http://[ip-адрес устройства]/api/reset
Пример: http://192.168.1.100/api/reset
POST Для сброса состояния используется POST-запрос

Пример кода

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
}
Совет: используйте этот эндпоинт для сброса устройства перед началом новой операции или после восстановления из ошибочного состояния.
jsScriptHttpHandler

API repeat

Повторное измерение

Шаблон запускает повторное измерение на устройстве. Используется для автоматического повтора измерения без физического взаимодействия с устройством.

Адрес API
http://[ip-адрес устройства]/api/repeat
Пример: http://192.168.1.100/api/repeat
POST Для запуска повторного измерения используется POST-запрос

Пример кода

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
}
Совет: используйте этот эндпоинт для автоматического повтора измерения после обнаружения ошибки или необходимости пересчёта.
jsScriptHttpHandler

API status

Проверка статуса устройства

Шаблон возвращает статус устройства. Используется для проверки доступности и работоспособности устройства по сети.

Адрес API
http://[ip-адрес устройства]/api/status
Пример: http://192.168.1.100/api/status
GET Для проверки статуса используется GET-запрос

Пример кода

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"
}
Совет: используйте этот эндпоинт для мониторинга доступности устройства. Если устройство не отвечает или возвращает ошибку — проверьте сетевое подключение.
jsScriptHttpHandler

API network

Получение сетевых настроек устройства

Шаблон возвращает сетевые параметры устройства: IP-адрес, порт, логин, пароль и адрес API. Используется для автоматического определения настроек подключения.

Адрес API
http://[ip-адрес устройства]/api/network
Пример: http://192.168.1.100/api/network
GET Для получения данных используется GET-запрос

Пример кода

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"
}
Совет: используйте этот эндпоинт для автоматического определения IP-адреса устройства в сети. Удобно для массового развёртывания.
jsScriptHttpHandler

API mera

Получение данных измерения в текстовом формате

Шаблон возвращает данные измерения в текстовом формате, включая вес, статус и счётчик обновлений. Используется для интеграции с внешними системами, которые ожидают простой текстовый ответ вместо JSON.

Адрес API
http://[ip-адрес устройства]/api/mera.html
Пример: http://192.168.1.100/api/mera.html
GET Для получения данных используется GET-запрос

Пример кода

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 определяет формат и структуру данных, сохраняемых в истории измерений. Позволяет настроить, какие поля записываются и как они форматируются.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле 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 определяет порядок столбцов в истории. Изменяйте его для настройки отображения.
jsScriptHistorySensor

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 для настройки отображения столбцов в истории.
jsScriptHistorySensor

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

Действия после измерения перед отправкой данных

Шаблон jsScriptAction отрабатывает непосредственно после измерения, но перед выполнением шаблона jsScriptFinishSend (перед отправкой данных). Является подтверждением выполнения шаблона jsScriptFinishSend.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле jsScriptAction.

Порядок выполнения шаблонов

Шаблон jsScriptAction выполняется в промежутке между измерением и отправкой данных:

1

Измерение

Устройство считывает габариты и вес объекта

2

jsScriptAction

Выполняется проверка/подтверждение данных перед отправкой

3

jsScriptFinishSend

Отправка данных на внешний сервер

Назначение

Подтверждение отправки

Пользователь подтверждает, что данные нужно отправить на сервер.

Контроль ВГХ

Проверка габаритов и веса перед отправкой — возможность скорректировать или отменить.

Визуальный контроль

Отображение данных измерения для визуальной проверки оператором.

Важно: данный шаблон можно использовать для контроля ВГХ перед отправкой данных. Если оператор отменит действие, данные не будут отправлены.
Для передачи данных между шаблонами используйте переменную GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
jsScriptAction

Подтверждение данных

Запрос подтверждения перед отправкой

Шаблон отображает экран с запросом подтверждения перед отправкой данных. Пользователь может подтвердить или отменить отправку.

Пример кода

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

Настройки экрана при отмене отправки.

Экраны

Подтверждение
Подтвердите отправку данных
Отправить данные в WMS?
Отмена
Отправка данных отменена
Совет: изменяйте текст content для отображения нужной информации: данные измерения, штрихкод, номер заказа и т.д.
js_script_auth_mode

Что такое js_script_auth_mode

Настройка режима авторизации устройства

Шаблон js_script_auth_mode определяет режим авторизации доступа к устройству. Позволяет настроить способ аутентификации пользователей и контроль доступа.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле js_script_auth_mode.

Доступные режимы

Режим 1

Работа с устройством с авторизацией (сканирование ШК или QR-бейджа сотрудника) или из гостевого режима без отправки данных в систему.

Режим 2

Работа с устройством исключительно после авторизации (сканирование ШК или QR-бейджа сотрудника). Гостевой режим отключён.

Режим 3

Мультиаккаунт — работа нескольких контрагентов. Экран выбора клиента перед началом работы.

Для передачи данных между шаблонами используйте переменную GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
js_script_auth_mode

Режим 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 для кастомизации.

Настройка режима 1
Настройка режима 1 в веб-интерфейсе
Совет: при выборе «Работа без авторизации» данные не отправляются на сервер — устройство работает автономно.
js_script_auth_mode

Режим 2

Только с авторизацией

Работа с устройством исключительно после авторизации (сканирование ШК или QR-бейджа сотрудника). Гостевой режим отключён.

При входе на устройство необходимо обязательно отсканировать ШК или 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 для настройки времени автоматического выхода.

Настройка режима 2
Настройка режима 2 в веб-интерфейсе
Важно: убедитесь, что сервер авторизации доступен. При недоступности сервера вход на устройство будет невозможен.
js_script_auth_mode

Режим 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.

Настройка режима 3
Настройка режима 3 в веб-интерфейсе
Совет: ID клиентов должны быть уникальными числами. Используйте их для привязки измерений к конкретному клиенту в шаблоне jsScriptFinishSend.
jsScriptScheduler

Что такое jsScriptScheduler

Планировщик задач и автоматическая отправка данных

Шаблон jsScriptScheduler определяет расписание автоматических действий устройства. Позволяет настроить периодическую отправку накопленных данных на внешний сервер по расписанию (cron).

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле jsScriptScheduler.

Для чего нужен

Отправка по расписанию

Автоматическая отправка накопленных измерений на сервер по cron-расписанию.

Накопление данных

Данные измерений собираются в очередь и отправляются пакетом.

Фильтрация

Возможность фильтровать данные перед отправкой.

Интеграция с WMS/ERP

Отправка данных в корпоративные системы учёта.

Как работает

1

Cron-расписание

Указывается время запуска (например, '* * * * *' — каждую минуту).

2

Сбор данных

Шаблон собирает данные измерений через функцию map.

3

Агрегация

Данные объединяются через reduce и фильтруются через filter.

4

Отправка

Пакет данных отправляется на сервер через HTTP-запрос.

Примеры cron-выражений

'* * * * *'

Каждую минуту

'0 * * * *'

Каждый час (в 0 минут)

'0 9 * * *'

Каждый день в 9:00

'0 9 * * 1-5'

Каждый рабочий день в 9:00

Для передачи данных между шаблонами используйте переменную GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
jsScriptScheduler

Автоматическая отправка

Отправка данных по 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

Данные успешно отправлены

Ошибка

Произошла ошибка при отправке

Важно: измените URL-адрес http://192.168.10.251:8000/json/set на адрес вашего сервера.
Совет: для отладки используйте console.log() — данные будут отображаться в консоли устройства.
jsScriptIdle

Что такое jsScriptIdle

Отображение сетевой информации в режиме простоя

Шаблон jsScriptIdle отвечает за вывод сетевой информации о текущем подключении. В режиме простоя на экране устройства отображается IP-адрес для удобства настройки и диагностики.

Шаблон настраивается в личном кабинете устройства во вкладке «Алгоритмы» → поле jsScriptIdle.

Возможности

Отображение IP-адреса

На экране устройства показывается текущий IP-адрес для удобства настройки.

QR-код с IP-адресом

Возможность отображения QR-кода с IP-адресом для быстрого подключения.

Диагностика сети

Удобный способ узнать IP-адрес устройства без дополнительных инструментов.

Для передачи данных между шаблонами используйте переменную GLOBAL_VAR. Она доступна во всех шаблонах и позволяет сохранять и считывать данные без привязки к конкретному шагу.
jsScriptIdle

QR-код

Отображение IP-адреса в виде QR-кода

Шаблон формирует QR-код с IP-адресом устройства. Позволяет быстро отсканировать адрес для подключения к устройству через мобильное приложение или браузер.

Экран ожидания с QR-кодом
Экран ожидания с 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-кода

192.168.1.100
IP-адрес устройства

При сканировании QR-кода пользователь получает IP-адрес устройства для подключения.

end0 — проводная сеть wlan0 — Wi-Fi
Совет: шаблон автоматически определяет тип подключения (проводной или Wi-Fi) и использует соответствующий IP-адрес.