Интеграция «Mobile SMARTS: ЕГАИС» с 1С и произвольной системой

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



Первоначальная настройка и подключение

  1. Устанавливаем платформу и конфигурацию Mobile SMARTS ЕГАИС;
  2. На рабочем столе появится иконка для запуска Mobile SMARTS;



  3. Зайдя в менеджер баз данных Mobile SMARTS, мы можем проверить адрес подключения и рабочий каталог, по которому расположена база «Mobile SMARTS: ЕГАИС»;



  4. В установку входит внешняя компонента Cl.TerminalConnector, которая (если установка прошла корректно), уже будет зарегистрирована в системе;
  5. Если эта компонента встала успешно, то мы получили возможность создавать com объект драйвера, и можем обращаться напрямую к нашей базе «Mobile SMARTS: ЕГАИС».

Вызываем компоненту и подключаем необходимую базу:

Пример кода 1С:Предприятие 8

//мДрайверТСД = новый COMОбъект("Cleverence.Warehouse.StorageConnector"); // Для серверной версии
 ПрогИД = "AddIn.Cl.TerminalConnector";
 ПодключитьВнешнююКомпоненту(ПрогИД);
 мДрайверТСД = Новый (ПрогИД); 
 СтрокаПодключения = "dt-501-2:10501/6d7e3a2f-3967-4734-bb9c-d1ba605aaef8";
 МассивПодключения = Новый Массив;
 МассивПодключения.Добавить(СтрокаПодключения);
 Если Не мДрайверТСД.Подключить(МассивПодключения, "") Тогда
  Сообщить("Не удалось подключиться к базе данных MS");
 КонецЕсли;
 // СтрокаПодключения - строка подключения из настройки базы MS

Пример кода 1С:Предприятие 7.7

	Компонента = "AddIn.Cl.TerminalConnector";
Если ПодключитьВнешнююКомпоненту(Компонента) = 0 Тогда
ОписаниеРезультата = "ошибка загрузки внешней компоненты """ + Компонента + """";
Иначе
мДрайверТСД = СоздатьОбъект(Компонента);
мДрайверТСД.УстановитьВерсию1С("v7");
СтрокаПодключения = "dt-501-2:10501/6d7e3a2f-3967-4734-bb9c-d1ba605aaef8"; 
Сз = СоздатьОбъект("СписокЗначений");
Сз.ДобавитьЗначение(СтрокаПодключения);
Если мДрайверТСД.Подключить(Сз,"") = 0 Тогда
   Описание = "";
мДрайверТСД.ПолучитьОшибку(Описание); 
Сообщить("Ошибка при подключении: " + Описание);
мДрайверТСД.ОсвободитьРесурсы();
Возврат; КонецЕсли;
КонецЕсли;    Описание = "";

Пример кода для произвольной учетной системы через компоненту COM

connection = new COM("Cleverence.Warehouse.StorageConnector");
// СтрокаПодключения - строка подключения из настройки базы MS
connection.SelectCurrentApp(СтрокаПодключения);

Обмен данными

Разделяем обмен данными на четыре этапа внутри

  • Этап 1 – выгрузка номенклатуры;
  • Этап 2 – выгрузка документов;
  • Этап 3 – выгрузка данных форм «А»;
  • Этап 4 – загрузка документов.

Этап первый – выгрузка номенклатуры

Перед выгрузкой номенклатуры мы должны её инициализировать:

Пример кода 1С:Предприятие 8

Если Не мОбъектТСД.НачатьВыгрузкуТоваров(мДанные) Тогда
    мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
    ВывестиПредупреждение( "Ошибка при инициализации выгрузки: " + м
    ОбъектТСД.ОписаниеОшибки );
    Сообщить("Ошибка при инициализации выгрузки: " + мОбъектТСД.ОписаниеОшибки,
    СтатусСообщения.Важное );
    мОбъектТСД.ОсвободитьРесурсы();
    Возврат;
КонецЕсли;

Пример кода 1С:Предприятие 7.7

Если мОбъектТСД.НачатьВыгрузкуТоваров(мДанные) = 0 Тогда
    мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
    ВывестиПредупреждение( "Ошибка при инициализации выгрузки: " + мОбъектТСД.ОписаниеОшибки );
    Сообщить("Ошибка при инициализации выгрузки: " + мОбъектТСД.ОписаниеОшибки);
    мОбъектТСД.ОсвободитьРесурсы();
    Возврат;
КонецЕсли;

Если по какой-либо причине начать выгрузку товаров не удалось, то система выдаст сообщение об ошибке.

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

мДанные – строка выгрузки. Пример кода 1С:Предприятие 8

// +++ Перед началом выгрузки необходимо передать в Mobile SMARTS структуру полей выгрузки
// там, где тип указан явно – int или Boolean, они и есть. В других случаях тип поля всегда строка
мДанные = Новый Массив(25);
мДанные.Установить(  0, "Product.Ид" );
мДанные.Установить(  1, "Product.Marking" );


мДанные.Установить( 24, "Product.АлкоКод" );
Если Не мДрайверТСД.НачатьВыгрузкуТоваров(мДанные) Тогда // Происходит проверка на соответствие структуры полей
Ошибка = мДрайверТСД.ПолучитьОшибку("Описание ошибки");
Сообщить("Ошибка при инициализации выгрузки: " + Ошибка, СтатусСообщения.Важное );
мДрайверТСД.ОсвободитьРесурсы();
Возврат;
КонецЕсли;
СправочникНоменклатуры = Справочники.Номенклатура.Выбрать();
Пока СправочникНоменклатуры.Следующий() Цикл
Если НЕ СправочникНоменклатуры.ЭтоГруппа Тогда
мДанные.Установить(  0, XMLСтрока(СправочникНоменклатуры.Ссылка));//"Product.Ид" );
мДанные.Установить(  1, СправочникНоменклатуры.Артикул);//"Product.Marking" );
мДанные.Установить(  2, СправочникНоменклатуры.Код);//"Product.Barcode" );
мДанные.Установить(  3, "0000000000000");//"Packing.Barcode" );
мДанные.Установить(  4, СправочникНоменклатуры.Наименование);//"Product.Name" );
мДанные.Установить(  5, XMLСтрока(СправочникНоменклатуры.ЕдиницаДляОтчетов.Ссылка));//"Product.BasePackingId" );
мДанные.Установить(  6, XMLСтрока(СправочникНоменклатуры.ЕдиницаДляОтчетов.Ссылка));//"Packing.Ид" ); 
мДанные.Установить(  7, СправочникНоменклатуры.ЕдиницаДляОтчетов.Наименование);//"Packing.Name" );
мДанные.Установить(  8, 1);//"Packing.UnitsQuantity" );
мДанные.Установить(  9, "");//"Packing.descr" );
мДанные.Установить( 10, "");//"Packing.serial" );
мДанные.Установить( 11, 0);//"Packing.price" );
мДанные.Установить( 12, 1);//"Packing.qty" );
мДанные.Установить( 13, ложь);//"Product.withserial" );
мДанные.Установить( 14, Истина);//"Product.Алко" ); продукцией (bool)
мДанные.Установить( 15, "лицензия на продажу спирта"); //"Product.АлкоВидЛиц" );
мДанные.Установить( 16, Истина);//"Product.АлкоМарк" );
мДанные.Установить( 17, "420");//"Product.АлкоКодВ" );
мДанные.Установить( 18, "СправочникНоменклатуры.Наименование");//"Product.АлкоНаимВ" ); 
мДанные.Установить( 19, 1);//"Product.АлкоОбъем" );
мДанные.Установить( 20, 25);//"Product.АлкоКрепость" );
мДанные.Установить( 21, "РуОпт");//"Product.Производитель" );
мДанные.Установить( 22, "7774444454");//"Product.ПроизвИНН" );
мДанные.Установить( 23, "7707707700");//"Product.ПроизвКПП" );
мДанные.Установить( 24, "22550");//"Product.АлкоКод" );
Если Не мДрайверТСД.ДобавитьВВыгрузкуТоваров(мДанные) Тогда
 Ошибка = мДрайверТСД.ПолучитьОшибку("Описание ошибки");
 Сообщить( "Ошибка при выгрузке данных: " + ". " + Ошибка, СтатусСообщения.Важное );
 Прервано = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// ++ После того, как весь товар передан на СТД, необходимо поверить, что в процессе передачи не возникло исключений
Если Не мДрайверТСД.ЗавершитьВыгрузкуТоваров() Тогда
НомерОшибки = мДрайверТСД.ПолучитьОшибку("Номер ошибки");
Сообщить("Ошибка при завершении выгрузки: " + НомерОшибки);
Прервано = Истина;
КонецЕсли;

мДанные – строка выгрузки. Пример кода 1С:Предприятие 7.7

// +++ Перед началом выгрузки необходимо передать в Mobile SMARTS структуру полей выгрузки
// там, где тип указан явно – int или Boolean, они и есть. В других случаях тип поля всегда строка
мДанные = СоздатьОбъект("СписокЗначений");
мДанные.ДобавитьЗначение("Product.Ид" );
мДанные.ДобавитьЗначение("Product.Marking" );


мДанные.ДобавитьЗначение(24, " Packing.АлкоКод" );
Если Не мДрайверТСД.НачатьВыгрузкуТоваров(мДанные) Тогда // Происходит проверка на соответствие структуры полей
Ошибка = мДрайверТСД.ПолучитьОшибку("Описание ошибки");
Сообщить("Ошибка при инициализации выгрузки: " + Ошибка, СтатусСообщения.Важное );
мДрайверТСД.ОсвободитьРесурсы();
Возврат;
КонецЕсли;
Спр = СоздатьОбЪект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
мДанные.УдалитьВсе();
мДанные.ДобавитьЗначение(Спр.Артикул);//"Product.Ид" );  // uuid элемента справочника
мДанные.ДобавитьЗначение(Спр.Артикул);//"Product.Marking" ); // Артикул
мДанные.ДобавитьЗначение(Спр.Код);//"Product.Barcode" ); // Код товара
мДанные.ДобавитьЗначение("0000000000000");//"Packing.Barcode" ); // ШК
мДанные.ДобавитьЗначение(Спр.Наименование);//"Product.Name" ); // Наименование
мДанные.ДобавитьЗначение(Спр.Артикул);//"Product.BasePackingId" ); //Является базовой единицей
мДанные.ДобавитьЗначение(Спр.Артикул);//"Packing.Ид" ); // Единица измерения 
мДанные.ДобавитьЗначение(Спр.Наименование);//"Packing.Name" ); // Наименование единицы измерения
мДанные.ДобавитьЗначение(1);//"Packing.UnitsQuantity" ); // коэффициент  (кратность) единицы измерения
мДанные.ДобавитьЗначение("");//"Packing.descr" ); // характеристика единицы измерения
мДанные.ДобавитьЗначение("");//"Packing.serial" ); // серийный номер единицы измерения
мДанные.ДобавитьЗначение(0);//"Packing.price" ); // стоимость
мДанные.ДобавитьЗначение(1);//"Packing.qty" ); //Количество
мДанные.ДобавитьЗначение(0);//"Product.withserial" ); // Используются серии
мДанные.ДобавитьЗначение(1);//" Packing.Алко" ); // Является алкоголе содержащей продукцией (bool)
мДанные.ДобавитьЗначение("лицензия на продажу спирта"); //" Packing.АлкоВидЛиц" ); // Вид лицензии
мДанные.ДобавитьЗначение(1);//" Packing.АлкоМарк" ); // Является маркируемой продукцией
мДанные.ДобавитьЗначение("420");//" Packing.АлкоКодВ" );  // Код вида алкогольной продукции мДанные.ДобавитьЗначение("СправочникНоменклатуры.Наименование");//"Product.АлкоНаимВ" );  // Наименование вида алкогольной продукции  
мДанные.ДобавитьЗначение(1);//" Packing.АлкоОбъем" );  // Объем
мДанные.ДобавитьЗначение(25);//" Packing.АлкоКрепость" ); // Крепость
мДанные.ДобавитьЗначение("РуОпт");//" Packing.Производитель" ); // производитель
мДанные.ДобавитьЗначение("7774444454");//" Packing.ПроизвИНН" ); // ИНН Производителя
мДанные.ДобавитьЗначение("7707707700");//" Packing.ПроизвКПП" ); // КПП Производителя
мДанные.ДобавитьЗначение("22550");//" Packing.АлкоКод" );  // Код алкогольной продукции Если мДрайверТСД.ДобавитьВВыгрузкуТоваров(мДанные) = 0 Тогда
 Ошибка = мДрайверТСД.ПолучитьОшибку("Описание ошибки");
 Сообщить( "Ошибка при выгрузке данных: " + ". " + Ошибка, СтатусСообщения.Важное );
 Прервано = 1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// ++ После того, как весь товар передан на СТД, необходимо поверить, что в процессе передачи не возникло исключений
Если Не мДрайверТСД.ЗавершитьВыгрузкуТоваров() Тогда
НомерОшибки = мДрайверТСД.ПолучитьОшибку("Номер ошибки");
Сообщить("Ошибка при завершении выгрузки: " + НомерОшибки);
Прервано = Истина;
КонецЕсли;

Понятно, что в тестовой выгрузке номенклатуры ряд полей заполнены произвольно. (алкоКод, АлкоОбъем, и т.д.). Эти поля заполняются в зависимости от используемой конфигурации.

Для выгрузки номенклатуры используется три функции компоненты подключения:

Начать выгрузку товаров

BeginUploadProducts(bool anyway, bool overwriteExisting, bool generateFullTextSearch)

Параметр

Тип

Описание

anyway

bool

Начать новую выгрузку, даже если какая-то другая выгрузка уже была открыта.

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

overwriteExisting

bool

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

generateFullTextSearch

bool

Флаг, определяющий следует ли генерировать индексы для поиска товаров по части имени. Если такой функционал не требуется, то лучше использовать false так как такой индекс значительно увеличивает объем данных, загружаемых на ТСД.


Выгрузка товаров

UploadProducts(ProductCollection products)

Параметр

Тип

Описание

products

ProductCollection

Коллекция товаров для выгрузки.

Функция принимает для выгрузки коллекцию товаров (Product).

Структура данных Mobile SMARTS требует, чтобы каждый товар содержал хотя бы одну упаковку (Packing).

Пример кода для произвольной учетной системы через компоненту COM

// создание коллекции
productsColl = new COM("Cleverence.Warehouse.ProductCollection");
// создание товара
product = new COM("Cleverence.Warehouse.Product");
product.SetField(“Id”, уникИдТовара);
product.SetField(“Name”, "Товар1");
//создание упаковки
packing = new COM("Cleverence.Warehouse.Product");
packing.SetField(“Id”, идУпаковки); //уникальный в пределах товара
packing.SetField(“Name”, "шт");
product.Packings.Add(packing); //добавление упаковки в товар
//обязательно – установка кода базовой упаковки для товара
product.SetField(“BasePackingId”, packing.Id); 
productsColl.Add(product); //добавление товара в коллекцию

//выгрузка
connection.UploadProducts(productsColl);

Список полей для заполнения в товаре:

Поле

Тип

Основное/дополнительное

Описание

Id

string

основное

Уникальный идентификатор товара.

Name

string

основное

Наименование товара.

BasePackingId

string

основное

Уникальный идентификатор базовой упаковки товара.

Marking

string

основное

Артикул.

withserial

int

дополнительное

Ведется ли серийный учет по товару (1 – ведется, 0 – нет).

Алко

bool

дополнительное

Является алкоголе содержащей продукцией.

АлкоКод

string

дополнительное

Код алкогольной продукции.

АлкоВидЛиц

string

дополнительное

Вид лицензии (просто информационное поле).

АлкоМарк

bool

дополнительное

Является маркируемой продукцией.

АлкоКодВ

string

дополнительное

Код вида алкогольной продукции.

АлкоНаимВ

string

дополнительное

Наименование вида алкогольной продукции.

АлкоОбъем

double

дополнительное

Объем.

АлкоКрепость

double

дополнительное

Крепость.

Производитель

string

дополнительное

Производитель.

ПроизвИНН

string

дополнительное

ИНН Производителя.

ПроизвКПП

string

дополнительное

КПП Производителя.


Список полей для заполнения в упаковке:

Поле

Тип

Основное/дополнительное

Описание

Id

string

основное

Уникальный идентификатор товара.

Name

string

основное

Наименование упаковки.

UnitsQuantity

double

основное

Коэффициент (кратность) единицы измерения.

Barcode

string

основное

Штрихкод товара (обычно EAN13) в текущей упаковке.

price

double

дополнительное

Стоимость.

qty

double

дополнительное

Количество.

serial

string

дополнительное

Серия, привязанная к упаковке (для серийного учета).

descr

string

дополнительное

Характеристика товара, привязанная к упаковке.

Заполнив таким образом данные, мы можем отправить их в терминал (по адресу и порту сервера, который получили при первоначальной настройке).

Пример кода 1С:Предприятие 8

// Выгрузка
Если Не мОбъектТСД.ДобавитьВВыгрузкуТоваров(мДанные) Тогда
мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
Сообщить( "Ошибка при выгрузке данных: " + ". " + мОбъектТСД.ОписаниеОшибки,
СтатусСообщения.Важное );
Прервано = Истина;
Прервать;
КонецЕсли;

Пример кода 1С:Предприятие 7.7

// Выгрузка
 Если мОбъектТСД.ДобавитьВВыгрузкуТоваров(мДанные) = 0 Тогда
    мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
Сообщить( "Ошибка при выгрузке данных: " + ". " + мОбъектТСД.ОписаниеОшибки, 
        СтатусСообщения.Важное );     Прервано = 1;
        Прервать;
     КонецЕсли;

После того, как все данные выгружены, необходимо завершить выгрузку товаров:

Пример кода 1С:Предприятие 8

Если Не мОбъектТСД.ЗавершитьВыгрузкуТоваров() Тогда
НомерОшибки = мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
Сообщить("Ошибка при завершении выгрузки: " + мОбъектТСД.ОписаниеОшибки);
Прервано = Истина;
КонецЕсли;

Пример кода 1С:Предприятие 7.7

  Если мОбъектТСД.ЗавершитьВыгрузкуТоваров() = 0 Тогда
НомерОшибки = мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
Сообщить("Ошибка при завершении выгрузки: " + мОбъектТСД.ОписаниеОшибки);
Прервано = 1;
  КонецЕсли;

Заполнение/получение основных полей можно производить как напрямую, так и через функции SetField/GetField. Для дополнительных полей можно использовать только GetField/SetField.

ИМЕНА ПОЛЕЙ ЧУСТВИТЕЛЬНЫ К РЕГИСТРУ!

Пример кода для произвольной учетной системы через компоненту COM

product.Id = “00001”;
//или
product.SetField(“Id”, “00001”);
//доп поле
product.SetField(“Алко”, true);

Завершение выгрузки товаров

EndUploadProducts()

Завершает процедуру выгрузки товаров. После её вызова сервер будет считать выгрузку завершенной и начнет у себя обновление справочников, генерацию индексов.

До вызова этой функции товары не считаются выгруженными и недоступны.

Полный цикл Пример кода для произвольной учетной системы через компоненту COM

connection = new COM("Cleverence.Warehouse.StorageConnector");
// СтрокаПодключения - строка подключения из настройки базы MS
connection.SelectCurrentApp(СтрокаПодключения);
//начало выгрузки
//вне зависимости от прошлых выгрузок, с полным переписыванием на сервере, без индекса по //именам товаров
Connection.BeginUploadProducts(true, true, false); 
productsColl = new COM("Cleverence.Warehouse.ProductCollection");
for(int i = 0; i< колво_товаров_в_системе; i++) //цикл по товарам в системе
{
//выгружаем блоками по 500 товаров
if(productsColl.Count == 500)
{
//выгрузка блока из 500 товаров
connection.UploadProducts(productsColl);
productsColl = new COM("Cleverence.Warehouse.ProductCollection");
}
// создание товара
product = new COM("Cleverence.Warehouse.Product");
product.SetField(“Id”, “ид” + i);
product.SetField(“Name”, "Товар " + i);
//создание упаковки
packing = new COM("Cleverence.Warehouse.Product");
packing.SetField(“Id”, идУпаковки); //уникальный в пределах товара
packing.SetField(“Name”, "шт");
...
//заполнение остальных полей упаковки
...
product.Packings.Add(packing); //добавление упаковки в товар
//обязательно – установка кода базовой упаковки для товара
product.SetField(“BasePackingId”, packing.Id); 
productsColl.Add(product); //добавление товара в коллекцию
}
//выгрузка оставшихся товаров
if (productsColl.Count > 0)
connection.UploadProducts(productsColl);
//завершение выгрузки
connection.EndUploadProducts();

Этап второй. Выгрузка документов

Аналогично работе с номенклатурой, инициализируем внешнюю компоненту Клеверенс. После чего, определяем, какой документ, и куда мы будем выгружать. На сервере Mobile SMARTS ЕГАИС по умолчанию доступные следующие документы:

  • Собрать штрихкоды;
  • Сбор начальных остатков;
  • Приход на склад;
  • Подбор заказа;
  • Инвентаризация.

Применительно к алкогольной тематике, мы можем проставить следующее соответствие:

  • сбор начальных остатков = Акт постановки на баланс;
  • приход на склад                 = ТТН ЕГАИС в статусе «от поставщика»;
  • подбор заказа                     = ТТН ЕГАИС в статусе «покупателю».

Сбор начальных остатков.

Описание полей:

На сервере Mobile SMARTS:ЕГАИС по умолчанию есть следующие типы документов, доступные для выгрузки:

  • Приход на склад;
  • Подбор заказа;
  • Инвентаризация.

Применительно к алкогольной тематике, мы можем проставить следующее соответствие:

  • приход на склад                 = ТТН ЕГАИС в статусе «от поставщика»;
  • подбор заказа                     = ТТН ЕГАИС в статусе «покупателю».

Функция выгрузки

UploadDocument(Document document)

Параметр

Тип

Описание

document

Document

Документ Mobile SMARTS для выгрузки.

Функция принимает для выгрузки объект документа (Document).

Пример кода для произвольной учетной системы через компоненту COM

// Аналогично работе с номенклатурой, инициализируем подключение
connection = new COM("Cleverence.Warehouse.StorageConnector");
// СтрокаПодключения - строка подключения из настройки базы MS
connection.SelectCurrentApp(СтрокаПодключения);
// создание документа
document = new COM("Cleverence.Warehouse.Document");
//заполнение документа
//...
//...
// выгрузка в Mobile SMARTS
connection.UploadDocument(document);

Каждый документ Mobile SMARTS имеет шапочную часть документа, и две табличных части (DeclaredItems  - строки заявки, CurrentItems – фактические строки с ТСД).

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

Заполнение шапки документа:

Реквизиты «шапки» документа

Реквизит

Тип

Основное/доп.

Описание

Id

string

основное

Идентификатор документа. Обязательно заполняется при выгрузке документа и должен иметь уникальное значение.

Name

string

основное

Отображаемое имя документа. Обязательно заполняется при выгрузке документа.

Appointment

string

основное

Назначение документа - код пользователя или имя группы, которым данный документ назначается на исполнение. Если значение пустое, то документ попадает к первому свободному пользователю, которому разрешен тип документа.

UserID

string

основное

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

UserName

string

основное

Имя пользователя.

DocumentTypeName

string

основное

Имя типа документа. Обязательно заполняется при выгрузке документа и должно иметь уникальное значение.

Modified

boolean

основное

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

InProgress

boolean

основное

Признак того, что документ захвачен пользователем на обработку. Заполняется, когда документ был захвачен пользователем.

Finished

boolean

основное

Признак того, что обработка документа пользователем была завершена, и его можно забирать назад в учетную систему. Заполняется, когда работа с документом была завершена на терминале.

WareHouseID

string

основное

Идентификатор склада, к которому привязан документ. Должен иметь уникальное значение для каждого склада.

Barcode

string

основное

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

Priority

Int32

основное

Приоритет документа. Более приоритетные документы раньше отдаются на терминал для обработки.

DistributeByBarCode

boolean

основное

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

ServerHosted

boolean

основное

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

КонтрольКолва

Int32

дополнительное

Контроль количества по заявке.

1 – контролируется, в документ нельзя принимать товары, которых нет в заявке, а также нельзя превышать количество товара, который в заявке есть

0 – без контроля.

НомерЕгаис

string

дополнительное

Номер ТТН ЕГАИС.


Пример кода для произвольной учетной системы через компоненту COM

// создание документа
document = new COM("Cleverence.Warehouse.Document");
document.Id = "5BFF9B72-BA92-409D-BA01-CA909C3CB7C5";
document.DocumentTypeName = "Приход на склад";
document.Name = "Приход на склад №000001";
//для пользователя «оператор», заведенного в стандартной поставке
document.Appointment = "оператор";
//для выбора с сервера произвольным пользователем
//document.Appointment = "";
//document.DistibuteByBarcode = true;
//для склада, заведенного в стандартной поставке
document.WarehouseId = "1";
//дополнительные поля, также как и в товаре, заполняются через SetField
document.SetField("КонтрольКолва", 1);
document.SetField("НомерЕгаис","4576456456456");

Заполнение строк заявки

Каждая строка документа – это объект DocumentItem.

Пример кода для произвольной учетной системы через компоненту COM

// создание строки документа
documentItem = new COM("Cleverence.Warehouse.DocumentItem");

Реквизиты «строк» документа

Реквизит

Тип

Основное/доп.

Описание

CreatedBy

CreateBy

основное

Проверка упаковки.

ProductID

string

основное

Идентификатор товара, для которого описана данная позиция.

DeclaredQuantity

Double

основное

Заданное количество в позиции. Свойство заполняется при выгрузке документа из учетной системы, чтобы ограничить объем товара данного типа, с котором оперирует пользователь в документе.

CurrentQuantity

Double

основное

Текущее количество товара в позиции. Показывает какое реальное количество товара задействовано пользователем.

FirstCellID

string

основное

 

FirstStorageBarcode

string

основное

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

PackingID

string

основное

Идентификатор упаковки для заданного товара. Товар задается свойством ProductId [ИдТовара].

SSCC

string

основное

Уникальный номер единицы хранения. Служит для идентификации конкретных экземпляров товара. Заполняется из штрихкода товара по шаблону при выполнении операции.

ExpiredDate

DateTime

основное

Срок годности товара. Инициализируется при занесении конкретного товара в позицию документа пользователем либо из штрихкода по шаблону, либо ручным выбором.

SecondStorageBarcode

string

основное

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

BindedLine

DocumentItem

основное

Задает связь строки из CurrentItems [СтрокиФакт] со строкой в DeclaredItems [СтрокиПлан].

Code

string

дополнительное

 

Barcode

string

дополнительное

Штрихкод.

Serial

string

дополнительное

Серия товара (если используется учет по сериям).

Sn

string

дополнительное

Серийный номер.

Price

Decimal

дополнительное

Цена единицы товара в строке.

ЦенаСклад

string

дополнительное

 

Алко

boolean

дополнительное

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

ПроверкаЧМ

boolean

дополнительное

Нужно проверять Check Mark или нет.

АлкоСН

string

дополнительное

Серийный номер бутылки.

АлкоКод

string

дополнительное

Строка с кодом алкогольной продукции в ЕГАИС.

АлкоНаим

string

дополнительное

Наименование товара.

АлкоКодВ

string

дополнительное

Строка с кодом вида алкогольной продукции.

АлкоОбъем

Decimal

дополнительное

Ёмкость тары в литрах. (в базе может быть в декалитрах, например, в Рознице).

АлкоКрепость

Decimal

дополнительное

Процентное содержание спирта.

Производитель

string

дополнительное

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

ПроизводительИНН

string

дополнительное

ИНН производителя, если уже известен для данного товара.

ПроизводительКПП

string

дополнительное

КПП производителя, если уже известен для данного товара.

АлкоПДФ

string

дополнительное

Строка с PDF 417.

Этап третий. Выгрузка данных форм «А»

Некоторые операции, например, приход на склад позволяют проводить автоматическую проверку и подбор номеров форм «А», если конечно данные об этих формах выгрузить заранее в Mobile SMARTS.

Формы А выгружаются в виде дополнительной таблицы.

Формат таблицы форм А

Реквизиты строки дополнительной табличной части документа «ФормыА»

Реквизит

Тип

Основное/доп.

Описание

КодФормы

string

дополнительное

Код формы в системе ЕГАИС.

КодНоменклатуры

string

дополнительное

Уникальный идентификатор номенклатуры из справочника номенклатуры, если есть.

АлкоКод

string

дополнительное

Строка с кодом алкогольной продукции в ЕГАИС.

Начало

int32

дополнительное

Начало диапазона серийных номеров.

Конец

int32

дополнительное

Конец диапазона серийных номеров.

Основной метод записи в поля документ – это команда «SetField» («УстановитьПоле» - русск)

Соответственно, метод получения данных из полей – «GetField» («ПолучитьПоле» - русск)

ИМЕНА ПОЛЕЙ ЧУСТВИТЕЛЬНЫ К РЕГИСТРУ!

Давайте попробуем создать документ «Сбор начальных остатков»

Перед началом выгрузки документа, мы должны определить его тип (в какой документ Mobile SMARTS мы будем выгружать документ 1С).

Пример кода 1С:Предприятие 8

ДокументТСД = Новый COMОбъект("Cleverence.Warehouse.Document");
ДокументТСД.Ид  - uuid Документа  =  XmlСтрокой(СсылкаНаНашДокумент);
ДокументТСД.ИмяТипаДокумента    = «Сбор начальных остатков»;

Пример кода 1С:Предприятие 7.7

ДокументТСД = СоздатьОбъект("Cleverence.Warehouse.Document");
ДокументТСД.Ид  - uuid Документа  =  ПолучитьUID(СсылкаНаНашДокумент);
ДокументТСД.ИмяТипаДокумента    = «Сбор начальных остатков»;
Функция ПолучитьUID(СсылкаНаНашДокумент)
Стр=ЗначениеВСтрокуВнутр(Объект);
СЗ=СоздатьОбъект("СписокЗначений");
СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2));
Возврат формат(СЗ.ПолучитьЗначение(4),"Ч(0)5")+Прав(СтрЗаменить(Формат("", "С9"), " ", "0") + СокрЛП(СЗ.ПолучитьЗначение(СЗ.РазмерСписка())), 9);
КонецФункции
// Здесь мы добавили функцию формирования УИД для документа

Таким образом мы создали новый документ. После его создания, необходимо явным образом объявить создание строк документа.

Строки документа создаются следующим образом:

Пример кода 1С:Предприятие 8

СтрокаДокументаТСД = Новый COMОбъект("Cleverence.Warehouse.DocumentItem");
//
// тут происходит заполнение полей объекта DocumentItem
СтрокаДокументаТСД.КоличествоПлан = 100
// Например, вышеприведённый код выгрузит 1 строку, где поле DeclaredQuantity будет равно 100
ДокументТСД.СтрокиПлан.Добавить(СтрокаДокументаТСД);
// После заполнения строк документа, нам необходимо зафиксировать сам объект:
Ответ = мДрайверТСД.ВыгрузитьДокумент(ДокументТСД);
Если Не Ответ Тогда
НомерОшибки = мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
Сообщить("Ошибка: " + мОбъектТСД.ОписаниеОшибки, СтатусСообщения.Важное);
Иначе
Сообщить("Документ """ + Строка(Документ1С) + """ выгружен на ТСД.", СтатусСообщения.Обычное);
КонецЕсли;

Пример кода 1С:Предприятие 7.7

СтрокаДокументаТСД = СоздатьОбъект ("Cleverence.Warehouse.DocumentItem");
//
// тут происходит заполнение полей объекта DocumentItem
СтрокаДокументаТСД.КоличествоПлан = 100;
// Например, вышеприведённый код выгрузит 1 строку, где поле DeclaredQuantity будет равно 100
ДокументТСД.СтрокиПлан.Добавить(СтрокаДокументаТСД);
// После заполнения строк документа, нам необходимо зафиксировать сам объект:
Ответ = мДрайверТСД.ВыгрузитьДокумент(ДокументТСД);
Если Ответ = 0 Тогда
НомерОшибки = мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
Сообщить("Ошибка: " + мОбъектТСД.ОписаниеОшибки);
Иначе
Сообщить("Документ """ + Строка(Документ1С) + """ выгружен на ТСД.");
КонецЕсли;

В наших конфигурациях обычно используется следующий алгоритм выгрузки строк документа: (метод «установитьполе» равен в нашем случае команде «SetField»).

Пример кода 1С:Предприятие 8

Для каждого строкаРекв из СтрокаФормата.Реквизиты Цикл // Тут у нас определена сущность «строка формата», которая как раз и определяет, какие реквизиты документа 1С мы передаём в реквизиты MS
Если Не строкаРекв.Выгружать Тогда
Продолжить; // не выгружаем ненужные реквизиты
КонецЕсли;

значение = РекДок[строкаРекв.Реквизит];
Если не ТипЗначенияДоступенВСМАРТС(значение) Тогда
значение = Строка(значение);
значение = ?(значение = "<>","",значение);
КонецЕсли;
 Если ЗначениеЗаполнено(значение) Тогда
ДокументТСД.УстановитьПоле(строкаРекв.ПолеДокументаТСД, значение);
// Метод УстановитьПоле(«НаименованиеПоляДокумента», «ПередаваемоеЗначение»)
 КонецЕсли;
КонецЦикла;

Пример кода 1С:Предприятие 7.7

Для каждого строкаРекв из СтрокаФормата.Реквизиты Цикл // Тут у нас определена сущность «строка формата», которая как раз и определяет, какие реквизиты документа 1С мы передаём в реквизиты MS
Если строкаРекв.Выгружать = 0 Тогда
Продолжить; // не выгружаем ненужные реквизиты
КонецЕсли;

значение = РекДок[строкаРекв.Реквизит];
Если ТипЗначенияДоступенВСМАРТС(значение) = 0 Тогда
значение = Строка(значение);
значение = ?(значение = "<>","",значение);
КонецЕсли;
 Если ПолучитьПустоеЗначение(значение) = 0 Тогда
ДокументТСД.УстановитьПоле(строкаРекв.ПолеДокументаТСД, значение);
// Метод УстановитьПоле(«НаименованиеПоляДокумента», «ПередаваемоеЗначение»)
 КонецЕсли;
КонецЦикла;

После выгрузки шапки документа (заголовок, организация, код ЕГАИС организации, и т.д.), мы можем приступить к выгрузке непосредственно строк документа. Необходимо уточнить, что структура базы данных Mobile SMARTS построена следующим образом – существуют «плановые» строки, которые выгружаются непосредственно из 1С, а после считывания штрих-кода с товара, в документ Mobile SMARTS добавляются строки «факта», которые затем мы с вами и будем обрабатывать.

Выгружаем плановые строки:

Пример кода 1С:Предприятие 8

  Для каждого строкаДок из МассивСтрок Цикл

Товар = Неопределено;
СтрокаДокументаТСД = Новый COMОбъект("Cleverence.Warehouse.DocumentItem");
  КонецЦикла;

Пример кода 1С:Предприятие 7.7

  Для каждого строкаДок из МассивСтрок Цикл

Товар = СтрокаТовара.Номенклатура.Код;
СтрокаДокументаТСД = СоздатьОбъект("Cleverence.Warehouse.DocumentItem");
  КонецЦикла;

Если есть возможность выгрузить диапазоны справок А, то используется следующий метод:

Пример кода 1С:Предприятие 8

ТаблицаСправокА = ДокументТСД.Таблицы.ДобавитьЭлемент ();
ТаблицаСправокА.Name = "ФормыА";
мДрайверТСД.ВыгрузитьДопТаблицу(ТаблицаСправокА);
Для Каждого СтрокаСправок из Документ1С.Товары Цикл
НоваяСтрокаТаблицы = ТаблицаСправокА.Строки.ДобавитьЭлемент ();
НоваяСтрокаТаблицы.SetField("КодФормы",СтрокаСправок.СправкаА.Код);
НоваяСтрокаТаблицы.SetField("Начало",СтрокаСправок.СправкаА.ДиапазоныНомеров[0].НачальныйНомер);
НоваяСтрокаТаблицы.SetField("Конец",СтрокаСправок.СправкаА.ДиапазоныНомеров[0].КонечныйНомер);
НоваяСтрокаТаблицы.SetField("АлкоКод",СтрокаСправок.АлкогольнаяПродукция.Код);
НоваяСтрокаТаблицы.SetField("КодНоменклатуры",ОпределитьНоменклатуруНаСервере(СтрокаСправок.АлкогольнаяПродукция));
КонецЦикла;

Пример кода 1С:Предприятие 7.7

ТаблицаСправокА = ДокументТСД.Таблицы.ДобавитьЭлемент ();
ТаблицаСправокА.Name = "ФормыА";
мДрайверТСД.ВыгрузитьДопТаблицу(ТаблицаСправокА);
Для Каждого СтрокаСправок из Документ1С.Товары Цикл
НоваяСтрокаТаблицы = ТаблицаСправокА.Строки.ДобавитьЭлемент ();
НоваяСтрокаТаблицы.SetField("КодФормы",СтрокаСправок.СправкаА.Код);
НоваяСтрокаТаблицы.SetField("Начало",СтрокаСправок.СправкаА.ДиапазоныНомеров[0].НачальныйНомер);
НоваяСтрокаТаблицы.SetField("Конец",СтрокаСправок.СправкаА.ДиапазоныНомеров[0].КонечныйНомер);
НоваяСтрокаТаблицы.SetField("АлкоКод",СтрокаСправок.АлкогольнаяПродукция.Код);
НоваяСтрокаТаблицы.SetField("КодНоменклатуры",ОпределитьНоменклатуруНаСервере(СтрокаСправок.АлкогольнаяПродукция));
КонецЦикла;


Поле

Тип

Основное/дополнительное

Описание

КодФормы

String

дополнительное

Код формы в системе ЕГАИС.

КодНоменклатуры

String

дополнительное

Уникальный идентификатор номенклатуры из справочника номенклатуры, если есть.

АлкоКод

String

дополнительное

Строка с кодом алкогольной продукции в ЕГАИС.

Начало

Int32

дополнительное

Начало диапазона серийных номеров.

Конец

Int32

дополнительное

Конец диапазона серийных номеров.

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

Пример кода 1С:Предприятие 8

	Ответ = мОбъектТСД.ВыгрузитьДокумент(ДокументТСД); 	Если Не Ответ Тогда
НомерОшибки = мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
          Сообщить("Ошибка: " + мОбъектТСД.ОписаниеОшибки, СтатусСообщения.Важное);
Иначе
          Сообщить("Документ """ + Строка(Документ1С) + """ выгружен на ТСД.",
          СтатусСообщения.Обычное);
КонецЕсли;

Пример кода 1С:Предприятие 7.7

	Ответ = мОбъектТСД.ВыгрузитьДокумент(ДокументТСД); 	Если Ответ = 0 Тогда
НомерОшибки = мОбъектТСД.ПолучитьОшибку(мОбъектТСД.ОписаниеОшибки);
          Сообщить("Ошибка: " + мОбъектТСД.ОписаниеОшибки);
Иначе
          Сообщить("Документ """ + Строка(Документ1С) + """ выгружен на ТСД);
КонецЕсли;

Таким образом мы передали информацию о том, что документ выгружен, либо, если произошла ошибка, получим её описание.

Начало работы с дополнительной таблицей

Для доступа к доп. таблице необходимо запросить специальный объект для работы с ней.

GetTableAccessor(string tableName)

Параметр

Тип

Описание

tableName

String

Имя таблицы.


Пример кода для произвольной учетной системы через компоненту COM

var formTable = connection.GetTableAccessor("ФормыА");

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

Начать выгрузку таблицы

BeginUpload(bool overwriteAllTable)

Параметр

Тип

Описание

overwriteAllTable

bool

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


Пример кода для произвольной учетной системы через компоненту COM

var formTable = connection.GetTableAccessor("ФормыА");
formTable.BeginUpload(true);

Выгрузка строк таблицы

Upload(RowCollection rows)

Параметр

Тип

Описание

rows

RowCollection

Коллекция строк таблицы для выгрузки.

Функция принимает для выгрузки коллекцию строк таблицы (Row).

Пример кода для произвольной учетной системы через компоненту COM

// создание коллекции строк таблицы
var rowCol = new COM("Cleverence.Warehouse.RowCollection");
// создание строки таблицы
var row = new COM("Cleverence.Warehouse.Row");
row.SetField("КодФормы", код_формы);
row.SetField("КодНоменклатуры", код_номенклатуры);
row.SetField("АлкоКод", "0345345345435");
row.SetField("Начало", 10234955554);
row.SetField("Конец",  10234955800);
//добавление строки в коллекцию
rowCol.Add(row);
//...
//заполнение строк
//...
//выгрузка коллекции строк
formTable.Upload(rowCol);

Закончить выгрузку таблицы

EndUpload()

formTable.EndUpload();

Завершает процедуру выгрузки строк таблицы. После её вызова сервер будет считать выгрузку завершенной и начнет у себя обновление таблицы.

До вызова этой функции новые строки не считаются выгруженными и недоступны.

Полный цикл Пример кода для произвольной учетной системы через компоненту COM

connection = new COM("Cleverence.Warehouse.StorageConnector");
// СтрокаПодключения - строка подключения из настройки базы MS
connection.SelectCurrentApp(СтрокаПодключения);
var formTable = connection.GetTableAccessor("ФормыА");
//начало выгрузки
//полная выгрузка, с переписыванием всей таблицы на сервере
formTable.BeginUpload(true);
// создание коллекции строк таблицы
var rowCol = new COM("Cleverence.Warehouse.RowCollection");
for(int i = 0; i< колво_форм_А; i++) //цикл по формам А в системе
{
//выгружаем блоками по 500 строк
if(rowCol.Count == 500)
{
//выгрузка блока из 500 товаров
formTable.Upload(rowCol);
rowCol = new COM("Cleverence.Warehouse.RowCollection");
}
// создание строки таблицы
var row = new COM("Cleverence.Warehouse.Row");
row.SetField("КодФормы", код_формы);
row.SetField("КодНоменклатуры", код_номенклатуры);
row.SetField("АлкоКод", алко_код);
row.SetField("Начало", начало_интервала_серийных_номеров);
row.SetField("Конец",  конец_интервала_серийных_номеров);
//добавление строки в коллекцию
rowCol.Add(row);
}
//выгрузка оставшихся товаров
if (rowCol.Count > 0)
formTable.Upload(rowCol);
//завершение выгрузки
formTable.EndUpload();

Этап четвертый. Загрузка документов

Загрузка документов аналогична выгрузке, исключение составляет лишь несколько моментов:

  1. Для чтения полей читаем строки факта.
    Для Каждого СтрокаТаблицыДокумента из ДокументТСД["СтрокиФакт"]
  2. Поля читаем командой «GetField», либо «ПолучитьПоле».
  3. После того, как мы загрузили документ, обработали его определенным образом, необходимо выполнить команду очистки списка документов.
    мОбъектТСД.Драйвер.УдалитьДокументы(«Список документов»);

Пример Б – загрузка с ТСД документа «Ввод начальных остатков» (1С:Предприятие 8)

// Демонстрационный пример для формирования документа "сбор начальных остатков"
// Создаём таблицу значений, и загружаем в неё данные, полученные с терминала
// Тут мы можем перебрать все документы, которые были выгружены на терминал. 
// Внимание - у документов есть несколько статусов, доступных через свойства
// ДокументыТерминалов.Изменен  - boolean; // ДокументыТерминалов.Завершен - boolean;
// Если для вас небходимо собирать только завершённые документы, пользуйтесь значениями этих полей.
// После чего можем сохранить документы // Единственное, что необходимо типизировать таблицу значений перед тем, как загружать в неё данные
ТаблицаДанныхСТерминала = Новый ТаблицаЗначений;
ТаблицаДанныхСТерминала.Колонки.Добавить("CreatedBy");
ТаблицаДанныхСТерминала.Колонки.Добавить("ProductID");
ТаблицаДанныхСТерминала.Колонки.Добавить("DeclaredQuantity");
ТаблицаДанныхСТерминала.Колонки.Добавить("CurrentQuantity");
ТаблицаДанныхСТерминала.Колонки.Добавить("FirstCellID");
ТаблицаДанныхСТерминала.Колонки.Добавить("FirstStorageBarcode");
ТаблицаДанныхСТерминала.Колонки.Добавить("PackingID");
ТаблицаДанныхСТерминала.Колонки.Добавить("SSCC");
ТаблицаДанныхСТерминала.Колонки.Добавить("Index");
ТаблицаДанныхСТерминала.Колонки.Добавить("RegisteredDate");
ТаблицаДанныхСТерминала.Колонки.Добавить("RegistrationDate");
ТаблицаДанныхСТерминала.Колонки.Добавить("ExpiredDate");
ТаблицаДанныхСТерминала.Колонки.Добавить("SecondCellID");
ТаблицаДанныхСТерминала.Колонки.Добавить("SecondStorageBarCode");
ТаблицаДанныхСТерминала.Колонки.Добавить("BindedLine");
ТаблицаДанныхСТерминала.Колонки.Добавить("code");
ТаблицаДанныхСТерминала.Колонки.Добавить("barcode");
ТаблицаДанныхСТерминала.Колонки.Добавить("serial");
ТаблицаДанныхСТерминала.Колонки.Добавить("desc");
ТаблицаДанныхСТерминала.Колонки.Добавить("sn");
ТаблицаДанныхСТерминала.Колонки.Добавить("price");
ТаблицаДанныхСТерминала.Колонки.Добавить("Ячейка");
ТаблицаДанныхСТерминала.Колонки.Добавить("Заблокировано");
ТаблицаДанныхСТерминала.Колонки.Добавить("ЦенаСклад");
ТаблицаДанныхСТерминала.Колонки.Добавить("Алко");
ТаблицаДанныхСТерминала.Колонки.Добавить("ПроверкаЧМ");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоСН");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоКод");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоНаим");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоКодВ");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоОбъем");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоКрепость");
ТаблицаДанныхСТерминала.Колонки.Добавить("Производитель");
ТаблицаДанныхСТерминала.Колонки.Добавить("ПроизвИНН");
ТаблицаДанныхСТерминала.Колонки.Добавить("ПроизвКПП");
ТаблицаДанныхСТерминала.Колонки.Добавить("АлкоПДФ");
Для инд = 0 По ДокументыТерминалов.Количество - 1 Цикл
ДокументТерминала = ДокументыТерминалов.Элемент(инд);
// Все документы сбора начальных остатков мы можем собрать в одну ТЗ
Если ДокументыТерминалов.Элемент(инд).ИмяТипаДокумента = "Сбор начальных остатков" Тогда
СтрокиДокументаПлан = ДокументТерминала.СтрокиПлан;
КоличествоСтрокПлан = СтрокиДокументаПлан.Количество;
СтрокиДокументаФакт = ДокументТерминала.СтрокиФакт;
КоличествоСтрокФакт = СтрокиДокументаФакт.Количество;
Для СтрокаФакт = 0 по СтрокиДокументаФакт.Количество - 1 Цикл
ТекущаяСтрокаДокумента = СтрокиДокументаФакт.Элемент(СтрокаФакт);
СтрокаТЗ = ТаблицаДанныхСТерминала.Добавить();
Для Каждого Колонка из ТаблицаДанныхСТерминала.Колонки Цикл
СтрокаТЗ[Колонка.Имя] = ТекущаяСтрокаДокумента.ПолучитьПоле(Колонка.Имя);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
// Всё, таблица готова для дальнейшей обработки в 1С

Пример Б – загрузка с ТСД документа «Ввод начальных остатков» (1С:Предприятие 7.7)

// Демонстрационный пример для формирования документа "сбор начальных остатков"
// Создаём таблицу значений, и загружаем в неё данные, полученные с терминала
// Тут мы можем перебрать все документы, которые были выгружены на терминал. 
// Внимание - у документов есть несколько статусов, доступных через свойства
// ДокументыТерминалов.Изменен  - boolean; // ДокументыТерминалов.Завершен - boolean;
// Если для вас небходимо собирать только завершённые документы, пользуйтесь значениями этих полей.
// После чего можем сохранить документы // Единственное, что необходимо типизировать таблицу значений перед тем, как загружать в неё данные
ТаблицаДанныхСТерминала = СоздатьОбъект(“ТаблицаЗначений”);
ТаблицаДанныхСТерминала.НоваяКолонка("CreatedBy");
ТаблицаДанныхСТерминала.НоваяКолонка("ProductID");
ТаблицаДанныхСТерминала.НоваяКолонка("DeclaredQuantity");
ТаблицаДанныхСТерминала.НоваяКолонка("CurrentQuantity");
ТаблицаДанныхСТерминала.НоваяКолонка("FirstCellID");
ТаблицаДанныхСТерминала.НоваяКолонка("FirstStorageBarcode");
ТаблицаДанныхСТерминала.НоваяКолонка("PackingID");
ТаблицаДанныхСТерминала.НоваяКолонка("SSCC");
ТаблицаДанныхСТерминала.НоваяКолонка("Index");
ТаблицаДанныхСТерминала.НоваяКолонка("RegisteredDate");
ТаблицаДанныхСТерминала.НоваяКолонка("RegistrationDate");
ТаблицаДанныхСТерминала.НоваяКолонка("ExpiredDate");
ТаблицаДанныхСТерминала.НоваяКолонка("SecondCellID");
ТаблицаДанныхСТерминала.НоваяКолонка("SecondStorageBarCode");
ТаблицаДанныхСТерминала.НоваяКолонка("BindedLine");
ТаблицаДанныхСТерминала.НоваяКолонка("code");
ТаблицаДанныхСТерминала.НоваяКолонка("barcode");
ТаблицаДанныхСТерминала.НоваяКолонка("serial");
ТаблицаДанныхСТерминала.НоваяКолонка("desc");
ТаблицаДанныхСТерминала.НоваяКолонка("sn");
ТаблицаДанныхСТерминала.НоваяКолонка("price");
ТаблицаДанныхСТерминала.НоваяКолонка("Ячейка");
ТаблицаДанныхСТерминала.НоваяКолонка("Заблокировано");
ТаблицаДанныхСТерминала.НоваяКолонка("ЦенаСклад");
ТаблицаДанныхСТерминала.НоваяКолонка("Алко");
ТаблицаДанныхСТерминала.НоваяКолонка("ПроверкаЧМ");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоСН");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоКод");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоНаим");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоКодВ");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоОбъем");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоКрепость");
ТаблицаДанныхСТерминала.НоваяКолонка("Производитель");
ТаблицаДанныхСТерминала.НоваяКолонка("ПроизвИНН");
ТаблицаДанныхСТерминала.НоваяКолонка("ПроизвКПП");
ТаблицаДанныхСТерминала.НоваяКолонка("АлкоПДФ");
Для инд = 0 По ДокументыТерминалов.Количество - 1 Цикл
ДокументТерминала = ДокументыТерминалов.Элемент(инд);
// Все документы сбора начальных остатков мы можем собрать в одну ТЗ
Если ДокументыТерминалов.Элемент(инд).ИмяТипаДокумента = "Сбор начальных остатков" Тогда
СтрокиДокументаПлан = ДокументТерминала.СтрокиПлан;
КоличествоСтрокПлан = СтрокиДокументаПлан.Количество;
СтрокиДокументаФакт = ДокументТерминала.СтрокиФакт;
КоличествоСтрокФакт = СтрокиДокументаФакт.Количество;
Для СтрокаФакт = 0 по СтрокиДокументаФакт.Количество - 1 Цикл
ТекущаяСтрокаДокумента = СтрокиДокументаФакт.Элемент(СтрокаФакт);
СтрокаТЗ = ТаблицаДанныхСТерминала.Добавить();
Для Каждого Колонка из ТаблицаДанныхСТерминала.Колонки Цикл
СтрокаТЗ[Колонка.Имя] = ТекущаяСтрокаДокумента.ПолучитьПоле(Колонка.Имя);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
// Всё, таблица готова для дальнейшей обработки в 1С

Получение документов из Mobile SMARTS

Document GetDocument(string id)

Параметр

Тип

Описание

id

string

Идентификатор документа для получения. Если такой документ не найден будет возвращен null.

DocumentCollection GetDocuments(string docType, bool checkForFinish)

Параметр

Тип

Описание

docType

string

Имя типа документов для возврата. Если передана пустая строка, то будут возвращены документы всех типов.

checkForFinish

bool

Флаг, указывающий возвращать только завершенные документы или все подряд.

В отличие от выгрузки, в загруженном документе извлекать данные следует не из строк плана, а из  фактических строк  CurrentItems.

Пример кода для произвольной учетной системы через компоненту COM

connection = new COM("Cleverence.Warehouse.StorageConnector");
connection.SelectCurrentApp(СтрокаПодключения);
//запрашиваем завершенные документы всех типов
var docs = connection.GetDocuments("", true);
for(int i = 0; i< docs.Count; i++) //цикл по полученным документам
{
  var doc = docs.Item(i);
// var doc = docs[i];
for(int j = 0; j< doc.CurrentItems.Count; j++) //цикл по строкам факт документа
{
var dItem = doc.CurrentItems.Item(j);
//запрос полей из строки
string prodId = dItem.GetField("ProductId"); //код товара
string packId = dItem.GetField("PackingId"); //код упаковки
double qty =  dItem.GetField("CurrentQuantity"); //факт кол-во в строке
string alcoCode = dItem.GetField("АлкоКод"); //код упаковки
//...
//получение остальных полей, согласно таблице доступных полей
//...
}
}

Поля строк документа для получения из фактических строк

Поле

Тип

Основное/доп.

Описание

ProductID

String

основное

Идентификатор товара, для которого описана данная позиция.

PackingID

String

основное

Идентификатор упаковки для заданного товара. Товар задается свойством ProductId [ИдТовара].

CurrentQuantity

Double

основное

Фактическое количество товара в заданном виде упаковки.

descr

String

дополнительное

Характеристика товара (если ведется учет с характеристиками).

serial

String

дополнительное

Серия товара (если используется учет по сериям).

price

Decimal

дополнительное

Цена единицы товара в строке.

Алко

Boolean

дополнительное

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

АлкоКод

String

дополнительное

Код алкогольной продукции в ЕГАИС, полученный из отсканированных марок.

АлкоПДФ

String

дополнительное

Строка с PDF 417.

АлкоСН

string

дополнительное

Серийный номер бутылки, если сканировался.

ПроверкаЧМ

Boolean

дополнительное

Признак того, что данная конкретная марка проверялась в CheckMark на легальность.

Производитель

String

дополнительное

Наименование производителя продукции в ЕГАИС, если уже известно для данного товара, либо если было получено из CheckMark.

ПроизводительИНН

String

дополнительное

ИНН производителя, если уже известен для данного товара, либо если был получен из CheckMark.

ПроизводительКПП

String

дополнительное

КПП производителя, если уже известен для данного товара, либо если был получен из CheckMark.

АлкоНаим

String

дополнительное

Наименование товара из ЕГАИС, если уже известно для данного товара, либо если было получено из CheckMark.

АлкоКодВ

String

дополнительное

Код вида алкогольной продукции из ЕГАИС, если уже известен для данного товара, либо если был получен из CheckMark.

АлкоОбъем

Decimal

дополнительное

Ёмкость тары в литрах из ЕГАИС, если уже известна для данного товара, либо если была получена из CheckMark.

АлкоКрепость

Decimal

дополнительное

Процентное содержание спирта из ЕГАИС, если уже известно для данного товара, либо если было получен из CheckMark.

 

АлкоЕстьВФормах

Boolean

дополнительное

Признак того, что данная марка была найдена в выгруженных формах А.

КодФормыА

String

дополнительное

Код формы А, где была найдена марка.

ДатаРозлива

DateTime

дополнительное

Дата розлива позиции, если вводилась, иначе null.

Удаление документа

После успешной загрузки его необходимо удалить из Mobile SMARTS, иначе при следующем запрсое он опять будет возвращен.

RemoveDocument(string documentId)

Параметр

Тип

Описание

id

string

Идентификатор документа для удаления.


Пример кода для произвольной учетной системы через компоненту COM

connection = new COM("Cleverence.Warehouse.StorageConnector");
connection.SelectCurrentApp(СтрокаПодключения);
//удаление конкретного документа по его идентификатору
connection.RemoveDocument(doc.Id);