Выгрузка справочника номенклатуры внутри документа
Кроме основного справочника номенклатуры, используемого при работе со всеми документами на ТСД, существует возможность выгружать вместе с каждым документом отдельный справочник номенклатуры.
Данная возможность будет полезна, если в строках выгружаемых на ТСД документов встречаются товары, отсутствующие в основном справочнике номенклатуры (или если основно й справочник номенклатуры не выгружается вообще).
При работе на терминале нет никакой разницы, в каком из справочников содержится товар (основном или документа), т. е. нет необходимости что-либо специально программировать в конфигурации Mobile SMARTS для поиска товаров в этом отдельном справочнике при работе с документом.
Справочник номенклатуры документа как бы становится частью обычного справочника номенклатуры, но только в рамках конкретного документа. При работе с другими документами используются их справочники номенклатуры (если они есть), а также общий справочник.
Справочник номенклатуры документа, как и основной справочник номенклатуры, не загружается полностью в память ТСД, и для быстрого поиска товаров в нем используются индексные файлы.
Выгрузка справочника номенклатуры документа
В конфигурации Mobile SMARTS существует настройка «Сохранять номенклатуру вместе с документом». В Панели управления настройка находится в узле «Структура номенклатуры»:
Настройка имеет следующие значения:
Нет (по умолчанию) — справочники номенклатуры для выгружаемых документов создаваться не будут;
Да — справочники создаваться будут;
Авто — справочники будут создаваться только если задан режим поиска номенклатуры на сервере или локально на устройстве и номенклатура выгружена (справочник номенклатуры не пуст).
Выгрузка такой номенклатуры документа в Mobile SMARTS происходит очень просто. Вся информация о номенклатуре заполняется прямо в строках документа Mobile SMARTS. Платформа сама вынимает из строк документа данные о номенклатуре и строит по ним дополнительный справочник.
Информация о номенклатуре заносится в специальные свойства строки документа Mobile SMARTS:
-
**ProductName** [НаименованиеТовара] -
**ProductMarking** [АртикулТовара] -
**ProductBarcode** [Штрих кодТовара] -
**PackingName** [НаименованиеУпаковки] -
**PackingUnitsQuantity** [КоличествоБазовыхЕдиницВУпаковке]
Эти свойства идут в дополнение к обязательным полям, идентифицирующим товар и упаковку —
ProductId [ИдТовара]иPackingId [ИдУпаковки].
По умолчанию эти свойства пытаются вернуть соответствующие данные из полного справочника номенклатуры (например, ProductName попытается найти по ProductId товар в общем справочнике и затем вернуть его имя, а ProductBarcode возвращает значение штрихкода упаковки, если она получена и у нее есть штрихкод).
Но в режиме «Сохранять номенклатуру вместе с документом» в эти свойства можно проставлять любые свои значения.
Если механизм сохранения справочника номенклатуры документа включен, то при выгрузке документа Mobile SMARTS выполняется следующий алгоритм:
-
Если в строке документа заполнено поле ProductId, выполняется поиск номенклатуры в выгруженном справочнике по ProductId.
-
Если товар найден, выполняется сравнение соответствующих полей Name и ProductName, Marking и ProductMarking, Barcode и ProductBarcode (с поиском упаковки по штрихкоду).
-
Если товар и упаковка найдены и указанные поля совпали, запись позиции в справочник номенклатуры документа не выполняется.
-
Если товар не найден или значения полей не совпали (например ProductName и название товара, найденного по ProductId, отличаются), то создается новая позиция номенклатуры и упаковки (или только упаковки, если позиция номенклатуры с данным Id уже была добавлена в справочник номенклатуры данного документа), заполняются значения основных полей (Id = ProductId, Name = ProductName, …), в упаковку товара переписываются все дополнительные поля из строки документа, позиция добавляется в справочник документа.
Если механизм сохранения справочника номенклатуры документа отключен, то указанные поля могут использоваться для поиска позиции номенклатуры в выгруженном общем справочнике номенклатуры и заполнения полей ProductId [ИдТовара] и PackingId [ИдУпаковки] строки документа на основе найденной позиции товара и упаковки (только если поля ProductId [ИдТовара] и PackingId [ИдУпаковки] не были заполнены в выгружаемой строке документа). Т. е., например, в документе Mobile SMARTS можно заполнить только ProductName, а ProductId будет найден в общем справочнике по этому наименованию товара.
При загрузке документа с сервера 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&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;