В процессе поиска простого и удобного решения мы прошли долгий путь. Начался он с генераторов приложений от компании Cipherlab. Затем пробовали "Расширение для карманных компьютеров” от фирмы 1С. Эти варианты не устроили пользователей по удобству работы, либо были какие-то проблемы с обменом данными. Долгое время мы пытались работать с использованием удаленного подключения к терминальному серверу, на котором запускалась 1С с адаптированными для ТСД формами. Но и в этом случае были проблемы: то сканер не подключался или «отваливался», то связь пропадала в каком-либо углу склада.
Когда мне поставили задачу добиться нормального проведения инвентаризации, я решил что пора искать новое решение. Конечно, с появлением ТСД на Android эта задача значительно упрощается, но во многих компаниях еще популярны терминалы на мобильной ОС от Windows. В моем случае это были Cipherlab 9300/9400/9500.
На тот момент были изучены все решения представленные на рынке, но определиться с выбором мне помогла найденная документация для разработчиков (SDK) от компании Cipherlab. Как некоторые уже догадались, было решено написать собственное приложение для терминала. А что из этого вышло, рассмотрим в моей публикации.
Пообщавшись со всеми, пользователи были составлены основные требования к приложению: бесперебойная работа, отображение данных о товарах, возможность отмечать товары, для которых нужно распечатать заново этикетку со штрихкодом, возможность писать произвольные комментарии для товаров, обмен данными с 1С через WI-FI.
Бесперебойная работа была очень важна для всех пользователей, по этой причине я решил отказаться от онлайн-обмена с базой. У нас несколько больших складов, разнесенных по разным этажам. Обеспечить нормальное покрытие сетью в существующей конфигурации очень сложно. А самое главное, что реальной необходимости в ней для наших пользователей не было. Операторам нужен ограниченный объем информации о товарах, который проще выгрузить в терминал и отображать эти сведения из локальной базы. В дальнейшем планировалось реализовать онлайн обмен с базой через SOAP-сервисы (поддержки HTTP - сервисов в 1С тогда еще не было). Для хранения данных на терминале было решено использовать MS SQL Compact Edition. Для реализации обмена с учетной системой я решил не привязываться к конкретной базе 1С. Была добавлена промежуточная база MySQL в которую можно выгружать данные о товарах из любой базы в организации. Рассматривались и другие варианты СУБД, но этот оказался самым простым в реализации. Промежуточная база позволила упростить доработку функционала в 1С: из базы загружаются все просканированные штрихкоды используя типовой механизм работы работы с торговым оборудованием. А в промежуточной базе можно всегда посмотреть всю историю сканирования или загрузить данные повторно. Как оказалось, это удобный функционал, который несколько раз спасал наших кладовщиков от повторного сбора данных.
Интерфейс мобильного приложения
Приложение создавалось максимально простым, чтобы в нем могли разобраться пользователи с любым уровнем подготовки. Основные формы приложения адаптированны под сенсорный ввод. Для открытия приложения открываем exe файл.
При первом запуске необходимо задать настройки подключения к базе данных. Для этого заходим в меню "Файл - Настройки". На вкладке "Обмен" задаются настойки подключения к промежуточной базе MYSQL.
На закладке "Настройки" можно задать настройки по умолчанию. "Показывать проверенные товары" - если флаг не установлен, то товары которые полностью проверены будут скрываться из списка. Если установить флаг "Вопрос при сохранении новых товаров" то, при сканировании штрихкода, которого нет в базе пользователю будет задан вопрос о необходимости сохранения этого штрихкода. На вкладке "Служебные" можно очистить локальную базу ТСД.
На главном экране всего 3 кнопки: Сбор данных, Обмен данными и Выход.
Обмен данными предназначен для загрузки / выгрузки данных в промежуточную базу. Чтобы не объяснять кладовщикам как проверить подключение к сети на форме были добавлены проверки подключения Wi-FI и доступности сервера.
Выбор документа для загрузки осуществляется по его номеру. Я специально не стал разделять документы по отдельным операциям. Пользователям неважно какой документ проверяется: они просто сканируют товар из нужной секции склада или в зоне приемки. Первая буква номера документа - префикс, определяющий тип документа: I - инвентаризация, P - поступление.... При нормальной работе у пользователя в списке всего один или два выгруженных из 1С документа. Ему не надо долго искать в списках нужный документ для начала проверки.
В мобильную базу загружаются данные о номенклатуре, количестве товара в документе. В строке проверено в скобках указывается количество товара которое уже проверено в документе инвентаризация. Если товар по штрихкоду не найден, то пользователю будет выдан вопрос о необходимости сохранения этого товара (Эту функцию можно отключить в настройках).
Можно проверять товары из одного документа в несколько этапов или делать промежуточные выгрузки/загрузки, например в конце рабочего дня. Также можно выполнять сбор данных одного документа с нескольких терминалов одновременно.
Форма "Сбор данных" - основная форма в которой происходит работа пользователя. Верхняя часть отведена под информацию о текущем товаре и действия пользователя. Там отображается отсканированный штрихкод, артикул товара, цена, количество и наименование товара. Нижнюю часть занимает список товаров текущего документа. Под списком отображается последний отсканированый штрихкод.
По умолчанию в списке отображаются товары которые еще не проверены или проверены не полностью. Товары, для которых фактическое количество полностью совпало с учетным скрываются из списка. Остаются только те, которые осталось обработать или по которым есть расхождения. Чтобы в списке отображать все товары необходимо нажать кнопку "Действия - Показывать все товары".
Если отсканировано товара больше чем есть в документе, то пользователю будет выдан звуковой сигнал. Для незарегистрированных штрихкодов добавляется новая строка с этим кодом.
Для товара можно вводить дополнительную информацию. Иконка штрихкода на форме обозначает количество этикеток, которые необходимо распечатать для этого товара. Кликнув не нее можно добавить одну этикетку для печати. В меню "Действия - Стикер для печати" можно увеличить или уменьшить количество необходимых стикеров. Через меню Действия также можно ввести произвольный комментарий для товара, который будет выгружен в 1С. Кладовщики очень просили добавить эту функцию чтобы отмечать позиции на которые надо обратить внимание после окончания проверки. При появлении фокуса на поле ввода автоматически открывается экранная клавиатура.
Напротив полей "Штрихкод" и "Проверено" предусмотрены кнопки для ручного ввода значений. Эта возможность добавлена для ручного ввода товаров у которых не считываются этикетки.
После проверки всех товаров пользователь заходит в форму обмен данными выгружает данные в промежуточную базу.
Реализация в 1С
Данный функционал будет работать в типовых конфигурациях на обычных формах: УТ, УПП, Розница. Обработка была протестирована на УТ 10.3.11.4 и УПП 1.3.117.1. Платформа 8.3.15.1700.
Вся логика работы в 1С была реализована в обработке подключаемого оборудования для терминалов сбора данных. В настройках подключения торгового оборудования добавляем новую обработку из каталога “PC/MyCipherLabPDT.epf”. После прописываем настройки подключения к БД (Подробнее см в разделе "Установка и настройка").
Для начала проведения сбора данных необходимо создать документ, заполнить его и выгрузить данные в промежуточную базу. Для удобства работы пользователей я немного изменил логику работы с ТСД. Все действия с терминалом выполняются из единой формы, которая вызывается при выборе пункта меню "Заполнить - Заполнить из терминала сбора данных".
Главная форма обработки сделана в виде помощника с подсказками для пользователей. На ней пользователь выбирает что нужно сделать ему: выгрузить/загрузить данные или посмотреть какие товары были отсканированы ТСД.
Перед выгрузкой данных пользователь может проверить какие данные будут выгружены в промежуточную базу.
После выгрузки пользователю выводится небольшая "напоминалка" с его дальнейшими действиями для начала сбора данных.
В обработке реализована возможность загрузки данных со всех терминалов, с которых производился сбор данных по текущему документу. Также можно загрузить данные с выбранного терминала.
При загрузке данных добавлена возможность печати этикеток, отмеченных при проведении инвентаризации. Используется стандартная обработка для печати этикеток конфигурации.
В 1С открываем созданный ранее документ инвентаризации и выполняем загрузку данных. Поиск товара производится по отсканированному штрихкоду товара. Если был отсканирован товар, которого не было в документе, он будет добавлен в документ.
Установка и настройка
1. Создание промежуточной базы данных MYSQL
Перед настройкой мобильного приложения и 1С необходимо создать промежуточную базу данных. Для работы используется СУБД MySQL. Выбор СУБД позволяет использовать в качестве сервера обычное сетевое хранилище (NAS), виртуальных хостинг или настроить MySQL-сервер на любом компьютере.
Подключаемся к серверу MYSQL и импортируем дамп базы из файла “DB/MYSQL_BASE_DUMP.sql”.
Создаем нового пользователя для доступа к базе и записываем его логин/пароль. Он потребуется при дальнейшей настройке.
2. Настройка в 1С
Для обмена данными на компьютере должен быть установлен MYSQL ODBC драйвер. Требований к версии драйвера нет, у меня успешно работали версии начиная с 5.1.11 и выше. Драйвер ставим той же разрядности что и 1С. В форме настройки параметров ТСД добавлена возможность выбора версии драйвера. В ее параметрах прописываем данные для подключения к базе MYSQL.
При установленном флаге "Очищать данные ТСД после загрузки" после успешной загрузки данные текущего документа будут отмечены как проверенные и больше не будут отображаться в списке выбора документа для загрузки на ТСД.
3. Установка приложения на ТСД
Для работы приложения на ТСД Cipherlab потребуется установить .NET Compact Framework v 3.5 и Microsoft SQL Server Compact Edition. Все необходимые пакеты есть в каталоге Cipherlab приложенного архива. Для установки пакета необходимо скопировать его на ТСД и запустить исполняемый файл.
Пакеты не требуют отдельных лицензий и настроек. Они готовы к работе сразу после установки.
Приложение для инвентаризации находится в каталоге Inventory. Можно скопировать его в любой каталог на ТСД и запустить файл InventoryApp.exe.
После настройки и установки необходимых пакетов не забываем делать резервное копирование с указанием копии как autorestore.
Под "капотом"
В этом разделе поговорим о структуре промежуточной базы и используемых технологиях. Промежуточная база содержит 3 таблицы:
- Таблица товаров документа
- Таблица штрихкодов товаров
- Таблица настроек терминалов ТСД
У нас в базе для одного товара может быть задано несколько штрихкодов. Поэтому в мобильную базу выгружаются все. При выгрузке из 1С таблицы заполняются только данными текущего документа. Документ не обязательно должен быть «Инвентаризация». Выгрузка может производиться из любого документа. Для выполнения запросов к базе из 1С используется COM-объект ADODB.Connection. Я не стал привязываться к внешнему источнику данных чтобы все запросы хранились в обработке обслуживания торгового оборудования. В нее можно быстро внести изменения без обновления базы.
Мобильное приложение написано на ASP.NET. Для обмена используется MySQL Connector для Dotnet. Обмен с промежуточной базой данных реализован с использованием хранимых процедур. Они позволяют быстро внести изменение в запросы без необходимости компиляции и обновления приложения на всех ТСД. Хранимые процедуры используются только в мобильном приложении. В 1С все запросы описаны в обработке ТО.
Функция |
Назначение |
GetBarcodes |
Возвращает штрихкоды номенклатуры |
GetBarcodesCount |
Возвращает количество штрихкодов номенклатуры |
GetDocumentsList |
Возвращает список документов для сбора данных |
GetScanData |
Возвращает данные документа для сбора данных |
GetScanDataCount |
Возвращает количество записей документа |
GetTerminalSettings |
Получает настройки терминала |
InsertScanData |
Добавляет новую запись в таблицу документов |
InsertTerminalSettings |
Записывает текущие настройки терминала в базу данных |
SettingsLoaded |
Проверяет необходимость обновления настроек терминала из промежуточной базы |
UpdateScanData |
Обновляет запись строки документа в промежуточной базе |
UpdateTerminalSettings |
Обновляет настройки терминала в промежуточной базе |
В приложении была добавлена возможность обновления настроек терминала. Настройки задаются для конкретного терминала по его серийному номеру. Перед выполнением обмена данными терминал проверяет необходимость обновления настроек. Если в таблице установлен флаг NeedLoading, то терминал загрузит новые настройки в локальную базу данных.
Поддержка пользователей
Для более удобной поддержки пользователей на терминалы сбора данных был установлен сервер удаленного доступа. Какое-то время работали с CERemoteServer. Его главный минус в том что он работает только со своим клиентом. Найденный случайно VNC-сервер для Windows CE - EfonVNC заменил CERemoteServer и используется в настоящее время.
Очень удобный пакет, который предоставляет доступ по протоколу VNC. Подключение возможно с любого VNC-клиента. Выглядит все это следующим образом:
Этот пакет был добавлен в автозагрузку всех терминалов. А чтобы не возиться с настройкой ip-адресов на ТСД мы прописали статические IP на сервере DHCP.
Итоги
Признаюсь, что это не первая версия приложения. В процессе разработки и тестирования приходилось вносить изменения. Но результат этого стоил. Приложение полностью устроило всех пользователей как по функционалу, так и по удобству использования. Для меня это сказалось на полном отсутствии проблем в проведении инвентаризации, а пользователи получили удобный инструмент для выполнения своих обязанностей. А самое главное для меня: был получен опыт в создании мобильных приложений на ASP.NET и возможность самостоятельного расширения приложения под любые «хотелки» пользователей.