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

10.08.16

Разработка - Разработка внешних компонент

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

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

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

Захотел решить для себя интересную задачу - хранение произвольных данных во внешней обработке/отчете. Как-то давным-давно, мне хотелось сделать такую обработку, чтобы все накапливаемые данные носить вместе с ней, но тогда не знал, как такое сделать. Я понимаю, что для большинства людей это может показаться бесполезной фиговиной, но повторюсь - писал для себя и по большей части потому, что было просто интересно реализовать такую возможность.
Внешняя компонента написана по технологии 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

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

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52099    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26243    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44974    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35078    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    53998    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30839    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4038    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4778    starik-2005    32    

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

Запросил конфигурацию оборудования у клиента, прошил в обработке - привязал к машине :) И без v8Unpack не достанешь
CyberCerber; +1 Ответить
11. CyberCerber 852 14.01.16 13:23 Сейчас в теме
(4) Evil Beaver, вот только, чтобы сделать защиту, надо зашить в данные почти весь функционал обработки. Иначе можно просто закомментить эту проверку.
Ну а тут надо протестить, не повлияет ли это на быстродейстиве и работоспособность.
14. ekaruk 4896 15.01.16 11:19 Сейчас в теме
(11) CyberCerber, Весь не обязательно.
Можно даже не закрывать.
Достаточно просто поместить макеты внутрь обработки.
А проверка может быть простейшая. Например "Если ТекущаяДата()>"20160201" Тогда Возврат"
Как только пользователь захочет ее убрать, ему придется пересохранить обработку и макеты просто исчезнут.
Я динамически выловить макеты не внося изменения в код не каждый сможет даже из программистов, не говоря уже о пользователях.
Evil Beaver; adhocprog; frkbvfnjh; +3 Ответить
16. CyberCerber 852 15.01.16 14:53 Сейчас в теме
(14) ekaruk, да, если главное в обработке - макеты, то как раз то, что нужно. Это для отчетов хорошо. А вот если весь смысл в коде...
22. Ibrogim 1311 18.01.16 09:00 Сейчас в теме
(16) CyberCerber,
да, если главное в обработке - макеты, то как раз то, что нужно. Это для отчетов хорошо. А вот если весь смысл в коде...

Можно в макете скд например хранить все запросы обработки. Без них обработка может быть бесполезна
23. MRAK 723 20.01.16 10:16 Сейчас в теме
(16) CyberCerber, часть кода можно хранить в текстовом макете
20. frkbvfnjh 785 16.01.16 07:09 Сейчас в теме
(14) ekaruk, идея кстати хорошая, хранимую информацию в обработке можно использовать как одноразовый "предохранитель", т.е. к примеру, можно сохранить в обработке другую обработку в виде двоичных данных в которой и будет весь нужный функционал. Эту обработку можно будет подключить как внешнюю из двоичных данных. В основной обработке, например, сделать проверку какой-нибудь лицензии для подключения хранимой в двоичных данных обработки. И все это писать наглым открытым кодом, ведь чтобы отключить проверку, нужно как минимум закоментить эту проверку и сохранить обработку. А вот тут-то "предохранитель" и сгорит. Обработку из двоичных данных к слову можно будет пересохранить в др. файл через отладку, но здесь тоже можно схитрить. Ко всему прочему во внешнюю компоненту можно добавить какое-нибудь простенькое шифрование, на случай если смогут "выкорчевать" сохраненные в обработке данные, тогда их нужно будет еще и дешифровать. Так что основной недостаток данной обработки можно использовать даже как преимущество. А обработка, в которой данные будут сохраняться после перезаписи, будет использоваться для совершенно других целей. Даже сам не думал, что данное решение можно попробовать в качестве защиты. Хотя может не все так просто и я пока что не вижу полной картины, но так или иначе все в конечном счете можно взломать...
rais; Dach; apic; +3 Ответить
12. klinval 337 15.01.16 09:34 Сейчас в теме
Идея прикольная, вот только где бы её применить....
(4) Evil Beaver, (11) CyberCerber, в отладке Shift+F9 и видишь всё что вернула обработка по LoadDataFromExternalObject. Т.е. код и конфигурацию оборудования там не скроешь от программиста.
13. CyberCerber 852 15.01.16 09:50 Сейчас в теме
(12) klinval, и то верно... Значит, надо еще пароль накладывать или модуль исключать.Тогда при вскрытии, как я понимаю, обработку надо будет пересохранить, а следовательно весь нужный код удалится.
5. frkbvfnjh 785 14.01.16 11:05 Сейчас в теме
Да CyberCerber , внешняя компонента находится в макете каждой обработки. В двоичный макет пока не могу писать. Попробую разобраться с исходниками V8Unpack, возможно напишу более интересную вещь.
6. frkbvfnjh 785 14.01.16 11:20 Сейчас в теме
Исходник пока не буду выкладывать. возможно позже... Там все ооочень просто. Если ни у кого не будет нареканий на работу таких обработок, то позже гляди и исходник опубликую.
7. Davurov 14.01.16 11:27 Сейчас в теме
Круто! Как появятся старт мани, скачаю =)
8. kostik_love 308 14.01.16 11:39 Сейчас в теме
Круто! Начал думать- где я это смогу применить...
Плюс однозначно!
9. Romany 14.01.16 11:58 Сейчас в теме
Здравствуйте. А вот скажите, будет ли работать это решение на платформе linux? Было бы замечательно, если Вы спроектировали компоненту кроссплатформенной. Или я не о том?
kostik_love; +1 Ответить
10. frkbvfnjh 785 14.01.16 12:45 Сейчас в теме
Да, думаю смогу собрать компоненту под Linux, надо только время выбрать
15. caponid 15.01.16 12:28 Сейчас в теме
(10) будем ждать... только нужно под Lin как х86 так и х64
17. alex_4x 85 15.01.16 15:00 Сейчас в теме
Было бы прикольно научиться записывать изменения в модуль кода внутри обработки :-)
18. Lancelot-2M 115 15.01.16 16:09 Сейчас в теме
по поводу потери данных при сохранении - я с помощью v8Unpack докидывал файл в обработку и после пересохранения обработки конфигуратором ничего не терялось.
19. frkbvfnjh 785 16.01.16 06:42 Сейчас в теме
(18) Lancelot-2M, да, в будущем примерно так и хочу сделать
21. kite2 58 17.01.16 13:33 Сейчас в теме
Не качал, но пометил звездой, просто чтобы не забыть
24. Рэйв 126 21.01.16 08:10 Сейчас в теме
А чего бы в макетах не хранить как двоичные данные то что гоняется через ВК? У меня так в одной внешней обработке собран весь инструментарий чтобы все в одном месте лежало. И никаких ВК не надо
25. ekaruk 4896 21.01.16 11:10 Сейчас в теме
(24) Рэйв, Смысл в том, что ВК в процессе работы позволяет программно сохранять данные в саму обработку, т.е. в ее файл.
Макеты нужно делать отдельно вручную в конфигураторе.
frkbvfnjh; +1 Ответить
26. vec435 15 25.02.16 14:46 Сейчас в теме
конечно сохранение доп. данных в макета через V8Unpack - то чего так не хватает
27. vec435 15 25.02.16 14:49 Сейчас в теме
есть ли очистка от ненужных данных?
29. frkbvfnjh 785 06.03.16 06:46 Сейчас в теме
(27) vec435, добавил очистку и сжатие...
28. frkbvfnjh 785 26.02.16 07:12 Сейчас в теме
Да, о полном удалении данных чёт не подумал... В принципе можно сохранить в обработку значение "Неопределено", но это все равно будет значение, и все равно будет занимать место, хотя и совсем не много. Думаю добавлю такой метод, и пожалуй добавлю сжатие данных deflate'ом.
30. fishca 1254 15.03.16 16:36 Сейчас в теме
Макеты (файлы справки к примеру, насколько я понимаю) объектов хранятся в виде сжатых данных по алгоритму Deflate в виде Base64 строки. Так что теоретически засунуть в обработку возможно все :)
31. fishca 1254 15.03.16 16:38 Сейчас в теме
И вполне возможно создавать свои объекты (макеты), главное их формат сохранить
32. rus128 2 27.07.16 16:23 Сейчас в теме
Как истинный перфекционист - заметил опечатки в описании:
1) "имеет всего 2 метода" - так 3 метода же! :-)
2) "степень сжатия данных ввиде числа" - нужен пробел для "в_виде";
3) в описании 3-го метода - "прЕводит";
4) в описании свойства "Версия" - "данноЙ свойство";
5) "можно использовать и с внешними отчета" - упущено "...МИ";
6) "лишь демонстрирую(?) пример работы" - пропущено "Т".
33. cprit 874 28.01.20 19:03 Сейчас в теме
Есть ли сборка под linux? Или только винда?
Разработка интересная, но без кроссплатформенности мне не подойдет
34. frkbvfnjh 785 29.01.20 07:10 Сейчас в теме
(33) Интересный вопрос. На данный момент - нет, но думаю можно будет собрать, правда может встать проблема, что эта компонента будет работать только если 1С будет запускаться с полными правами, т.к. Линукс очень параноидален. Если соберу, то отпишусь.
35. cprit 874 29.01.20 08:17 Сейчас в теме
36. mrcamomile 79 20.04.20 17:06 Сейчас в теме
Идея супер. У меня взлетело на серверной под винду только если ставлю разрядность х32.
Сделал обработку ПереносРолейПользователяИБ на базе этой обработки - решает такой кейс: мне в тестовый контур перед обновлением надо тестировать под пользователем с ролями рабочей базы. Для этого:
- захожу в рабочую, выбираю пользователя, сохраняю роли пользователя
- захожу в тестовую, выбираю пользователя, заменяю роли пользователя
37. v77 160 10.03.24 12:12 Сейчас в теме
А зачем ВК здесь нужна, не понятно.
38. v77 160 10.03.24 22:11 Сейчас в теме
Можно же средствами 1с записать в файл обработки всё, что угодно. Или это для 7.7?
39. frkbvfnjh 785 11.03.24 11:44 Сейчас в теме
(38) На момент написания публикации 1С 8.x не умела работать с двоичными данными. Кроме того одну и туже задачу можно решить разными способами, в данном случае используется внешняя компонента и небольшое количество кода 1С.
Оставьте свое сообщение