Кроме основного справочника номенклатуры, используемого при работе со всеми документами на ТСД, существует возможность выгружать вместе с каждым документом отдельный справочник номенклатуры.
Данная возможность будет полезна, если в строках выгружаемых на ТСД документов встречаются товары, отсутствующие в основном справочнике номенклатуры (или если основной справочник номенклатуры не выгружается вообще).
При работе на терминале нет никакой разницы, в каком из справочников содержится товар (основном или документа), т. е. нет необходимости что-либо специально программировать в конфигурации Mobile SMARTS для поиска товаров в этом отдельном справочнике при работе с документом.
Справочник номенклатуры документа как бы становится частью обычного справочника номенклатуры, но только в рамках конкретного документа. При работе с другими документами используются их справочники номенклатуры (если они есть), а также общий справочник.
Справочник номенклатуры документа, как и основной справочник номенклатуры, не загружается полностью в память ТСД, и для быстрого поиска товаров в нем используются индексные файлы.
Выгрузка справочника номенклатуры документа
В конфигурации Mobile SMARTS существует настройка «Сохранять номенклатуру вместе с документом». В Панели управления настройка находится в узле «Структура номенклатуры»:
Настройка имеет следующие значения:
Нет (по умолчанию) — справочники номенклатуры для выгружаемых документов создаваться не будут;
Да — справочники создаваться будут;
Авто — справочники будут создаваться только если задан режим поиска номенклатуры на сервере или локально на устройстве и номенклатура выгружена (справочник номенклатуры не пуст).
Выгрузка такой номенклатуры документа в Mobile SMARTS происходит очень просто. Вся информация о номенклатуре заполняется прямо в строках документа Mobile SMARTS. Платформа сама вынимает из строк документа данные о номенклатуре и строит по ним дополнительный справочник.
Информация о номенклатуре заносится в специальные свойства строки документа Mobile SMARTS:
-
ProductName [НаименованиеТовара],
-
ProductMarking [АртикулТовара],
-
ProductBarcode [ШтрихкодТовара],
-
PackingName [НаименованиеУпаковки],
-
PackingUnitsQuantity [КоличествоБазовыхЕдиницВУпаковке].
(эти свойства идут в дополнение к обязательным полям, идентифицирующим товар и упаковку — ProductId [ИдТовара] и PackingId [ИдУпаковки], подробнее в статье «Mobile SMARTS 3.0: Работа с компонентой», объект DocumentItem)
По умолчанию эти свойства пытаются вернуть соответствующие данные из полного справочника номенклатуры (например, ProductName попытается найти по ProductId товар в общем справочнике и затем вернуть его имя, а ProductBarcode возвращает значение штрихкода упаковки, если она получена и у нее есть штрихкод).
Но в режиме «Сохранять номенклатуру вместе с документом» в эти свойства можно проставлять любые свои значения.
Если механизм сохранения справочника номенклатуры документа включен, то при выгрузке документа Mobile SMARTS выполняется следующий алгоритм:
-
Если в строке документа заполнено поле ProductId, выполняется поиск номенклатуры в выгруженном справочнике по ProductId.
-
Если товар найден, выполняется сравнение соответствующих полей Name и ProductName, Marking и ProductMarking, Barcode и ProductBarcode (с поиском упаковки по штрихкоду).
-
Если товар и упаковка найдены и указанные поля совпали, запись позиции в справочник номенклатуры документа не выполняется.
-
Если товар не найден или значения полей не совпали (например ProductName и название товара, найденного по ProductId, отличаются), то создается новая позиция номенклатуры и упаковки (или только упаковки, если позиция номенклатуры с данным Id уже была добавлена в справочник номенклатуры данного документа), заполняются значения основных полей (Id = ProductId, Name = ProductName, …), в упаковку товара переписываются все дополнительные поля из строки документа, позиция добавляется в справочник документа.
Если механизм сохранения справочника номенклатуры документа отключен, то указанные поля (ProductName [НаименованиеТовара], ProductMarking [АртикулТовара], ProductBarcode [ШтрихкодТовара], .) могут использоваться для поиска позиции номенклатуры в выгруженном общем справочнике номенклатуры и заполнения полей ProductId [ИдТовара] и PackingId [ИдУпаковки] строки документа на основе найденной позиции товара и упаковки (только если поля ProductId [ИдТовара] и PackingId [ИдУпаковки] не были заполнены в выгружаемой строке документа). Т. е., например, в документе Mobile SMARTS можно заполнить только ProductName, а ProductId будет найден в общем справочнике по этому наименованию товара.
При загрузке документа с сервера Mobile SMARTS справочник номенклатуры загружается на терминал вместе с документом. При работе с ТСД напрямую справочник копируется на ТСД вместе с документом.
Пример
Очистим полностью справочник номенклатуры в базе «Mobile SMARTS Магазин 15»:
Включим в Панели управления режим сохранения номенклатуры документа:
[CSV]
#{Document} Id;Appointment 10000;оператор #{DeclaredItems} Код;ProductBarcode;ProductMarking;ProductName;Характеристика;PackingName;DeclaredQuantity;Цена 1;1111111111111;74919938;Туфли;;шт;2;500 2;2222222222222;71127401;Галогеновый Обогр-ль ELECTROLUX EHH/F-30;;шт;3;1500
Выполним выгрузку на сервер с помощью утилиты Excel/Csv:
Зайдем в папку <папка базы Mobile SMARTS>\Documents:
Видим файл документа doc_10000.xml и папку Products_10000. Строка файла документа:
[XML]
… <DocumentItem currentQuantity="0" declaredQuantity="2" expiredDate="0001-01-01T00:00:00" packingId="шт" productId="1" registeredDate="0001-01-01T00:00:00" uid="5dcb431f-a965-4fd1-b9e9-ae3d83561c5e">
<Fields count="1">
<FieldValue fieldName="price">
<Value clr:Type="Decimal">500</Value>
</FieldValue>
</Fields>
</DocumentItem>
...
В строке заполнены ProductId и PackingId, но нет наших специальных полей товара и упаковки (ProductBarcode, ProductMarking, ProductName, PackingName).
Зайдем в папку Products_10000, видим файлы номенклатуры документа:
Откроем Products_10000.xml:
[XML]
<?xml version="1.0" encoding="utf-8"?><ProductCollection xmlns:clr="http://schemas.cleverence.ru/clr&quot; count="2"> <Product basePackingId="шт" id="1" marking="74919938" name="Туфли"> <Packings> <Packing barcode="1111111111111" id="шт" Характеристика="" Decimal_price="500"></Packing> </Packings> </Product> <Product basePackingId="шт" id="2" marking="71127401" name="Галогеновый Обогр-ль ELECTROLUX EHH/F-30"> <Packings> <Packing barcode="2222222222222" id="шт" Характеристика="" Decimal_price="1500"> </Packing> </Packings> </Product> </ProductCollection>
В файле присутствуют наши товары с названиями, штрихкодами и всем необходимым.
Откроем документ «Поступление № 10000» на терминале. Список товаров отображается, поиск по штрихкоду также работает:
Пример
Заполнение свойств строки документа при выгрузке из 1С:
[1C]
... //Не заполняем ИдТовара и ИдУпаковки, назначатся автоматически при выгрузке, //для идентификации товара при загрузке обратно используем штрихкод docItem = Новый COMОбъект("Cleverence.Warehouse.DocumentItem"); docItem.НаименованиеТовара = "Туфли"; docItem.ШтрихкодТовара = "2000019137962"; docItem.КоличествоПлан = 8; docItem.УстановитьПоле("Характеристика", "желтый"); … // Алко-номенклатура docItem = Новый COMОбъект("Cleverence.Warehouse.DocumentItem"); docItem.ИдТовара = "cbcf4931-55bc-11d9-848a-00112f43529a"; docItem.ИдУпаковки = "бут"; docItem.НаименованиеТовара = "Портвейн"; docItem.ШтрихкодТовара = "0350191000003352739"; //Алко-код docItem.КоличествоПлан = 8; docItem.УстановитьПоле("Цена", 300); docItem.УстановитьПоле("Колво", 7); docItem.УстановитьПоле("Алко", Истина); docItem.УстановитьПоле("АлкоМарк", Истина); docItem.УстановитьПоле("АлкоКод", "0350191000003352739"); docItem.УстановитьПоле("АлкоНаим", "Портвейн 777"); docItem.УстановитьПоле("АлкоОбъем", 0.7); docItem.УстановитьПоле("АлкоКрепость", 20);// Две упаковки одного товара (шт и ящ) docItem = Новый COMОбъект("Cleverence.Warehouse.DocumentItem"); docItem.НаименованиеТовара = "Ботинки"; docItem.НаименованиеУпаковки = "шт"; docItem.КоличествоБазовыхЕдиницВУпаковке = 1; docItem.ШтрихкодТовара = "90909"; docItem.КоличествоПлан = 5; ... docItem = Новый COMОбъект("Cleverence.Warehouse.DocumentItem"); docItem.НаименованиеТовара = "Ботинки"; docItem.НаименованиеУпаковки = "ящ"; docItem.КоличествоБазовыхЕдиницВУпаковке = 5; docItem.ШтрихкодТовара = "80808"; docItem.КоличествоПлан = 2;