gifts2017

Внешняя компонента для хранения данных во внешней обработке/отчете

Опубликовал Андрей Лукин (frkbvfnjh) в раздел Программирование - Внешние компоненты

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

Захотел решить для себя интересную задачу - хранение произвольных данных во внешней обработке/отчете. Как-то давным-давно, мне хотелось сделать такую обработку, чтобы все накапливаемые данные носить вместе с ней, но тогда не знал, как такое сделать. Я понимаю, что для большинства людей это может показаться бесполезной фиговиной, но повторюсь - писал для себя и по большей части потому, что было просто интересно реализовать такую возможность.
Внешняя компонента написана по технологии Native API, имеет всего 3 метода и 1 свойство.

Методы:
1. "SaveDataInExternalObject" ("СохранитьДанныеВоВнешнийОбъект") - сохраняет данные во внешнюю обработку/отчет. Имеет три параметра. 1-ый параметр - имя файла внешней обработки/отчета. 2-ой параметр - сами данные в виде строки. 3-й параметр - степень сжатия данных в виде числа от 0 до 9 (0 - не использовать сжатие). Значение никакое не возвращает.
2. "LoadDataFromExternalObject", ("ЗагрузитьДанныеИзВнешнегоОбъекта") - загружает данные из внешней обработки/отчета. Имеет один параметр - имя файла внешней обработки/отчета. Возвращает сохраненные данные в виде строки.
3. "DeleteDataFromExternalObject", ("УдалитьДанныеИзВнешнегоОбъекта") - удаляет данные из внешней обработки/отчета (приводит обработку к первоначальному состоянию). Имеет один параметр - имя файла внешней обработки/отчета. Значение никакое не возвращает.

Свойства:
1. "Version" ("Версия") - содержит версию компоненты в виде строки. Данное свойство доступно только для чтения.
Прилагаемая внешняя обработка демонстрирует сохранение содержимого свой табличной части в сам файл внешней обработки.

Естественно, размер файла обработки увеличивается или уменьшается в зависимости от объема хранимых в обработке данных. Также хочу сказать, что весь программный код без какой-либо доработки можно использовать и с внешними отчетами. Далее я приведу пример кода и обработки для обычного приложения, т.к. он более нагляден. В обработке описаны процедура и функция "обертки" для использования методов внешней компоненты:

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

// Записывает произвольные данные в файл внешней обработки/отчета
//
// Параметры:
//	ОбъектВнешнейКомпоненты - ВнешняяКопонента - Объект внешней компоненты
//  Данные - Произвольный - Данные произвольного типа который можно сериализовать с помощью функции "ЗначениеВСтрокуВнутр"
//
Процедура ЗаписатьДанныеВоВнешнийОбъект(ОбъектВнешнейКомпоненты, Данные) Экспорт
	ИмяФайла = ЭтотОбъект.ИспользуемоеИмяФайла;
	ОбъектВнешнейКомпоненты.СохранитьДанныеВоВнешнийОбъект(ИмяФайла, ЗначениеВСтрокуВнутр(Данные));
КонецПроцедуры
// Удаляет данные из файла внешней обработки/отчета (приводит файл к первоначальному состоянию)
//
// Параметры:
//	ОбъектВнешнейКомпоненты - ВнешняяКопонента - Объект внешней компоненты
//
Процедура УдалитьДанныеИзВнешнегоОбъекта(ОбъектВнешнейКомпоненты) Экспорт
	ИмяФайла = ЭтотОбъект.ИспользуемоеИмяФайла;
	ОбъектВнешнейКомпоненты.УдалитьДанныеИзВнешнегоОбъекта(ИмяФайла);
КонецПроцедуры

Данные процедуры и функции лишь демонстрируют пример работы с методами внешней компоненты.
В качестве практического примера использования можно привести какой-нибудь внешний универсальный отчет, который хранит все свои настройки в себе. А вообще применение, как всегда, зависит исключительно от фантазии программиста. Недостатком такого хранения данных является то, что все данные сохраненные во внешней обработке/отчете автоматически стираются, если обработку/отчет открыть в конфигураторе и пересохранить. Как вариант можно установить обработке атрибут "только чтение", тогда конфигуратор при сохранении будет просить указать ему др. имя файла, а в обработке перед сохранением данных программно снимать атрибут "только чтение" и устанавливать его после сохранения данных.

Также упомяну, что не несу никакой ответственности за сохранность данных при использовании моей компоненты, используйте ее только на свой страх и риск. У меня вроде нормуль все работает. Если кому будет интересно, то попробую оптимизировать компоненту под работу с большими объемами данных.

В данной публикации можно скачать обработку для обычного приложения и для управляемого приложения, работающего в асинхронном режиме. Обработка для управляемого приложения написана в спешке, так что красивый код напишите сами. Обработки проверялись на платформе 8.3.6.2390.

P.S. Это моя первая публикация, прошу сильно не унижать...

Update 2016.03.02
1. Обновил внешнюю компоненту: по наводке vec435 добавил метод "УдалитьДанныеИзВнешнегоОбъекта";
2. Обновил внешнюю компоненту: добавил возможность сжатия данных методом Deflate (3-й параметр метода "СохранитьДанныеВоВнешнийОбъект");
3. Обновил обработки для обычного и управляемого приложения; 

Update 2016.01.16
Обновил обработку для управляемого приложения: постарался сделать код более чистым, наглядным, и исправил несколько недочетов. Сподвиг меня на это mrXoxot

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ExtDataSaver (обычное приложение)
.epf 95,23Kb
28.07.16
9
.epf 1.0 95,23Kb 9 Скачать
ExtDataSaver Async (управляемое приложение, асинхронный режим)
.epf 93,08Kb
28.07.16
14
.epf 1.0 93,08Kb 14 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Константин Гейнрих (CyberCerber) 14.01.16 09:42
Интересная штуковина!
А внешняя компонента идет вместе с обработкой?
Конечно, то, что данные перезатираются при сохранении - это серьезный минус...
А куда записываете эти данные? Не можете реализовать запись в спец макет с двоичными данными? Тогда ничего перезатираться не будет.
P.S. Зашел из-за бутылки Клейна. Хорошая иллюстрация. :-)
2. Allexey (alex_4x) 14.01.16 10:40
Исходников самой внешней компоненты нет ?
Nikola23; +1 Ответить
3. Евгения Карук (ekaruk) 14.01.16 10:53
Интересная идея.
Хороша как защита от изменения внешней обработки пользователем.
Изменил что-то и уже не работает.
Evil Beaver; +1 Ответить 1
4. Андрей Овсянкин (Evil Beaver) 14.01.16 11:01
(3) ekaruk, а ведь отличная идея же! И обфусцировать не надо!

Запросил конфигурацию оборудования у клиента, прошил в обработке - привязал к машине :) И без v8Unpack не достанешь
CyberCerber; +1 Ответить 2
5. Андрей Лукин (frkbvfnjh) 14.01.16 11:05
Да CyberCerber , внешняя компонента находится в макете каждой обработки. В двоичный макет пока не могу писать. Попробую разобраться с исходниками V8Unpack, возможно напишу более интересную вещь.
6. Андрей Лукин (frkbvfnjh) 14.01.16 11:20
Исходник пока не буду выкладывать. возможно позже... Там все ооочень просто. Если ни у кого не будет нареканий на работу таких обработок, то позже гляди и исходник опубликую.
7. Хаким Давуров (Davurov) 14.01.16 11:27
Круто! Как появятся старт мани, скачаю =)
8. Константин Воробьёв (kostik_love) 14.01.16 11:39
Круто! Начал думать- где я это смогу применить...
Плюс однозначно!
9. Роман Якубов (Romany) 14.01.16 11:58
Здравствуйте. А вот скажите, будет ли работать это решение на платформе linux? Было бы замечательно, если Вы спроектировали компоненту кроссплатформенной. Или я не о том?
kostik_love; +1 Ответить
10. Андрей Лукин (frkbvfnjh) 14.01.16 12:45
Да, думаю смогу собрать компоненту под Linux, надо только время выбрать
11. Константин Гейнрих (CyberCerber) 14.01.16 13:23
(4) Evil Beaver, вот только, чтобы сделать защиту, надо зашить в данные почти весь функционал обработки. Иначе можно просто закомментить эту проверку.
Ну а тут надо протестить, не повлияет ли это на быстродейстиве и работоспособность.
12. Валерий К (klinval) 15.01.16 09:34
Идея прикольная, вот только где бы её применить....
(4) Evil Beaver, (11) CyberCerber, в отладке Shift+F9 и видишь всё что вернула обработка по LoadDataFromExternalObject. Т.е. код и конфигурацию оборудования там не скроешь от программиста.
13. Константин Гейнрих (CyberCerber) 15.01.16 09:50
(12) klinval, и то верно... Значит, надо еще пароль накладывать или модуль исключать.Тогда при вскрытии, как я понимаю, обработку надо будет пересохранить, а следовательно весь нужный код удалится.
14. Евгения Карук (ekaruk) 15.01.16 11:19
(11) CyberCerber, Весь не обязательно.
Можно даже не закрывать.
Достаточно просто поместить макеты внутрь обработки.
А проверка может быть простейшая. Например "Если ТекущаяДата()>"20160201" Тогда Возврат"
Как только пользователь захочет ее убрать, ему придется пересохранить обработку и макеты просто исчезнут.
Я динамически выловить макеты не внося изменения в код не каждый сможет даже из программистов, не говоря уже о пользователях.
Evil Beaver; adhocprog; frkbvfnjh; +3 Ответить 2
15. Caponid V (caponid) 15.01.16 12:28
(10) frkbvfnjh, будем ждать... только нужно под Lin как х86 так и х64
16. Константин Гейнрих (CyberCerber) 15.01.16 14:53
(14) ekaruk, да, если главное в обработке - макеты, то как раз то, что нужно. Это для отчетов хорошо. А вот если весь смысл в коде...
17. Allexey (alex_4x) 15.01.16 15:00
Было бы прикольно научиться записывать изменения в модуль кода внутри обработки :-)
18. Rom Shpakoff (Lancelot-2M) 15.01.16 16:09
по поводу потери данных при сохранении - я с помощью v8Unpack докидывал файл в обработку и после пересохранения обработки конфигуратором ничего не терялось.
19. Андрей Лукин (frkbvfnjh) 16.01.16 06:42
(18) Lancelot-2M, да, в будущем примерно так и хочу сделать
20. Андрей Лукин (frkbvfnjh) 16.01.16 07:09
(14) ekaruk, идея кстати хорошая, хранимую информацию в обработке можно использовать как одноразовый "предохранитель", т.е. к примеру, можно сохранить в обработке другую обработку в виде двоичных данных в которой и будет весь нужный функционал. Эту обработку можно будет подключить как внешнюю из двоичных данных. В основной обработке, например, сделать проверку какой-нибудь лицензии для подключения хранимой в двоичных данных обработки. И все это писать наглым открытым кодом, ведь чтобы отключить проверку, нужно как минимум закоментить эту проверку и сохранить обработку. А вот тут-то "предохранитель" и сгорит. Обработку из двоичных данных к слову можно будет пересохранить в др. файл через отладку, но здесь тоже можно схитрить. Ко всему прочему во внешнюю компоненту можно добавить какое-нибудь простенькое шифрование, на случай если смогут "выкорчевать" сохраненные в обработке данные, тогда их нужно будет еще и дешифровать. Так что основной недостаток данной обработки можно использовать даже как преимущество. А обработка, в которой данные будут сохраняться после перезаписи, будет использоваться для совершенно других целей. Даже сам не думал, что данное решение можно попробовать в качестве защиты. Хотя может не все так просто и я пока что не вижу полной картины, но так или иначе все в конечном счете можно взломать...
Dach; apic; +2 Ответить
21. Сэр Артур (kite2) 17.01.16 13:33
Не качал, но пометил звездой, просто чтобы не забыть
22. Иван Титов (Ibrogim) 18.01.16 09:00
(16) CyberCerber,
да, если главное в обработке - макеты, то как раз то, что нужно. Это для отчетов хорошо. А вот если весь смысл в коде...

Можно в макете скд например хранить все запросы обработки. Без них обработка может быть бесполезна
23. Роман Ершов (MRAK) 20.01.16 10:16
(16) CyberCerber, часть кода можно хранить в текстовом макете
24. Иван Иванов (Рэйв) 21.01.16 08:10
А чего бы в макетах не хранить как двоичные данные то что гоняется через ВК? У меня так в одной внешней обработке собран весь инструментарий чтобы все в одном месте лежало. И никаких ВК не надо
25. Евгения Карук (ekaruk) 21.01.16 11:10
(24) Рэйв, Смысл в том, что ВК в процессе работы позволяет программно сохранять данные в саму обработку, т.е. в ее файл.
Макеты нужно делать отдельно вручную в конфигураторе.
frkbvfnjh; +1 Ответить
26. Владимир Чаклин (vec435) 25.02.16 14:46
конечно сохранение доп. данных в макета через V8Unpack - то чего так не хватает
27. Владимир Чаклин (vec435) 25.02.16 14:49
есть ли очистка от ненужных данных?
28. Андрей Лукин (frkbvfnjh) 26.02.16 07:12
Да, о полном удалении данных чёт не подумал... В принципе можно сохранить в обработку значение "Неопределено", но это все равно будет значение, и все равно будет занимать место, хотя и совсем не много. Думаю добавлю такой метод, и пожалуй добавлю сжатие данных deflate'ом.
29. Андрей Лукин (frkbvfnjh) 06.03.16 06:46
(27) vec435, добавил очистку и сжатие...
30. Сергей Рудаков (fishca) 15.03.16 16:36
Макеты (файлы справки к примеру, насколько я понимаю) объектов хранятся в виде сжатых данных по алгоритму Deflate в виде Base64 строки. Так что теоретически засунуть в обработку возможно все :)
31. Сергей Рудаков (fishca) 15.03.16 16:38
И вполне возможно создавать свои объекты (макеты), главное их формат сохранить
32. Ruslan (rus128) 27.07.16 16:23
Как истинный перфекционист - заметил опечатки в описании:
1) "имеет всего 2 метода" - так 3 метода же! :-)
2) "степень сжатия данных ввиде числа" - нужен пробел для "в_виде";
3) в описании 3-го метода - "прЕводит";
4) в описании свойства "Версия" - "данноЙ свойство";
5) "можно использовать и с внешними отчета" - упущено "...МИ";
6) "лишь демонстрирую(?) пример работы" - пропущено "Т".
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа