В Mobile SMARTS существует специальный механизм обмена данными с внешними системами в режиме онлайн из программы мобильного терминала – так называемые коннекторы.
При помощи коннекторов можно решить целый ряд весьма полезных задач, например:
- Получение реальных остатков по сканированной номенклатуре;
- Уточнение цен онлайн;
- Отправка набранных заказов с проверкой наличия и других условий;
- Подбор в ячейках, перемещение паллет и коробок с немедленной фиксацией изменений в учетной системе.
Для каждой учетной системы коннектор разрабатывается отдельно и особенности его работы зависят от реализации. Система Mobile SMARTS предъявляет к коннекторам только общие требования — они явно сформулированы в программном интерфейсе, который должен реализовать любой из них (подробнее о разработке собственных коннекторов и о программном интерфейсе к ним см. «Ошибка! Неверная ссылка закладки.»).
Вызов внешних систем с терминала сбора данных (ТСД) происходит не напрямую, а через посредничество сервера Mobile SMARTS.
Данные для отправки во внешнюю систему формируются в клиенте Mobile SMARTS на ТСД и затем передаются серверу Mobile SMARTS с указанием, какой коннектор и для чего использовать.
Коннектор указывается по имени, оно задается разработчиком или администратором при добавлении коннектора в общий список коннекторов в панели управления Mobile SMARTS. А «для чего использовать» указывается именами класса и метода во внешней системе. Что понимается под этими классом и методом, вообще говоря, определяется самим коннектором. Например, коннекторы к 1С позволяют вызывать экспортные функции и процедуры глобального контекста или контекста внешнего соединения, при этом класс не используется, а метод задает имя вызываемого метода или процедуры. Коннектор для Axapta использует и имя класса, и имя метода для вызова публичного статического метода указанного класса. Коннектор для Microsoft SQL Server не использует ни имени класса, ни имени метода, вместо этого он ожидает в передаваемых параметрах параметр query, который должен содержать SQL-запрос.
Конкретно обращение ко внешней системе с передачей и получением каких-то полезных данных происходит следующим образом:
- В клиенте Mobile SMARTS на ТСД действие « » формирует аргументы для вызова внешней системы, упаковывает их в объект Cleverence.Warehouse.InvokeArgs и отправляет на сервер Mobile SMARTS вместе именем коннектора, именем класса и именем метода;
- Сервер Mobile SMARTS ищет коннектор с требуемым именем в списке зарегистрированных и передает ему аргументы вместе с именем класса и метода для вызова;
- Коннектор осуществляет вызов указанного метода внешней системы и получает результат;
- Результат возвращается серверу Mobile SMARTS, упаковывается в объект Cleverence.Warehouse.InvokeResult и отправляется на ТСД;
- В клиенте Mobile SMARTS на ТСД действие « » кладет полученный результат в текущую сессию под именем, которое задано у него в свойстве «Переменная сессии для результата»;
- Теперь любое другое действие в программе на ТСД может получить доступ к результату вызова для вывода его на экран или выполнения расчетов.
Регистрация коннектора к внешней системе
Экземпляры коннекторов к внешним системам регистрируются в специальном узле дерева конфигурации в панели управления Mobile SMARTS:
Можно добавить несколько коннекторов с разными именами для подключения к нескольким базам данных одной и той же учетной системы. Свойство «Идентификатор» задает имя коннектора, которое требуется указать на ТСД при вызове внешней системы.
Файлы библиотек DLL, обеспечивающие работу стандартных коннекторов, по умолчанию не подключены к серверу и не загружаются им. При сохранении конфигурации на сервер может появиться ошибка вида «XmlSerializationException: Error serializing ServerEvents.xml. ‘Connectors’ cannot have …» – это означает, что добавленный коннектор зарегистрирован в панели управления, но соответствующие ему системные библиотеки (DLL) не найдены в папке bin на сервере Mobile SMARTS. Скорее всего они лежат в папке Connectors сервера, но не были скопированы в папку bin.
После добавления в список, копирования всех DLL и сохранения конфигурации на сервер Mobile SMARTS регистрация успешно завершена.
Запуск и остановка коннекторов
Все зарегистрированные коннекторы имеют два независимых друг от друга флажка «Разрешен/Запрещен» и «Остановлен/Запущен». Флаг «Разрешен/Запрещен» управляет возможностью обращения к коннектору с ТСД. Флаг «Остановлен/Запущен» определяет, загружены ли в память сервера компоненты подключения к внешней системе и установлено ли соединение.
Например, коннектор 1С 7.7 в режиме «Запущен» поднимает в память процесс «1cv7s.exe», который виден в менеджере задач операционной системы и обеспечивает работу OLE-компоненты доступа к 1С. Коннекторы для 1С 8 и Axapta работают внутри процесса сервера Mobile SMARTS «Cleverence.Warehouse.Server.exe» и выдают себя только увеличением занятой оперативной памяти.
Если коннектор разрешен, то он запускается при первом же обращении к нему (с ТСД или вручную). Поэтому если нужно загасить все подключения и гарантированно запретить запуск любых внешних подключений к системе, например для запуска 1С в монопольном режиме, следует не только остановить коннектор в панели управления, но и запретить его запуск (перевести в состояние «Запрещен»).
После регистрации коннектора следует проверить, выполняется ли подключение. Для этого следует разрешить доступ к коннектору, и затем запустить его:
В большинстве случаев попытка запуска завершится неудачей, т.к. у сервера Mobile SMARTS не будет хватать пользовательских прав на подключение ко внешней системе. По умолчанию сервер Mobile SMARTS запускается как служба Windows от имени Локальной системы (Local System). Под операционными системами Windows XP/2000/2003 этого достаточно для всех задач, кроме обращения к сетевым ресурсам (например, к базе данных SQL в сети или к сетевому принтеру). Под операционными системами Windows Vista и Windows 7 права Локальной системы ограничены до уровня обычного пользователя, ввиду чего многое будет запрещено.
В версиях Windows XP Home и Windows Vista Home работа с коннекторами на сервере Mobile SMARTS будет возможна только в том случае, если вызываемые внешние системы сами установлены на том же персональном компьютере, что и сервер Mobile SMARTS.
Для выхода из ситуации самым простым и самым неправильным будет дать серверу права администратора машины или домена – это следует максимально избегать. Самым правильным будет завести для сервера Mobile SMARTS отдельного доменного либо локального пользователя. Этому пользователю следует по очереди назначать требуемые права путем включения его в различные группы пользователей.
Для разрешения создавать OLE и COM объекты сетевых версий 1С или Axapta Business Connector созданного нового пользователя следует включить в группу «Пользователи DCOM» (Distributed COM Users). Для обращения к базам Microsoft SQL Server пользователя сервера Mobile SMARTS следует включить в группу «SQLServerUser$<MACHINE>» (или «SQLServerUser2005$<MACHINE>», «SQLServerUser2008$<MACHINE>»).
Другие ошибки при запуске коннекторов, такие как неверно заданные пути подключения, ошибки прав доступа к файлам и т.д., отображаются в диалоговых окнах с описанием на смеси английского и русского языков, при этом все возникшие проблемы с детальным описанием попадают в файл server_errors.log на сервере Mobile SMARTS.
Примечание: Очень часто в решении проблемы помогает поиск в интернете по тексту, выдаваемому в качестве текста ошибки.
Поддержка коннекторов в самой внешней системе
Когда оператор терминала сбора данных сканирует штрихкод для запроса остатков товара, со стороны внешней системы (учетной системы, товарной базы) кто-то должен обработать этот запрос и вернуть результат. В случае 1С это будет метод глобального контекста или контекста внешнего соединения, для Axapta это будет публичный статический метод в каком-то классе, а в случае SQL базы данных это может быть хранимая процедура (хотя можно выполнить и простой запрос).
Для отладки работы кода внешней системы, который должен будет вызываться с ТСД, в панели управления Mobile SMARTS предусмотрено специальное окно, вызываемое из контекстного меню коннектора:
В этом окне можно задать имя вызываемого метода внешней системы, указать передаваемые параметры, вызвать внешнюю систему при помощи коннектора и посмотреть на результат.
Как видно, коннектору передаются именованные параметры. Метод внешней системы, который будет принимать эти параметры, может получить их в двух вариантах, в зависимости от реализации коннектора. Первый вариант – будет учитываться только порядок передачи параметров, а имена не имеют значения и отбрасываются. Второй вариант – метод принимает единственный строковой аргумент, в котором передается XML с сериализованным объектом Cleverence.Warehosue.InvokeArgs; это выглядит примерно как «<?xml version=»1.0″ encoding=»utf-8″ ?><InvokeArgs xmlns:clr=»http://schemas…».
Программирование в 1С 7.7
Предположим, что перед нами стоит задача поиска каких-либо данных по штрихкоду номенклатуры. Код на языке 1С, осуществляющий поиск данных, оформляется в виде экспортного метода в глобальном контексте. Если принимать аргументы обычным способом, то это будет выглядеть примерно так:
1 2 3 4 5 6 7 |
Процедура глПолучитьРозничныйОстатокТСД (Штрихкод) Экспорт Остаток = … … Возврат Остаток; КонецПроцедуры // глПолучитьРозничныйОстатокТСД () |
В Mobile SMARTS существует некоторый аналог ТаблицыЗначений для передаваемых параметров, который называется InvokeArgs. Подробнее о свойствах и методах объектов, используемых при работе с Mobile SMARTS можно почитать в файле документации «Mobile SMARTS 2008 – Компонента доступа.chm».
Если принимать аргументы в виде InvokeArgs, то код будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 |
Процедура глПолучитьРозничныйОстатокТСД (XML_Аргументов) Экспорт connector = СоздатьОбъект("Cleverence.Warehouse.StorageConnector"); Аргументы = connector.InvokeArgsFromXml(XML_Аргументов); Штрихкод = Аргументы.ПолучитьСтроку("Штрихкод"); Остаток = … … Возврат Остаток; КонецПроцедуры // глПолучитьРозничныйОстатокТСД () |
Весь смысл использования более сложного способа передачи параметров состоит в том, чтобы уменьшить зависимость между кодом 1С и кодом Mobile SMARTS на мобильном терминале. При передаче одного только штрихкода пользы немного, но когда аргументов больше пяти – метод глПолучитьРозничныйОстатокТСД всё равно будет принимать один строковой параметр – и если при вызове метода на ТСД мы захотим передать лишний параметр или перепутаем порядок аргументов, то ничего страшного не случится. Главное не перепутать имена.
Возврат аргументов также возможен в сложном стиле. Это полезно при возвращении сразу нескольких значений. В Mobile SMARTS есть некоторый аналог ТаблицыЗначений для возвращаемых аргументов, называемый InvokeResult. Код возврата значений с использованием InvokeResult будет выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 |
connector = СоздатьОбъект("Cleverence.Warehouse.StorageConnector"); Результаты = СоздатьОбъект("Cleverence.Warehouse.InvokeResult"); Результаты.Добавить("Остаток", Остаток); Результаты.Добавить("КодТовара", Номенклатура.Код); Результаты.Добавить("НаименованиеТовара", Номенклатура.Наименование); … Возврат connector.СохранитьОбъектВ_XML(Результаты); КонецПроцедуры // глПолучитьРозничныйОстатокТСД () |
Как видно из кода, метод возвращает строку, содержащую XML с результатами. Этот XML будет правильно проинтерпретирован сервером и клиентом Mobile SMARTS, в результате чего в сессии программы на терминале сбора данных окажутся переменные с названиями, переданными в метод «Добавить».
Для проверки работы кода 1С можно воспользоваться отладкой из панели управления Mobile SMARTS.
Чтобы вызвать новый метод 1С с терминала сбора данных, в программу обработки документа, следует добавить действие «Вызов метода внешней системы». Для ознакомления с основами программирования в Mobile SMARTS следует смотреть раздел «Основы программирования в Mobile SMARTS».
Создадим новый виртуальный тип документа «Получение остатков» и протестируем в нём интересующий нас функционал:
В свойстве «Параметры» действия «Вызов метода внешней системы» указываем именованные параметры для передачи, а именно «Штрихкод» как значение переменной «ScannedBarcode», в которую действие «Выбор номенклатуры» положило строку со считанным штрихкодом:
Примечание: Действие номенклатуры позволяет не только сканировать товары, но и выбирать их из списка при вводе спецштрихкода «0». Чтобы при выборе из списка передать в 1С не «0», а штрихкод выбранного товара, вместо «ScannedBarcode» следует указать «{SelectedProduct.Packing.Barcode}».
В свойстве «Переменная сессии для результата» действия «Вызов метода внешней системы» указано «Result». Это означает, что результат вызова метода 1С попадет в переменную и именем «Result».
Для отображения полученных остатков на экране терминала, укажем в действии «Сообщение» следующий шаблон отображения информации:
Если результаты вызова передаются в виде InvokeResult, то шаблон отображения может выглядеть следующим образом: «Остаток {Result.НаименованиеТовара}: <b>{Result.Остаток} </b>».
Программирование в 1С 8
Предположим, что перед нами стоит задача поиска каких-либо данных по штрихкоду номенклатуры. Код на языке 1С, осуществляющий поиск данных, оформляется в виде экспортного метода в глобальном контексте. Если принимать аргументы обычным способом, то это будет выглядеть примерно так:
1 2 3 4 5 6 7 |
Процедура глПолучитьРозничныйОстатокТСД (Штрихкод) Экспорт Остаток = … … Возврат Остаток; КонецПроцедуры // глПолучитьРозничныйОстатокТСД () |
В Mobile SMARTS существует некоторый аналог ТаблицыЗначений для передаваемых параметров, который называется InvokeArgs. Подробнее о свойствах и методах объектов, используемых при работе с Mobile SMARTS можно почитать в файле документации «Mobile SMARTS 2008 – Компонента доступа.chm».
Если принимать аргументы в виде InvokeArgs, то код будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 |
Процедура глПолучитьРозничныйОстатокТСД (XML_Аргументов) Экспорт connector = новый COMОбъект("Cleverence.Warehouse.StorageConnector"); Аргументы = connector.InvokeArgsFromXml(XML_Аргументов); Штрихкод = Аргументы.ПолучитьСтроку("Штрихкод"); Остаток = … … Возврат Остаток; КонецПроцедуры // глПолучитьРозничныйОстатокТСД () |
Весь смысл использования более сложного способа передачи параметров состоит в том, чтобы уменьшить зависимость между кодом 1С и кодом Mobile SMARTS на мобильном терминале. При передаче одного только штрихкода пользы немного, но когда аргументов больше пяти – метод глПолучитьРозничныйОстатокТСД всё равно будет принимать один строковой параметр – и если при вызове метода на ТСД мы захотим передать лишний параметр или перепутаем порядок аргументов, то ничего страшного не случится. Главное не перепутать имена.
Возврат аргументов также возможен в сложном стиле. Это полезно при возвращении сразу нескольких значений. В Mobile SMARTS есть некоторый аналог ТаблицыЗначений для возвращаемых аргументов, называемый InvokeResult. Код возврата значений с использованием InvokeResult будет выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 |
connector = новый COMОбъект("Cleverence.Warehouse.StorageConnector"); Результаты = новый COMОбъект("Cleverence.Warehouse.InvokeResult"); Результаты.Добавить("Остаток", Остаток); Результаты.Добавить("КодТовара", Номенклатура.Код); Результаты.Добавить("НаименованиеТовара", Номенклатура.Наименование); … Возврат connector.СохранитьОбъектВ_XML(Результаты); КонецПроцедуры // глПолучитьРозничныйОстатокТСД () |
Как видно из кода, метод возвращает строку, содержащую XML с результатами. Этот XML будет правильно проинтерпретирован сервером и клиентом Mobile SMARTS, в результате чего в сессии программы на терминале сбора данных окажутся переменные с названиями, переданными в метод «Добавить».
Для проверки работы кода 1С можно воспользоваться отладкой из панели управления Mobile SMARTS.
Чтобы вызвать новый метод 1С с терминала сбора данных, в программу обработки документа, следует добавить действие «Вызов метода внешней системы».
Создадим новый виртуальный тип документа «Получение остатков» и протестируем в нём, интересующий нас функционал:
В свойстве «Параметры» действия «Вызов метода внешней системы» указываем именованные параметры для передачи, а именно «Штрихкод» как значение переменной «ScannedBarcode», в которую действие «Выбор номенклатуры» положило строку со считанным штрихкодом:
Примечание: Действие номенклатуры позволяет не только сканировать товары, но и выбирать их из списка при вводе спецштрихкода «0». Чтобы при выборе из списка передать в 1С не «0», а штрихкод выбранного товара, вместо «ScannedBarcode» следует указать «{SelectedProduct.Packing.Barcode}».
В свойстве «Переменная сессии для результата» действия «Вызов метода внешней системы» указано «Result». Это означает, что результат вызова метода 1С попадет в переменную и именем «Result».
Для отображения полученных остатков на экране терминала, укажем в действии «Сообщение» следующий шаблон отображения информации:
Если результаты вызова передаются в виде InvokeResult, то шаблон отображения может выглядеть следующим образом: «Остаток {Result.НаименованиеТовара}: <b>{Result.Остаток} </b>».