Перейти к основному содержимому
Версия: 4.0

Примеры разработки на 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: строк документа, строк дополнительных таблиц и т.п.

Добавим в нашу конфигурацию указанное действие и дадим ему имя «просмотр», чтобы можно было сделать переход на него из главного меню.

Действие просмотра позволяет задать отображаемую информацию многими путями:

  1. Можно просто указать какую табличную часть документа будет отображать действие (свойства «Отображать содержимое DeclaredItems»/«Отображать содержимое CurrentItems»);
  2. Можно указать переменную в сессии, в которой хранятся отображаемые данные (свойство «Отображаемые строки»). Такой способ может применяться если ранее в процессе данные из документа или таблицы как-то сортировались, фильтровались или являются результатом работы другого действия и хранятся в сессии;
  3. Можно задать запрос-выборку прямо в самом действии с помощью свойства запрос.

Варианты указаны в порядке возрастания приоритета.

Для нашего первого действия просмотра мы будем использовать самый простой вариант: укажем, что нам необходимо отображать содержимое 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}), откуда действие сканирования товара берет их при каждом сканировании.

Из этого следует, что выбранная ячейка не «сбросится» автоматически при переходе к следующему сканированию товара. Если это необходимо, то следует делать это вручную, с помощью действия «Очистка данных».

панель управления

На терминале выбор ячейки будет выглядеть так:

панель управления

Как закрыть полную палету и перейти к следующей​

Хочу реализовать такую операцию: пользователь сканирует штрихкод на палете и начинает наполнять ее поступившим товаром, как только палета заполнена он без лишних действий сканирует следующую палету и приступает к ее наполнению. Можно это как-то сделать?

Понятно, чтобы реализовать такую работу действие сканирования товара должно отличать, что отсканирована палета, а не товар. И оно это умеет. В панели управления, для действия сканирования товара найдите секцию свойств «Ячейки и палеты». В ней следует указать, что мы разрешаем выбирать сканированием палету. В качестве переменной хранилища укажите «SSCCPallet». Кроме того, необходимо задать переход действия на само себя, чтобы после выбора палеты тут же вернуться к сканированию товара.

панель управления

А как мне при такой операции лучше всего отобразить информацию о текущей выбранной палете?

Лучше всего в данном случае подойдут строки подвала, настройка которых есть в панели управления. Эти строки с информацией, которая должна размещаться внизу экрана, под основным пространством действия. Удобнее всего их применять как раз для отображения таких данных, как текущая выбранная ячейка, или, например, текущий режим сканирования (если вы реализуете их несколько в рамках своей операции).

панель управления

Задание такой строки приведет к следующему результату:

панель управления

Как добавить поле, значение которого выбирается из списка​

Тема: урок посвящён выбору значений из списка.

Содержание: показана возможность предоставления пользователю возможности выбора из списка (добавление колонок рассмотрено в уроке «Добавление колонки в документ»).

Рекомендуется к прочтению:

Материалы к уроку:

Демооперация, использованная в уроке. Для добавления в свою конфигурацию нужно выполнить следующие действия:

  1. Скопировать приведённый текст в буфер обмена (Ctrl + C);
  2. Открыть Панель управления Мобильные СМАРТС;
  3. Выбрать узел «Типы документов» , вставить содержимое буфера (Ctrl + V).

После выполнения этой последовательности в конфигурации появится операция «Демооперация».

<DocumentType alias="Демооперация" allowRemoveDocuments="True" askWarehouseBeforeDocumentSelection="False" autoCreateNewDocument="False" autoOpenSigleDocument="False" autoStartNewDocumentCreation="False" autoStartNewDocumentCreationForEmptyList="False" barcodeDocumentSelection="True" checkServerBarcodes="True" clientCreating="True" cyclic="False" defaultMainButtonHeight="26" documentSelectionText="" fullscreen="False" inaccessibleForDocumentAbsence="False" input="False" itemFormat="" manualDocumentSelection="True" manualExit="False" name="Демооперация" output="False" refreshTimeForServerList="0" removeAfterFinish="False" removingDelay="0" runDataExchangeOnDocumentCompleted="True" showDeclaredQuantities="False" showDocumentsFromServerInList="False" showFinishedServerDocuments="False" showInProcessServerDocuments="False" virtual="False" writeChangeInfoToDocument="False"> <Actions capacity="8"> <QuestionAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" defaultButtonHeight="0" fullscreen="Inherit" id="312adc9c-00e5-4888-a924-d92ee3ea39f8" indent="0" name="Главное меню" nextDirection="" transactionNotch="True" welcomeText=""> <ButtonDirections capacity="4"> <String>Сканирование</String> <String>Просмотр строк</String> <String>abort</String> <String>return</String> </ButtonDirections> <ButtonTexts capacity="4"> <String>Начать/продолжить</String> <String>Просмотр строк</String> <String>Временно выйти</String> <String>Завершить</String> </ButtonTexts> <KeyJumps capacity="0" /> </QuestionAction> <ScanAction autoCloseTime="0" autoSelectSingleProduct="True" autoShowSelectionList="False" backgroundImage="" barcodeConvertion="ToUpper" barcodeSessionVariable="ScannedBarcode" breakPoint="False" cancelType="None" canManualShowProductList="True" canSelectCell="False" canSelectPallet="False" cellDirection="" errorSelectDirection="Товар не найден" fullscreen="Inherit" headerText="(esc) - выход в меню" id="bfb485eb-726b-41ee-8058-4483ab7d9398" ignoreBaseBarcodes="False" ignoreQuantityPolicy="False" indent="0" name="Сканирование" nextDirection="" notFoundErrorText="товар не найден" palletDirection="" playAudioOnError="True" processSessionBarcode="False" productsListHeaderText="" quickSelectProduct="False" searchingProducts="" searchPreviousSelected="False" selectionCellNum="0" selectionCellText="" selectionFirstCellText="" selectionListFormat="" selectionPalletText="" selectionSecondCellText="" selectionStorageVariable="" sucsessSelectDirection="Запись в документ" transactionNotch="True" useOnlyDocumentProducts="False" waitImage="" welcomeText="Отсканируйте штрихкод товара:" withoutControls="False"> <ExcludeClassificators capacity="0" /> <IncludeClassificators capacity="0" /> <KeyJumps capacity="4"> <KeyToAction action="Главное меню" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <TreeTypeIds capacity="0" /> </ScanAction> <AcceptInDocumentAction breakPoint="False" checkDocumentInfill="False" checkQuantity="False" combineEqualCurrentItems="False" declaredExpression="" errorQuantityMessage="Товара больше, чем разрешает документ." id="a0876cca-eeb9-4277-b529-a33b18bc93b8" ignoreFieldsInDocument="False" indent="0" name="Запись в документ" nextDirection="" noProductErrorDirection="" noProductInDocumentMessage="Такой товар отсутствует в документе." onlyInCurrentItems="False" quantityErrorDirection="" useSelectedLine="False"> <ComparingFieldNames capacity="0" /> <ComparingFieldNamesForCurrentItems capacity="0" /> </AcceptInDocumentAction> <ItemsViewAction id="e7673503-3f3e-4052-9f49-5af26cab8d66" name="Просмотр строк" nextDirection="Сканирование" headerText="(esc) - выход в меню &#xA;(enter) - перейти к сканированию" transactionNotch="True" cancelType="None" backgroundImage="" format="" selectedItem="" viewItems="" welcomeText="Товары:"> <KeyJumps capacity="4"> <KeyToAction action="Главное меню" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <Columns capacity="4"> <ItemsColumn align="TopLeft" allBorder="0" backColor="White" bottomBorder="0" format="{Item.Product.Name}" leftBorder="0" rightBorder="0" title="Название" topBorder="0" width="100%" /> </Columns> <Query copySelection="False" documentLines="Declared" whereExpression=""> <Fields capacity="0" /> <GroupBy capacity="0" /> <SortBy capacity="0" /> <Where capacity="0" /> </Query> </ItemsViewAction> <QuestionYesNoAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" fullscreen="Inherit" id="fa1b0032-ea5e-4877-8743-0499044a7ff5" indent="0" message="Товар не найден. Повторить сканирование?" name="Товар не найден" nextDirection="" noDirection="Главное меню" transactionNotch="True" yesDirection="Сканирование"> <KeyJumps capacity="0" /> </QuestionYesNoAction> </Actions> <Columns capacity="4"> <FieldInfo eanAI="None" fieldName="Брак" fieldType="String" valueTemplate="" /> </Columns> <Errors capacity="0" /> <Fields capacity="0" /> <InfoStrings capacity="0" /> <Tables capacity="0" /> </DocumentType>

Как показать количество документов на кнопке​

Задача: отобразить на кнопке операции количество документов, которые находятся на сервере Mobile SMARTS и доступны для работы на ТСД.

Как это выглядит в меню приложения:

панель управления

Реализация:

Воспользоваться этим способом можно только если если вы работаете с офлайн-базой Mobile SMARTS (при этом документы должны быть выгружены на устройство на имя конкретного пользователя). При работе в режиме онлайн использовать данную настройку не рекомендуется.

Доработка реализована на примере продукта «Склад 15», но применима и для других типовых продуктов «Клеверенса».

Откройте панель управления для нужной базы продукта и нажмите на его название. В окне «Свойства» откроются общие настройки конфигурации, среди которых выберите «Показывать количество серверных документов на кнопке» и установите значение «Да».

панель управления

Сохраните внесенные изменения конфигурации и нажмите на кнопку «Обмен с сервером» в приложении на устройстве. После этого возле каждого названия операции будет указано количество серверных документов, которые можно открыть (кроме тех, для которых документов нет).

На кнопке отображаются только серверные документы, ни разу не открывавшиеся на ТСД.

Как добавить колонку в документ​

Разработка в Mobile SMARTS: добавление колонки в документ
4 марта 2014 г.

Тема: урок посвящён добавлению дополнительной колонки в документ, создаваемый на терминале сбора данных.

Содержание: показана возможность заведения своих колонок на примере создания операции, результатом работы которой будет нестандартный документ заказа клиента. Добавление колонок «Цена» и «Сумма» рассматривается в другом уроке.

Рекомендуется к прочтению:

Материалы к уроку:

демооперация, использованная в уроке. Для добавления в свою конфигурацию нужно выполнить следующие действия:

  1. Скопировать приведённый текст в буфер обмена (Ctrl+C).
  2. Открыть Панель управления Mobile SMARTS.
  3. Выбрать узел «Типы документов», вставить содержимое буфера (Ctrl+V).

После выполнения этой последовательности в конфигурации появится операция «Демооперация».

<DocumentType alias="Демооперация" allowRemoveDocuments="True" askWarehouseBeforeDocumentSelection="False" autoCreateNewDocument="False" autoOpenSigleDocument="False" autoStartNewDocumentCreation="False" autoStartNewDocumentCreationForEmptyList="False" barcodeDocumentSelection="True" checkServerBarcodes="True" clientCreating="True" cyclic="False" defaultMainButtonHeight="26" documentSelectionText="" fullscreen="False" inaccessibleForDocumentAbsence="False" input="False" itemFormat="" manualDocumentSelection="True" manualExit="False" name="Демооперация" output="False" refreshTimeForServerList="0" removeAfterFinish="False" removingDelay="0" runDataExchangeOnDocumentCompleted="True" showDeclaredQuantities="False" showDocumentsFromServerInList="False" showFinishedServerDocuments="False" showInProcessServerDocuments="False" virtual="False" writeChangeInfoToDocument="False"> <Actions capacity="8"> <QuestionAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" defaultButtonHeight="0" fullscreen="Inherit" id="312adc9c-00e5-4888-a924-d92ee3ea39f8" indent="0" name="Главное меню" nextDirection="" transactionNotch="True" welcomeText=""> <ButtonDirections capacity="4"> <String>Сканирование</String> <String>Просмотр строк</String> <String>abort</String> <String>return</String> </ButtonDirections> <ButtonTexts capacity="4"> <String>Начать/продолжить</String> <String>Просмотр набранных строк</String> <String>Временно выйти</String> <String>Завершить</String> </ButtonTexts> <KeyJumps capacity="0" /> </QuestionAction> <ScanAction autoCloseTime="0" autoSelectSingleProduct="True" autoShowSelectionList="False" backgroundImage="" barcodeConvertion="ToUpper" barcodeSessionVariable="ScannedBarcode" breakPoint="False" cancelType="None" canManualShowProductList="True" canSelectCell="False" canSelectPallet="False" cellDirection="" errorSelectDirection="Товар не найден" fullscreen="Inherit" headerText="(esc) - выход в меню" id="bfb485eb-726b-41ee-8058-4483ab7d9398" ignoreBaseBarcodes="False" ignoreQuantityPolicy="False" indent="0" name="Сканирование" nextDirection="" notFoundErrorText="товар не найден" palletDirection="" playAudioOnError="True" processSessionBarcode="False" productsListHeaderText="" quickSelectProduct="False" searchingProducts="" searchPreviousSelected="False" selectionCellNum="0" selectionCellText="" selectionFirstCellText="" selectionListFormat="" selectionPalletText="" selectionSecondCellText="" selectionStorageVariable="" sucsessSelectDirection="Ввод количества" transactionNotch="True" useOnlyDocumentProducts="False" waitImage="" welcomeText="Отсканируйте штрихкод товара:" withoutControls="False"> <ExcludeClassificators capacity="0" /> <IncludeClassificators capacity="0" /> <KeyJumps capacity="4"> <KeyToAction action="Главное меню" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <TreeTypeIds capacity="0" /> </ScanAction> <SimpleQuantityAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" fullscreen="Inherit" headerText="(esc) - назад&#xA;&lt;r color=&quot;blue&quot;&gt;{SelectedProduct.Product.Name}&lt;/r&gt;&#xA;&lt;r color=&quot;green&quot;&gt;Набрано: {SelectedProduct.Product.CurrentQuantity}&lt;/r&gt;&#xA;&#xA;" id="5b940bca-1bff-45ed-bf7e-632bc44b7c26" indent="0" name="Ввод количества" nextDirection="" transactionNotch="True"> <KeyJumps capacity="4"> <KeyToAction action="undo" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> </SimpleQuantityAction> <AcceptInDocumentAction breakPoint="False" checkDocumentInfill="False" checkQuantity="False" combineEqualCurrentItems="False" declaredExpression="" errorQuantityMessage="Товара больше, чем разрешает документ." id="a0876cca-eeb9-4277-b529-a33b18bc93b8" ignoreFieldsInDocument="False" indent="0" name="Запись в документ" nextDirection="" noProductErrorDirection="" noProductInDocumentMessage="Такой товар отсутствует в документе." onlyInCurrentItems="False" quantityErrorDirection="" useSelectedLine="False"> <ComparingFieldNames capacity="0" /> <ComparingFieldNamesForCurrentItems capacity="0" /> </AcceptInDocumentAction> <ItemsViewAction id="e7673503-3f3e-4052-9f49-5af26cab8d66" name="Просмотр строк" nextDirection="Сканирование" headerText="(esc) - выход в меню&#xA;(enter) - перейти к сканированию" transactionNotch="True" cancelType="None" backgroundImage="" format="" selectedItem="" viewItems="" welcomeText="Товары:"> <KeyJumps capacity="4"> <KeyToAction action="Главное меню" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <Columns capacity="4"> <ItemsColumn align="TopLeft" allBorder="0" backColor="White" bottomBorder="0" format="{Item.Product.Name}" leftBorder="0" rightBorder="0" title="Название" topBorder="0" width="100%" /> <ItemsColumn align="TopRight" allBorder="0" backColor="White" bottomBorder="0" format="{Item.Product.CurrentQuantity}" leftBorder="0" rightBorder="0" title="Набрано" topBorder="0" width="40%" /> </Columns> <Query copySelection="False" documentLines="Declared" whereExpression=""> <Fields capacity="0" /> <GroupBy capacity="0" /> <SortBy capacity="0" /> <Where capacity="0" /> </Query> </ItemsViewAction> <QuestionYesNoAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" fullscreen="Inherit" id="fa1b0032-ea5e-4877-8743-0499044a7ff5" indent="0" message="Товар не найден. Повторить сканирование?" name="Товар не найден" nextDirection="" noDirection="Главное меню" transactionNotch="True" yesDirection="Сканирование"> <KeyJumps capacity="0" /> </QuestionYesNoAction> </Actions> <Columns capacity="0" /> <Errors capacity="0" /> <Fields capacity="0" /> <InfoStrings capacity="0" /> <Tables capacity="0" /> </DocumentType>

Как добавить вычислимую колонку в документ​

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

Содержание: показана возможность заведения вычислимых колонок на примере создания операции, результатом работы которой будет документ заказа клиента. Добавление колонок, не требующих автоматического вычисления, рассмотрено в уроке «Добавление колонки в документ».

Рекомендуется к прочтению:

Материалы к уроку:

демооперация, использованная в уроке. Для добавления в свою конфигурацию нужно выполнить следующие действия:

  1. Скопировать приведённый текст в буфер обмена (Ctrl+C);
  2. Открыть Панель управления Mobile SMARTS;
  3. Выбрать узел «Типы документов», вставить содержимое буфера (Ctrl+V).

После выполнения этой последовательности в конфигурации появится операция «Демооперация».

<DocumentType alias="Демооперация" allowRemoveDocuments="True" askWarehouseBeforeDocumentSelection="False" autoCreateNewDocument="False" autoOpenSigleDocument="False" autoStartNewDocumentCreation="False" autoStartNewDocumentCreationForEmptyList="False" barcodeDocumentSelection="True" checkServerBarcodes="True" clientCreating="True" cyclic="False" defaultMainButtonHeight="26" documentSelectionText="" fullscreen="False" inaccessibleForDocumentAbsence="False" input="False" itemFormat="" manualDocumentSelection="True" manualExit="False" name="Демооперация" output="False" refreshTimeForServerList="0" removeAfterFinish="False" removingDelay="0" runDataExchangeOnDocumentCompleted="True" showDeclaredQuantities="False" showDocumentsFromServerInList="False" showFinishedServerDocuments="False" showInProcessServerDocuments="False" virtual="False" writeChangeInfoToDocument="False"> <Actions capacity="8"> <QuestionAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" defaultButtonHeight="0" fullscreen="Inherit" id="312adc9c-00e5-4888-a924-d92ee3ea39f8" indent="0" name="Главное меню" nextDirection="" transactionNotch="True" welcomeText=""> <ButtonDirections capacity="4"> <String>Сканирование</String> <String>Просмотр строк</String> <String>abort</String> <String>return</String> </ButtonDirections> <ButtonTexts capacity="4"> <String>Начать/продолжить</String> <String>Просмотр строк</String> <String>Временно выйти</String> <String>Завершить</String> </ButtonTexts> <KeyJumps capacity="0" /> </QuestionAction> <ScanAction autoCloseTime="0" autoSelectSingleProduct="True" autoShowSelectionList="False" backgroundImage="" barcodeConvertion="ToUpper" barcodeSessionVariable="ScannedBarcode" breakPoint="False" cancelType="None" canManualShowProductList="True" canSelectCell="False" canSelectPallet="False" cellDirection="" errorSelectDirection="Товар не найден" fullscreen="Inherit" headerText="(esc) - выход в меню" id="bfb485eb-726b-41ee-8058-4483ab7d9398" ignoreBaseBarcodes="False" ignoreQuantityPolicy="False" indent="0" name="Сканирование" nextDirection="" notFoundErrorText="товар не найден" palletDirection="" playAudioOnError="True" processSessionBarcode="False" productsListHeaderText="" quickSelectProduct="False" searchingProducts="" searchPreviousSelected="False" selectionCellNum="0" selectionCellText="" selectionFirstCellText="" selectionListFormat="" selectionPalletText="" selectionSecondCellText="" selectionStorageVariable="" sucsessSelectDirection="Ввод количества" transactionNotch="True" useOnlyDocumentProducts="False" waitImage="" welcomeText="Отсканируйте штрихкод товара:" withoutControls="False"> <ExcludeClassificators capacity="0" /> <IncludeClassificators capacity="0" /> <KeyJumps capacity="4"> <KeyToAction action="Главное меню" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <TreeTypeIds capacity="0" /> </ScanAction> <SimpleQuantityAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" fullscreen="Inherit" headerText="(esc) - назад&#xA;&lt;r color=&quot;blue&quot;&gt;{SelectedProduct.Product.Name}&lt;/r&gt;&#xA;&lt;r color=&quot;green&quot;&gt;Набрано: {SelectedProduct.Product.CurrentQuantity}&lt;/r&gt;&#xA;&#xA;" id="5b940bca-1bff-45ed-bf7e-632bc44b7c26" indent="0" name="Ввод количества" nextDirection="" transactionNotch="True"> <KeyJumps capacity="4"> <KeyToAction action="undo" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> </SimpleQuantityAction> <FieldEditAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" eanAI="None" editType="DocumentColumn" fieldName="Цена" format="" fullscreen="Inherit" headerText="(esc) - назад&#xA;&lt;r color=&quot;blue&quot;&gt;{SelectedProduct.Product.Name}&lt;/r&gt;" id="a01a43bf-04ed-4e01-932f-d9acf0c567af" indent="0" listItemFormat="" nextDirection="" rememberPreviousValue="True" setForBuffer="False" showEditBox="True" showList="False" sizeType="Normal" transactionNotch="True" viewItems="" welcomeText="Введите цену:"> <Columns capacity="0" /> <KeyJumps capacity="4"> <KeyToAction action="undo" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <Query copySelection="False" documentLines="Declared" whereExpression=""> <Fields capacity="0" /> <GroupBy capacity="0" /> <SortBy capacity="0" /> <Where capacity="0" /> </Query> </FieldEditAction> <AcceptInDocumentAction breakPoint="False" checkDocumentInfill="False" checkQuantity="False" combineEqualCurrentItems="False" declaredExpression="" errorQuantityMessage="Товара больше, чем разрешает документ." id="a0876cca-eeb9-4277-b529-a33b18bc93b8" ignoreFieldsInDocument="False" indent="0" name="Запись в документ" nextDirection="" noProductErrorDirection="" noProductInDocumentMessage="Такой товар отсутствует в документе." onlyInCurrentItems="False" quantityErrorDirection="" useSelectedLine="False"> <ComparingFieldNames capacity="0" /> <ComparingFieldNamesForCurrentItems capacity="0" /> </AcceptInDocumentAction> <ItemsViewAction id="e7673503-3f3e-4052-9f49-5af26cab8d66" name="Просмотр строк" nextDirection="Сканирование" headerText="(esc) - выход в меню &#xA;(enter) - перейти к сканированию" transactionNotch="True" cancelType="None" backgroundImage="" format="" selectedItem="" viewItems="" welcomeText="Товары:"> <KeyJumps capacity="4"> <KeyToAction action="Главное меню" barcode="" condition="" key="Escape" modifiers="None" /> </KeyJumps> <Columns capacity="4"> <ItemsColumn align="TopLeft" allBorder="0" backColor="White" bottomBorder="0" format="{Item.Product.Name}" leftBorder="0" rightBorder="0" title="Название" topBorder="0" width="100%" /> <ItemsColumn align="TopCenter" allBorder="0" backColor="White" bottomBorder="0" format="{Item.Product.CurrentQuantity}" leftBorder="0" rightBorder="0" title="Набрано" topBorder="0" width="30%" /> <ItemsColumn align="TopCenter" allBorder="0" backColor="White" bottomBorder="0" format="{Item.Цена}" leftBorder="0" rightBorder="0" title="Цена" topBorder="0" width="20%" /> </Columns> <Query copySelection="False" documentLines="Declared" whereExpression=""> <Fields capacity="0" /> <GroupBy capacity="0" /> <SortBy capacity="0" /> <Where capacity="0" /> </Query> </ItemsViewAction> <QuestionYesNoAction autoCloseTime="0" backgroundImage="" breakPoint="False" cancelType="None" fullscreen="Inherit" id="fa1b0032-ea5e-4877-8743-0499044a7ff5" indent="0" message="Товар не найден. Повторить сканирование?" name="Товар не найден" nextDirection="" noDirection="Главное меню" transactionNotch="True" yesDirection="Сканирование"> <KeyJumps capacity="0" /> </QuestionYesNoAction> </Actions> <Columns capacity="4"> <FieldInfo eanAI="None" fieldName="Цена" fieldType="Double" valueTemplate="" /> </Columns> <Errors capacity="0" /> <Fields capacity="0" /> <InfoStrings capacity="0" /> <Tables capacity="0" /> </DocumentType>

Контроль времени выполнения операций на ТСД​

Во многих случая оказывается полезным знать время выполнения кладовщиком тех или иных операций на терминале сбора данных.

В .NET нет отдельных типов данных для времени или для даты, а есть один общий для даты и времени (DateTime).

Для хранения времени следует добавить в документ соответствующие колонки. Документ в Mobile SMARTS по умолчанию содержит две табличные части одинакового формата. Каждая табличная часть состоит из строк, соответственно колонки называются полями строки документа. Любая дата или время сканированной позиции будет являться дополнительным полем строки и иметь тип DateTime (т.е. дата и время).

Добавление дополнительного поля строки:

панель управления

Изменение имени добавленного поля:

панель управления панель управления

Смена типа поля на DateTime:

панель управления

Получить текущее время на терминале сбора данных можно при помощи шаблона {CurrentDate}. Для того, чтобы время попало в документ, нужно скопировать его в созданное дополнительное поле ВремяСканирования.

Действие «Выбор номенклатуры», обязательное к использованию, заполняет переменную сессии SelectedProduct, она необходима для занесения строки в документ. В этой переменной содержится своеобразный «проект» новой строки (включая добавленное поле ВремяСканирования). Именно туда и следует заносить время, чтобы затем при записи новой строки в документ, время оказалось в этой новой строке.

панель управления

При этом следует всегда помнить, что в документе окажется не время занесения строки в документ, а время выполнения вот этой вот операции присваивания.

Пример разработки реальной складской операции​

Рассмотрим простейший пример создания операции для процесса поступления товара на склад, целиком исполняемого одним сотрудником.

Итак, необходимо выполнить при помощи мобильного устройства сбора данных следующие операции:

  1. Выгрузка товара из транспортного средства.
  2. Проверка по накладной.
  3. Расфасовка по палетам.
  4. Ввод данных о каждой палете.
  5. Размещение в места постоянного хранения.

Необходимо создать один тип документа Mobile SMARTS и настроить алгоритм его обработки. Алгоритм обработки будет определять порядок действий сотрудника при выполнении документов типа «Поступление».

Составление плана работы

Продемонстрируем составление плана работы на простом примере для операции поступления товара. Требуется составить небольшой план того, как сотрудник будет пользоваться ТСД, обрабатывая поступление.

Рассмотрим такой план по шагам. Допустим, выгрузка товара начинается с ввода номера пломбы на воротах транспортного средства. Итак, первое, что должен увидеть человек, – окно ввода номера пломбы (1). Теперь необходимо сверить товар по накладной с реальностью и с данными заявки и затем расфасовать приход по палетам. Будем рассматривать вариант, когда товар пришел навалом, и вся передняя стенка заставлена коробками. Необходимо взять свободный поддон и набрать на него коробок одноименного товара. Допустим, коробки обматываются пленкой. Теперь на сцену выходит штриховое кодирование, а именно рулон заранее распечатанных этикеток палет.

Клеить заранее распечатанные безымянные этикетки намного быстрее, чем печатать более информативные этикетки по ходу приемки. Сотрудник берет готовый рулон и клеит по одной этикетке на каждый палет.

Наступило время ввода данных. Необходимо сканировать этикетку и ввести данные о коробках. Итак, третье – сканирование штрихкода палеты. Четвертое – ввод номенклатуры товара (сканирование штрихкода коробки или выбор товара из списка). Пятое – ввод количества. Данные введены и нужно переходить к следующей палете, т.е. на шаг 3. А если не нужно больше палет? Для этого шестое – спросить, пора ли уже заканчивать приемку.

Реализация плана работы в виде схемы обработки документа

Теперь, когда у нас есть план работы сотрудника с мобильным терминалом, его необходимо переложить на язык схемы обработки, понятный Mobile SMARTS. Рассмотрим пример создания такой схемы «с нуля». По шагам:

  1. Добавление новой базы данных Mobile SMARTS.

  2. Добавляем в узел «Документы» новый тип документа и переименовываем его в «Поступление» (сразу, по F2 или через свойство «Отображаемое имя»):

    панель управления

    Свойства, значения которых не равны значениям по умолчанию (т.е. требующие изменения), выделены.

  3. Добавить новое поле «Номер пломбы» в шапку документа с типом данных String:

    панель управления
  4. Последовательно наполняем узел «Действия» следующим набором:

    • Редактирование поля:

      панель управления
    • Выбор палеты:

      панель управления

    Один-единственный флажок «Да» позволяет включить проверку соответствия прихода накладной.

    • Выбор номенклатуры:

      панель управления

    Добавляем возможность вернуться к выбору палеты по нажатию Esc.

    • Ввод количества:

      панель управления
    • Запись данных в документ:

      панель управл�ения
  5. Вопрос будет выполнен в виде меню:

    панель управления
  6. Добавляем кнопки:

    панель управления
  7. В выпадающем списке напротив «Завершить поступление» выберем встроенное действие «Завершить документ».

  8. В списке выбора нет перехода на сканирование товара. Чтобы он там появился, дать задать действию выбора номенклатуры конкретное имя:

    панель управления

    Это имя может быть использовано для переходов на наше действие выбора номенклатуры.

  9. Теперь необходимо снова вернуться в диалог настройки списка кнопок меню и выбрать переход на «Сканирование товара» из выпадающего списка:

    панель управления

    Таким же образом следует поступить с пунктом меню «Новая палета».

  10. Добавляем имя, по которому можно обратиться к действию выбора палеты:

п�анель управления
  1. И назначаем переход по этому имени для кнопки новой палеты:
панель управления

Алгоритм готов, осталось завести шаблоны штрихкодов палет.

Настройка штрихкодов палет

На шаге 3 нашего простейшего примера происходит сканирование штрихкода палеты. Каким образом терминал определяет, что это именно палета, а не что-то другое? За идентификацию палет ответственен узел «Штрихкоды контейнеров» панели управления. В нем регистрируются общие шаблоны, под которые должны подходить использующиеся этикетки палет. Подробнее в статье Добавление контейнеров и палет.

Для простейшего примера достаточно зарегистрировать один-единственный шаблон палеты примерно такого вида: «палетой считается любой штрихкод, который начинается с цифр “98” и дальше любые 6 символов».

Добавляем штрихкод контейнера:

панель управления

И задаём для него шаблон штрихкода:

панель управления

Результат

Для проведения тестирования, в конфигурации обязательно должны быть заведены склады, пользователи и палеты! Также должен быть выгружен справочник товаров. Для теста также потребуется документ накладной на поступление с заполненными ожидаемыми строками поступления (или сгенерируйте тестовый документ).

В результате мы должны получить на терминале следующую операцию:

панель управления панель управления панель управления панель управления панель управления панель управления панель управления панель управления панель управления панель управления панель управления