Как мы подключили складские терминалы к 1С, не открыв базу наружу

Автор: Софтыч

Как мы связали складские Android-терминалы с 1С через собственный шлюз — без прямого доступа к базе снаружи и с работой каждого кладовщика под своим логином.

Название компании не указываем по условиям заключённого с ней договора. Это крупная организация, хорошо известная в России.

С чем пришли. На складах компании кладовщики принимают товар с терминалов сбора данных — защищённых Android-устройств со сканером штрихкода, модель UBX/Urovo DT30. Вся номенклатура, поступления и партии ведутся в 1С:Комплексная автоматизация. До этого терминалы с 1С никак не были связаны: приёмка велась по бумаге или отдельно от учётной системы.

Главное требование заказчика. База 1С не должна быть доступна из интернета ни при каких обстоятельствах — это внутренняя система, и открывать к ней прямой доступ снаружи нельзя. Значит, терминал не может напрямую «достучаться» до базы: нужен посредник, который берёт удар на себя, а сама 1С остаётся полностью закрытой внутри сети предприятия.

Что мы сделали. Три части, которые работают вместе:

  • Приложение на терминале — своё, написанное под конкретную модель устройства. Оно само поднимает защищённый VPN-канал до сервера компании, ещё до того, как кладовщик успевает войти в систему: без канала связи вход просто не начнётся.
  • Промежуточный сервис — тот самый посредник. Это единственное, что видно снаружи; он общается с терминалами с одной стороны и с 1С — с другой, оставаясь внутри защищённого периметра. Работает как обычная служба Windows, которую при обновлении просто перезапускают.
  • Небольшой модуль внутри самой 1С, который отвечает на запросы от посредника — отдаёт данные о товарах и принимает результаты приёмки.

Каждый кладовщик работает под собой, а не под общим логином. Это было отдельным требованием — раньше при подобных интеграциях нередко делают один технический аккаунт на все терминалы, и тогда в 1С не видно, кто именно что сделал. Мы сделали иначе: кладовщик входит по своей карте или паролю, и дальше все действия в 1С фиксируются от его имени, с его собственными правами доступа — то есть если человеку в 1С разрешено не всё, терминал не даст ему обойти это ограничение.

Здесь же ушла заметная часть времени на отладку: 1С устроена так, что тонкости входа по защищённому токену нигде подробно не описаны, и часть поведения — например, в каких единицах система ожидает время действия токена, — пришлось выяснять методом проб. Плюс одна из ошибок 1С называется так, будто дело в закончившихся лицензиях, а на самом деле означает совсем другое — отказ именно по токену входа. Без такого опыта на подобное можно потерять не один день.

Терминал в руках кладовщика — как касса, а не как обычный телефон. С него нельзя случайно выйти в другое приложение, свернуть или закрыть программу приёмки — устройство заблокировано на одной задаче, пока сотрудник не завершит работу и не выйдет из системы сам. У администратора склада ограничений нет: он же управляет тем, какому сотруднику какая карта выдана, и не может случайно передать чужую карту без явного подтверждения.

Сама приёмка — самая сложная часть с инженерной стороны, хотя для кладовщика выглядит просто. Он находит нужную поставку по номеру документа или сканирует штрихкод первой коробки, а дальше просто сканирует короб за коробом. На каждой коробке напечатана этикетка международного стандарта со сведениями о товаре, дате изготовления и партии; на палете — свой код, у которого в 1С и на реальной наклейке разное количество цифр, и мы сделали так, чтобы система сама приводила их к одному виду и не путалась при сверке.

Отдельно продумали то, что не видно на первый взгляд: результаты сканирования не отправляются в 1С по одному — при поставке в сотни коробов это заняло бы недопустимо много времени и просило бы 1С работать на пределе. Вместо этого сканы сначала копятся у посредника, а в 1С уходит уже готовый итог. У этого решения обнаружился приятный побочный эффект: приёмку одной и той же поставки можно начать на одном терминале, а продолжить на другом — например, если сотрудник ушёл на обед, а работу нужно закончить, — или же с ней может работать несколько кладовщиков одновременно, и система сама не даст засчитать одну и ту же коробку дважды, даже если её случайно просканируют повторно.

Отдельная тонкость — то, как считаются количества. Число коробок, которое кладовщик привык видеть на печатной форме документа в 1С, на самом деле нигде в базе не хранится — оно вычисляется на лету надстройкой поверх 1С каждый раз заново. Мы это выяснили и не стали полагаться на это число, а считаем количество коробов сами, напрямую по данным из базы, — иначе на некоторых поставках счёт мог бы просто не сойтись.

Коротко для тех, кому важен стек: Android-приложение на Kotlin и Jetpack Compose, сервер-посредник на Go с собственной базой SQLite, модуль на встроенном языке 1С, защищённое VPN-соединение и токены доступа с индивидуальными правами каждого сотрудника.

Похожие материалы

Comments

Войдите, чтобы оставить комментарий