Выгрузка справочника номенклатуры внутри документа

Последние изменение: 04.10.2018

Кроме основного справочника номенклатуры, используемого при работе со всеми документами на ТСД, существует возможность выгружать вместе с каждым документом отдельный справочник номенклатуры. 

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

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

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

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

Выгрузка справочника номенклатуры документа

В конфигурации Mobile SMARTS существует настройка «Сохранять номенклатуру вместе с документом». В Панели управления настройка находится в узле «Структура номенклатуры»:

Настройка имеет следующие значения:

Нет (по умолчанию) - справочники номенклатуры для выгружаемых документов создаваться не будут;

Да - справочники создаваться будут;

Авто - справочники будут создаваться только если задан режим поиска номенклатуры на сервере или локально на устройстве и номенклатура выгружена (справочник номенклатуры не пуст). 

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

Информация о номенклатуре заносится в специальные свойства строки документа Mobile SMARTS:

  1. ProductName [НаименованиеТовара],

  2. ProductMarking [АртикулТовара],

  3. ProductBarcode [ШтрихкодТовара],

  4. PackingName [НаименованиеУпаковки],

  5. 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-файл «Поступление № 10000.csv», положим файл в папку <папка базы Mobile SMARTS>\XlsCsv\На терминал:
[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&amp;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;