При работе с помарочным учетом (ЕГАИС, Честный Знак) объемы данных в базе 1С могут достигать миллионов записей, а скорость проверки штрихкода на терминале сбора данных (ТСД) должна быть мгновенной. В такой ситуации классический оффлайн-обмен (выгрузка данных на устройство) становится невозможным из-за огромного объема справочников. Рассмотрим наиболее эффективные архитектурные решения и технические приемы для организации онлайн-взаимодействия ТСД с базой 1С.
Проанализируем основные подходы к организации рабочего места оператора ТСД:
ОбработкаВнешнегоСобытия) выполняется на сервере 1С. Однако этот метод требует качественного Wi-Fi покрытия на всей территории склада, так как 1С чувствительна к кратковременным разрывам связи.Когда в таблице более 6 миллионов марок, стандартный поиск по строке может замедляться. Выясним, как ускорить работу на стороне SQL-сервера:
Индексация и хеширование. Поиск по длинной строке (DataMatrix может содержать до 150 символов) всегда медленнее, чем по числу. Рекомендуем хранить штрихкод не только в виде строки, но и вычислять его хеш-сумму (например, CRC32 или числовой идентификатор). Поиск по индексированному числовому полю в SQL выполняется практически мгновенно.
Структура таблиц. Не стоит хранить марки в табличных частях документов или в справочниках с десятками реквизитов. Рассмотрим пример структуры регистра сведений для марочного учета:
// Пример структуры регистра "МарочныйУчет"
// Измерения: ХешКода (Число), Штрихкод (Строка)
// Ресурсы: Статус (Перечисление), Номенклатура (СправочникСсылка)
Функция НайтиМаркуНаСервере(Знач ТекстШтрихкода)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МарочныйУчет.Номенклатура,
| МарочныйУчет.Статус
|ИЗ
| РегистрСведений.МарочныйУчет КАК МарочныйУчет
|ГДЕ
| МарочныйУчет.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", ТекстШтрихкода);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Для обеспечения максимальной скорости и исключения ошибок "двойного сканирования" необходимо отказаться от работы сканера в режиме эмуляции клавиатуры (HID). Вместо этого настроим передачу данных через механизмы Android Intent.
Разберем, как это работает на примере ТСД Zebra. Утилита DataWedge перехватывает луч сканера и отправляет широковещательное сообщение (Broadcast Intent), которое наша программа 1С ловит с помощью внешней компоненты.
Преимущества работы через Intent:
Посмотрим на пример простейшего HTTP-сервиса, который принимает штрихкод от ТСД и возвращает результат верификации. Это обеспечит минимальный оверхед по сравнению с полноценным мобильным клиентом.
// Метод POST в HTTP-сервисе
Функция ПроверитьМарку(Запрос)
ТекстЗапроса = Запрос.ПолучитьТелоКакСтроку();
ДанныеJSON = ЧтениеJSON(ТекстЗапроса); // Парсим входящий код
Штрихкод = ДанныеJSON.barcode;
Результат = ПроверитьВБазе(Штрихкод); // Наша логика проверки
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(ЗаписатьJSON(Результат));
Возврат Ответ;
КонецФункции
На стороне ТСД (если используется мобильная платформа 1С) код вызова будет выглядеть так:
Соединение = Новый HTTPСоединение("192.168.1.10", , "User", "Pass");
Запрос = Новый HTTPЗапрос("/v1/verify");
Запрос.УстановитьТелоИзСтроки("{""barcode"": """ + СканированныйКод + """}");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Проанализируем ситуацию, когда связь на складе нестабильна. Для онлайн-обмена критически важен бесшовный роуминг (802.11r/k/v). Если точки доступа не поддерживают эти протоколы, ТСД будет "подвисать" при перемещении оператора между зонами покрытия, разрывая TCP-сессию.
Если добиться идеального покрытия невозможно, рекомендуем гибридную схему: ТСД подгружает в локальную базу (SQLite или внутреннюю БД мобильной платформы 1С) только хеши марок, ожидаемых в текущем задании (например, марки только из одной накладной на отгрузку). Это позволит выполнять мгновенную проверку локально, синхронизируя результаты с центральной базой раз в несколько минут.
Интересным решением является использование WebView или поля HTML-документа. Вы можете создать интерфейс на JavaScript (используя современные фреймворки типа Vue.js или React), который будет обмениваться данными с 1С. Это позволяет добиться плавной анимации и мгновенного отклика интерфейса, чего иногда сложно достичь на тяжелых управляемых формах мобильной платформы.
Для перехвата событий сканирования в браузере ТСД можно использовать простое прослушивание событий клавиатуры, если сканер работает в режиме HID:
document.addEventListener('keydown', function(event) {
if (event.key === 'Enter') {
// Код полностью считан, отправляем на сервер
verifyBarcode(buffer);
buffer = '';
} else {
buffer += event.key;
}
});
Подведем итоги. Для организации максимально быстрого обмена при больших объемах данных (миллионы марок) оптимальным является использование HTTP-сервисов в связке с легким мобильным приложением. Если разработка должна быть выполнена быстро и только средствами 1С, используйте Мобильный клиент, но уделите особое внимание настройке Wi-Fi и оптимизации SQL-запросов (индексы по хешам). Использование аппаратных возможностей ТСД через Intent позволит сделать работу оператора максимально комфортной и безошибочной.