При внедрении мобильных рабочих мест на складе или производстве часто возникает жесткое требование: основная конфигурация 1С:ERP должна оставаться на полной поддержке. Изменять типовой код конфигурации категорически нельзя, чтобы не усложнять последующие обновления системы. При этом перед разработчиком стоит задача реализовать мобильное приложение для ТСД (терминалов сбора данных) или смартфонов, которое позволит кладовщику по штрихкоду мгновенно получать актуальную информацию о товаре: его остаток, склад, ячейку хранения, характеристики и другие реквизиты.
В этой статье мы подробно проанализируем различные архитектурные подходы к решению этой задачи, разберем их плюсы и минусы, а также посмотрим на конкретные технические примеры реализации интеграции без изменения конфигурации ERP.
Вводные данные задачи следующие: база 1С:ERP, около 2500–3000 активных позиций номенклатуры (с дополнительными свойствами и реквизитами), адресное хранение (склады и ячейки). Требуется обеспечить быстрый вывод информации о товаре при сканировании штрихкода.
В ходе обсуждения участники форума пришли к выводу, что объем данных в 2500 позиций — это крайне малый объем для современных мобильных устройств и платформы 1С. Однако ключевой вопрос заключается в архитектуре взаимодействия мобильного клиента/приложения и центральной базы 1С:ERP. Нам необходимо передавать данные оперативно, не перегружая мобильное устройство и не внося изменений в метаданные основной конфигурации.
Рассмотрим четыре основных технических подхода к реализации данной задачи.
В исходном запросе автор планировал создавать отдельное «Мобильное приложение» (автономную базу данных на мобильном устройстве с синхронизацией). Однако для задачи оперативного получения остатков и ячеек хранения автономный режим (офлайн) малоэффективен. Остатки на адресных складах ERP меняются непрерывно. Выгруженная даже полчаса назад информация о ячейках и свободных остатках быстро теряет актуальность.
Оптимальным решением здесь выступает Мобильный клиент 1С:
Если специфика работы склада требует наличия автономного мобильного приложения (например, при слабом покрытии Wi-Fi), нам потребуется механизм передачи данных. Лучшим современным решением для интеграции мобильного приложения с 1С:ERP является использование собственного HTTP-сервиса, созданного внутри расширения.
Вопреки старым заблуждениям, платформа 1С:Предприятие полностью поддерживает создание и публикацию HTTP-сервисов и Web-сервисов внутри расширений конфигурации. Это позволяет передавать данные в легком и быстром формате JSON.
Разберем алгоритм взаимодействия по шагам:
ШтрихкодыНоменклатуры и остаткам товаров, после чего формирует ответ в формате JSON.Проанализируем пример кода для HTTP-сервиса в расширении 1С:ERP, который обрабатывает запрос штрихкода и возвращает данные о товаре и его остатках:
Функция ПолучитьДанныеПоШтрихкоду(Запрос)
Штрихкод = Запрос.ПараметрыЗапроса.Получить("barcode");
Если Не ЗначениеЗаполнено(Штрихкод) Тогда
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоИзСтроки("Не указан штрихкод в параметрах запроса");
Возврат Ответ;
КонецЕсли;
// Выполняем поиск номенклатуры и остатков по штрихкоду
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Штрихкоды.Номенклатура КАК Номенклатура,
| Штрихкоды.Номенклатура.Наименование КАК Наименование,
| Штрихкоды.Номенклатура.Код КАК Код,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток,
| ЕСТЬNULL(ТоварыВЯчейкахОстатки.Ячейка.Код, ""Не указана"") КАК Ячейка
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
| ПО Штрихкоды.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВЯчейках.Остатки КАК ТоварыВЯчейкахОстатки
| ПО Штрихкоды.Номенклатура = ТоварыВЯчейкахОстатки.Номенклатура
|ГДЕ
| Штрихкоды.Штрихкод = &Штрихкод";
ЗапросКБД.УстановитьПараметр("Штрихкод", Штрихкод);
Выборка = ЗапросКБД.Выполнить().Выбрать();
ДанныеТовара = Новый Структура;
Если Выборка.Следующий() Тогда
ДанныеТовара.Вставить("Success", Истина);
ДанныеТовара.Вставить("Name", Выборка.Наименование);
ДанныеТовара.Вставить("Code", Выборка.Код);
ДанныеТовара.Вставить("Stock", Выборка.Остаток);
ДанныеТовара.Вставить("Cell", Выборка.Ячейка);
Иначе
ДанныеТовара.Вставить("Success", Ложь);
ДанныеТовара.Вставить("Message", "Товар не найден");
EndIf;
// Сериализуем данные в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеТовара);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Выясним, как решить задачу вообще без написания кода на стороне 1С:ERP и без использования расширений. Для этого идеально подходит стандартный программный интерфейс OData, предоставляемый платформой 1С из коробки.
Для активации этого механизма достаточно выполнить несколько простых действий:
Номенклатура и регистру ШтрихкодыНоменклатуры с помощью метода ПолучитьСоставСтандартногоИнтерфейсаOData()).После публикации мобильное приложение сможет выполнять прямые HTTP-запросы к базе ERP. Например, для поиска номенклатуры по штрихкоду мобильное приложение выполняет GET-запрос к регистру сведений штрихкодов:
http://[АдресСервера]/[ИмяБазы]/odata/standard.odata/InformationRegister_ШтрихкодыНоменклатуры?$filter=Штрихкод eq '1234567890123'&$format=json
Платформа 1С мгновенно вернет JSON-пакет, содержащий ссылку (GUID) найденной номенклатуры. Вторым быстрым запросом к виртуальной таблице остатков мобильное приложение получает информацию по складам и ячейкам. Этот способ полностью безопасен для обновлений ERP, так как использует штатный функционал платформы.
Если на складе отсутствует стабильное беспроводное подключение к сети, придется использовать полноценное мобильное приложение с собственной локальной базой данных СУБД SQLite (или мобильной версией 1С). Чтобы синхронизировать 2500 позиций номенклатуры, нам понадобится механизм регистрации изменений — План обмена.
Начиная с последних версий платформы 1С:Предприятие 8.3, разработчики получили возможность создавать собственные Планы обмена внутри расширений конфигурации. Это ключевой момент, который позволяет не снимать ERP с поддержки.
Разберем схему реализации офлайн-синхронизации:
_МОбменМобильныеУстройства).Номенклатура, ХарактеристикиНоменклатуры, регистр сведений ШтрихкодыНоменклатуры.При проектировании мобильного приложения важно правильно выбрать способ считывания штрихкодов. Рассмотрим два основных сценария работы под управлением ОС Android:
1. Использование встроенной камеры смартфона. Если приложение запускается на обычных смартфонах сотрудников, считывание штрихкода производится программно через камеру устройства с помощью стандартных средств мобильной платформы 1С:
&НаКлиенте
Процедура СчитатьШтрихкодКамерой()
#Если МобильноеПриложениеКлиент Тогда
Если СредстваМультимедиа.ПоддерживаетсяСканированиеШтрихкодов() Тогда
СредстваМультимедиа.ПоказатьСканированиеШтрихкодов("Отсканируйте штрихкод товара",
Новый ОписаниеОповещения("ОбработкаСканированияЗавершение", ЭтотОбъект));
Иначе
ПоказатьПредупреждение(,"Сканирование штрихкодов не поддерживается на данном устройстве.");
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаСканированияЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат.ИмяСобытия = "Сканирование" Тогда
Штрихкод = Результат.Значение;
// Отправляем штрихкод на сервер ERP для получения остатков
ПолучитьДанныеТовараССервера(Штрихкод);
КонецЕсли;
КонецПроцедуры
2. Аппаратный сканер ТСД (Broadcast Intent). Для профессиональных терминалов сбора данных использование камеры неэффективно и неудобно. На ТСД сканирование настраивается через перехват системных Android-событий (Intents) от встроенного лазерного или светодиодного сканера. Для интеграции в 1С используется внешняя компонента, например, входящая в состав БСП (Библиотеки стандартных подсистем) — Драйвер1СУстройствоВводаNative. При нажатии физической кнопки сканирования на корпусе ТСД данные штрихкода мгновенно передаются в предопределенную процедуру формы ВнешнееСобытие(), что обеспечивает максимальную скорость работы кладовщика.
Проанализировав все технические возможности интеграции мобильного приложения с 1С:ERP без изменения типовой конфигурации, можно дать следующие рекомендации разработчикам: