Примеры разработки на Mobile SMARTS
Как вывести название отсканированого товара на экран
Мы сделали сканирование. А как теперь сделать, чтобы было видно, что за штрихкод мы отсканировали?
Все «визуальные» действия системы (те действия, которые имеют пользовательский интерфейс для взаимодействия с пользователем) имеют возможности по настройке своего внешнего вида и выводу сопроводительных текстов для пользователя.
Обычно требуется выводить не только какой-то статический текст, например, «Отсканируйте штрихкод», но и доп. информацию о документе и выполняемых действиях. Например, в действии ввода количества после сканирования разумно было бы показать: какой штрихкод был отсканирован, какой товар был по нему найден, в какой упаковке.
Напомним, что все необходимые данные лежат у нас в сессии, и остается только отобразить их. Для этого в Mobile SMARTS сделан механизм шаблонов. Вместо статического текста мы можем использовать текст с «шаблонами» - вставками в текст, которые будут заменены на конкреные значения из сессии. Такие вставки обрамляются фигурными скобками {…}, между которыми пишется путь к необходимым значениям в сессии. Такой путь может быть простым, состоящим просто из имени объекта, либо составным, ссылающимся на данные внутри объекта.
{ScannedBarcode} – действие выбора номенклатуры заносит в эту переменную отсканированный штрихкод (либо введенный вручную штрихкод, код или артикул).
SelectedProduct – действие выбора номенклатуры заносит в эту переменную товар, который был распознан по штрихкоду (коду, артикулу) или выбран пользователем.
{SelectedProduct.Product.Name} – название товара, который был отсканирован или выбран вручную.
В редакторе текстов в панели управления встроена помощь по шаблонам, куда внесены наиболее часто используемые варианты:
Теперь перейдем к нашей задаче. Как и было предложено, отобразим в действии ввода количества данные об отсканированном штрихкоде и выбранном при этом товаре.
Для этого в действии «Ввод количества» отредактируем свойство «текст в верхней части окна».
Добавим следующую надпись: «{ScannedBarcode} - {SelectedProduct.Product.Name}». Это означает что после операции сканирования в верхней части окна будет отображаться непосредственно сам отсканированный штрихкод и через «тире» наименование найденного товара. В редакторе и на ТСД выглядеть это будет следующим образом:
![]() | ![]() |
Отлично, действие ввода количества отображает необходимый нам текст.
Теперь перейдем назад, к действию выбора номенклатуры. После того, как мы вводим количество и данные записываются в документ, наш процесс опять возвращается к выбору номенклатуры, и было бы удобно, если бы он отображал информацию по последней сканированной позиции и введенному нами количеству.
Для этого в заполним в выборе номенклатуры свойство «текст в верхней части окна».
Тут мы зададим следующий шаблон:
{SelectedProduct.Product.Name\}
<r color=”blue”>{SelectedProduct.QuantityString:Сканировано (0)\}</r>
Результат на терминале будет выглядеть так:
Обратите внимание, что мы применили две дополнительных возможности отображения информации.
Во-первых, это псевдо-html тэги для визуального оформления текста (описание возможных тэгов можно посмотреть в документации к платформе, либо прямо в панели управления). Мы указали, чтобы информация о количества отображалась синим цветом.
Во-вторых, форма тирование: запись вида {путь_к_данным:формат_отображения}. SelectedProduct.QuantityString – это путь по которому можно получить текстовое представление количества вместе с именем упаковки внутри SelectedProduct (например, «3 шт.»). Сканировано (0) – это формат отображения этих данных, т.е. вместо «3 шт.» - будет отображаться «Сканировано 3 шт.» (запись (0) указывает, куда должны быть вставлены исходные данные).
Зачем это надо? Ведь мы можем просто написать...
Сканировано {SelectedProduct.QuantityString\}
...и получить тот же результат на экране?
Потому что разница есть. Она видна при первом заходе в документ, когда еще не было сделано ни одного сканирования товара, и объект SelectedProductеще ни разу не был выставлен в сессии. Если объект в сессии не найден, то шаблон в фигурных скобках будет иметь пустое значение, и на его месте просто ничего не отобразится. А вот статический тест прекрасно отобразится!
Поэтому в варианте с форматированием {SelectedProduct.QuantityString: Сканировано (0)}, если товара нет, ничего не отобразится. А в варианте Сканировано {SelectedProduct.QuantityString} останется отдельно висящее слово «Сканировано»:
Использование форматов позволяет избегать таких ситуаций.
Как завершить сканирование и выйти в главное меню
Наша нарисованная операция пока не предусматривает каких-то меню и «встроенных в операцию» возможностей выйти из документа. Если при установке программы на терминал Вы выбрали режим работы с наличием главного меню, то можно завершить документ через него.
Если меню вы запретили, то из такого документа выйти будет невозможно. Можно лишь полностью перегрузить терминал.
Чтобы избежать этого, необходимо к действию «Выбор номенклатуры» добавить обработчик (в меню по правой клавише), в котором нужно указать клавишу и переход. Назначим на клавишу “esc” возврат в главное меню.
Как сделать меню внутри операции
Очень часто в рамках операции требуется делать различного вида меню. Это могут быть «главные» меню, куда выносятся общие операции: переход к с канированию, просмотр уже набранного товара, переключения каких-нибудь режимов работы операции, временный выход из документа или полное завершение документа. Иногда требуются и различные подменю, или вопрос к пользователю с несколькими вариантами выбора. Для реализации такого функционала в Mobile SMARTS используется действие «Меню».
Рассмотрим на простом примере. Сделаем главное меню операции с тремя действиями: переход к сканированию, приостановка работы (выход в главное меню без завершения документа), Завершение (завершение документа и выход в главное меню).
В панели управления нужно добавить действие «Меню», в котором мы можем создать нужные пункты. При создании пункта меню необходимо задать его название и указать переход: имя действия, куда перейдет выполнение процесса при выборе данного пункта. Если имя действия для перехода оставить пустым, то переход будет происходить на следующее в процессе действие.
| Название | Переход |
| Начать/продолжить | Выбор товара |
| Приостановить | abort |
| Завершить | return |
В данном меню мы также используем два встроенных ключевых слова: abort – выход из документа БЕЗ его завершения, return – выход из документа, при этом он помечается как завершенный.
В названиях кнопок можно использовать такие же шаблоны, что и при задании текстов в прочих действиях, это позволяет выводить на кнопки нестатическую информацию, или выделять текст цветом или размером – например <b>Завершить</b> выделит надпись жирным шрифтом.
На каждой кнопке автоматически добавляется цифра для быстрого выбора: по ее нажатию на физической клавиатуре будет происходить выбор соответствующего пункта.
Для перехода в главное меню из процесса сканирования в действии выбора номенклатуры необходимо добавить обработчик клавиши «Esc» с переходом на действие меню.
Как сделать просмотр списка товаров
Для этой цели лучше всего использовать действие «Просмотр записей». Оно предназначено для просмотра различных табличных данных в Mobile SMARTS: строк документа, строк дополнительных таблиц и т.п.
Добавим в нашу конфигурацию указанное действие и дадим ему имя «просмотр», чтобы можно было сделать переход на него из главного меню.
Действие просмотра позволяет задать отображаемую информацию многими путями:
- Можно просто указать какую табличную часть документа будет отображать действие (свойства «Отображать содержимое
DeclaredItems»/«Отображать содержимоеCurrentItems»); - Можно указать переменную в сессии, в которой хранятся отображаемые данные (свойство «Отображаемые строки»). Такой способ может применяться если ранее в процессе данные из документа или таблицы как-то сортировались, фильтровались или являются результатом работы другого действия и хранятся в сессии;
- Можно задать запрос-выборку прямо в самом действии с помощью свойства запрос.
Варианты указаны в порядке возрастания приоритета.
Для нашего первого действия просмотра мы будем использовать самый простой вариант: укажем, что нам необходимо отображать содержимое CurrentItems, табличную часть со строками документа, куда попадают все наши сканированные товары.
После того как мы указали источник, откуда брать данные, необходимо задать формат их отображения. Действие позволяет это, как в простом виде (свойство «Формат вывода»), так и в виде нескольких колонок (свойство «Колонки»). Вариантом с колонками мы и воспользуемся.
Добавляем две колонки.
Интересующим нас полем будет – «Формат ячейки». Оно позволяет задать непосредственно отображаемую информацию. Для этого используются все те же шаблоны. Для указания текущей отображаемой строки используется имя Item.
Сделаем пример таким образом, чтобы в первой колонке отображалось имя сканированного объекта — {Item.Product.Name}, а во второй фактическое количество с единицей измерения - {Item.CurrentQuantityString}. Задаем также выравнивание текста, цвет фона и ширину. Ширину колонки можно задавать как в процентах «%» так и в пикселях «px». Удобнее и правильнее задавать ее именно в процентах, так как если данная конфигурация используется на терминалах сбора данных с разным разрешением экрана, то колонки будут отображаться всегда в верном соотношении.
На ТСД итог выглядит так:
После настройки колонок не забудем указать свойство «следующее действие», чтобы после просмотра строк возвращаться назад, в меню.
Как сделать ввод дополнительных данных
Как сделать, чтобы после сканирования позиции товара можно было ввести для позиции дополнительные данные, например, серийный номер или срок годности.
Задача добавить в строку документа или в его шапку какие-то дополнительные данные, серийные номера, сроки годности, наименование контрагентов и т.д., возникает постоянно. Многие часто используемые поля в документе и его строках заведены в системе заранее. Кроме этого, мы можем добавить в шапку или строку документа любое количество дополнительных полей.
Так мы и поступим в данном случае, добавив в строку поле «СерийныйНомер».
Как мы уже выяснили ранее, после сканирования и нахождения товара, в сессии формируется объект SelectedProduct, который служит промежуточной порцией текущих данных до их занесения в документ в виде строки документа.
Соответственно, после того как мы завели дополнительное поле строки, оно автоматич ески стало нам доступно в SelectedProduct по шаблону {SelectedProduct.СерийныйНомер}.
Для его визуальной правки, как нам требуется в поставленной задаче, используется специальное действие «Редактирование поля».
В свойствах этого действия укажем:
- Имя редактируемого поля (собственно наш СерийныйНомер);
- Источник данных (позволяет указать, что мы редактируем: поле шапки, строки или просто переменную в сессии);
- Запомнить прошлое значение (нужно выбрать «нет», так как вряд ли серийные номера разных сканирований могут совпадать, поэтому такое запоминание не понадобится).
Так же можно добавить произвольный текст в самом окне или в верхней части окна, используя шаблоны описанные нами ранее.
Все, редактирование дополнительного серийного номера готово.
Действие будет изменять значение поля {SelectedProduct.СерийныйНомер}, которое в дальнейшем при занесении в документ попадет в доп. поле строки документа.
Теперь мы можем поправить действие просмотра записей, так чтобы видеть заданные нами серийные номера, задав соответствующий шаблондля колонки:
{Item.Product.Name}{Item.СерийныйНомер: (0)}
Сделать редактирование срока годности еще проще. Такое поле уже заведено в строке документа Mobile SMARTS по-умолчанию: ExpiredDate. Поэтому достаточно просто добавить и настроить действие редактирования.
Как добавить сканирование ячейки
У нас склад с ячеистым хранением, как мне сделать выбор ячейки, куда я кладу/беру товар?
Следует начать с того, что понятия складов, ячеек и палет (контейнеров) встроены в Mobile SMARTS и могут настраиваться прямо из панели управления (хотя, при необходимости, можно сделать и выгрузку из внешней системы). Соответственно, для начала работы с ячейками следует определить их в системе.
Первым делом создается склад. Следует учитывать что понятие склада подразумевает физически разнесенные, никак не связанные между собой склады. Если для пользователя разрешено несколько складов, то при входе в программу ему будет предложено выбрать текущий, и он сможет работать только в его рамках, сканировать только его ячейки и получать документы, связанные только с ним.
Далее, внутри каждого склада необходимо завести ячейки. Ячейка может быть одиночной, иметь собственное наименование и штрихкод, как это показано на рисунке для «Зоны приемки» с фиксированным штрихкодом «555666777».
Система также позволяет завест и шаблон ячеек. Такая возможность позволяет задать сразу большую группу ячеек и метод формирования названий и штрихкодов для них. Для примера заведем ячейку с шаблоном штрихкода следующего вида – 99{Ряд:2}{Номер:2}{Этаж:1}.
- 99 – начало любого штрихкода ячейки в данном примере.
{Ряд:2}– порядковый номер ряда который содержит две цифры.{Номер:2}– номер который содержит две цифры.{Этаж:1}– этаж который содержит одну цифру.
Штрихкод 9912542, означает: 99 – общее начало, 12 – ряд, номер – 54, этаж – 2. При этом, согласно шаблону имени, отображаемое название ячейки будет «12-54-2». Задание штрихкодов палет (в системе называются контейнеры) аналогично заданию ячеек.
Пример шаблона штрихкода палеты 98{номер:8} – данные штрихкоды начинаются с цифр 98, а далее содержатся еще 8 цифр порядкового номера.
В каждой строке документа заранее заведены 3 поля для хранения информации о палете и ячейках.
- SSCC – используется для хранения палеты;
- FirstStorage (откуда) и SecondStorage (куда) – для указания ячеек.
Обычно этих трех полей достаточно для любых операций с товаром на складе.
Например, для размещения товара в ячейке будет использоваться только FirstStorage; если в ячейку мы размещаем палеты, то SSCC и FirstStorage. Перемещение товара из ячейки в ячейку задействует у нас FirstStorage и SecondStorage, а если хотим переместить между ячейками палету, то будем использовать все три поля.
Для сканирования штрихкодов ячеек и палет в конфигурации необходимо использовать действия «Выбор ячейки» и «Выбор палеты» соответственно, с указанием в них хранилища, куда будет заноситься результат.
Действие выбора ячейки или палеты может стоять в дереве операции как ДО, так и ПОСЛЕ сканирования товара. В обоих случаях оно успешно попадет в объект SelectedProduct. Это происходит потому, что действия выбора ячейки и палеты не просто проставляют отсканированные объекты в текущий выбранный продукт, а заносят данные о сканировании непосредственно в общую сессию процесса (под именами {[FirstStorage](/key-variables)}, {[SecondStorage](/key-variables)} и {SSCCPallet}), откуда действие сканирования товара берет их при каждом сканировании.
Из этого следует, что выбранная ячейка не «сбросится» автоматически при переходе к следующему сканированию товара. Если это необходимо, то следует делать это вручную, с помощью действия «Очистка данных».
На терминале выбор ячейки будет выглядеть так:

