Каталог решений - Сжатие данных в мобильном приложении 1С:Предприятие

Сжатие данных в мобильном приложении 1С:Предприятие

Сжатие данных в мобильном приложении 1С:Предприятие

В наличии

Эту небольшую статью я планировал опубликовать у себя на сайте, чтобы такие любители мобильного приложения от 1С:Предприятие, как я, могли использовать её без дополнительно потраченных двух дней на поиски вариантов написания алгоритма.
Во-первых, хотел сказать, что я небольшой разработчик, который начинал делать свои первые шаги ещё на заре правления «Семерки». Новая платформа версии 8 была как глоток свежего воздуха — бодрящий и легко воспринимаемый организмом. Я был очень удивлен, да что сказать, до сих пор удивляюсь как элементарные вещи можно делать на 1С, и как это стремно делается на других языках программирования. Во-вторых, обилие разнообразных интерпретаций платформы позволяет развернуться на все 360 градусов, захватив своими проектами, наверное, любые ветки бизнеса.
Так вот, о небольшом нюансе работы с новой мобильной платформой я и хотел рассказать… Сам додумался, так сказать.

Категория:

Описание

Я начал разрабатывать свой аналог мобильного приложения 1С:Заказы еще два года назад, но две версии программного продукта канули в лету: жесткий диск первого раза, а во второй раз проект убила моя лень.

Понимая, что в силу моих убеждений и лени, круто было бы иметь свою программу, которую можно допиливать как тебе угодно. При этом никого не просишь и никому не кланяешься в "допиливании" тех или иных опций. Поэтому все-таки отложил свои "откладывания" в длинный ящик и начал по новой верстать приложение.

Идея программы была простая и аналогична уже существующему приложению 1С:Заказы, за исключением несколько иного принципа обмена данными между самим приложением и учетной системой. Как правило, учетной системой на другой стороне обмена выступала такая же 1С, но с огромным функционалом типовых конфигураций. Сейчас приложение, пока что, работает только с УТП для Украины, но не суть…

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

Что касается приложения, то мы имеем примерно вот такую структуру…

Основные опции:

1. Обмен заказами;

2. Обмен товарами, остатками, ценами;

3. Обмен параметрами работы менеджеров.

4. Пару документов, типа задачи, обмен координатами, показатели одометра и прочее.

Весь этот список, состоящий из пары пунктов привел к тому, что из учетной системы на КПК прилетал по почте файл размером более 20 Мб. Это при условии, что товаров около 14000 шт. Иные программы, которые использовались компаниями просто выпадали в осадок при таком количестве товаров с их 10 разными ценами и остатками по 5-6 складах.

Меня не устраивал тот факт, что элементарного обмена по ФТП в 1С до сих пор нет. И это просто громадная печаль! При этом обмен по почте был для меня единственным вариантом обмена. Я понимаю, что можно было бы сделать обмен по прямому подключению к web-серверу, но не у всех клиентов имеется в наличии опубликованная в Веб учетная система. И как правило, предложение осуществить подобное, вызывало массу недовольства у клиентов. Поэтому обмен по Web был исключен. Оставалась только почта.

Но, как я указал выше, есть недостаток — отсутствие сжатия данных! Кто знает почему нет возможности использовать Zip?

Использование внешних программ в моем приложении было бы неверным решением. Я очень хотел все сделать только средствами самой платформы 1С. Использование Acode Tools приводило к сбоям в самой программе. Ведь не у всех был мощный Samsung. В основном Xiaomi или менее мощные смартфоны.

Сжатие я сделал очень просто. В 1С есть ХранилищеЗначения" со степенью сжатия. Формируем в виде структуры в структуре данные, далее записываем его в хранилище значения со степенью сжатия, далее это хранилище записываем с структуру JSON в виде XMLСтрока. Именно эта строка и давала возможность сериализовать ХранилищеЗначения. В противном случае возникала проблема конвертации структуры в JSON. Да, я очень люблю структуры преобразовывать…
 

//Создадим структуру в качестве примера
СтруктураВыгрузки = Новый Структура();
СтруктураВыгрузки.Вставить("КоличествоЭлементовВыгрузки",1234);
	
Сообщить("Всего в файл записано: "+СтруктураВыгрузки.КоличествоЭлементовВыгрузки+" элементов.");
			
// Упакуем данные в аналог ZIP
ХранилищеЗначения = Новый ХранилищеЗначения(СтруктураВыгрузки, Новый СжатиеДанных(9));	
ДанныеВXMLСтроку = XMLСтрока(ХранилищеЗначения);

// Пересоздадим структуру для очистки памяти
СтруктураВыгрузки = Новый Структура();
СтруктураВыгрузки.Вставить("Данные", ДанныеВXMLСтроку);
	    		
// Готовим имя файла для дальнейшего сохранения и выгрузки
АйдиПользователя = ТекПользователь.УникальныйИдентификатор();
ИмяФайла = АйдиПользователя;
ПолноеИмяФайла = КаталогВременныхФайлов() + "update_"+ИмяФайла;
ПолноеИмяФайлаСРасширением = ПолноеИмяФайла + ".json";
	
// Запишем все данные в формате JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ПолноеИмяФайлаСРасширением);       
ЗаписатьJSON(ЗаписьJSON,СтруктураВыгрузки,,);
ЗаписьJSON.Закрыть();

Распаковка данных происходит достаточно быстро и даже 20 мб обмена не влияет на время выполнения кода. Я признаться, не замерял отладчиком, но визуально такие обмены происходят в допустимых скоростях. При этом использовались исключительно средства самой 1С, чего было достаточно, что бы обмен успешно отработал в тестовом режиме уже более 2 месяцев. Без ошибок в упаковке-распаковке.
 

// Чтение файла обновления
ЧтениеJSON = Новый ЧтениеJSON(); 
ЧтениеJSON.ОткрытьФайл(ФайлДанных); 
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON); 
ЧтениеJSON.Закрыть();

// Данные упакованы в хранилище значения со степенью сжатия 9. Аналог ZIP	
ХранилищеЗначения = XMLЗначение(Тип("ХранилищеЗначения"),СтруктураОтвета.Данные);	
СтруктураОтвета = ХранилищеЗначения.Получить();
	
// Проверка перед началом работы
Если ТипЗнч(СтруктураОтвета) <> Тип("Структура") Тогда
    Ответ = Общий.ВернутьРезультатПользователю("Файл обновления поврежден!",Ложь,Истина, Истина);			
    Возврат Ответ;		
КонецЕсли;

// Далее уже работа по обработке данных файла обмена

Можно сказать, что это очень легко и можно таких примеров кода найти кучу, но поверьте я искал и именно для мобильного приложения не нашел даже пары строк в подобной интерпретации. Что бы было понятно, легко и быстро в интеграции. Все в основной массе предлагали записывать с Zip какими-то путями потом его распаковывать, а тут способ легкий и без проблем исполняемый.

Лучшего способа я не нашел, а потому принимаю любую критику в обмен на мою благодарность. 🙂

has been added to your cart:
Оформление заказа