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

10.08.16

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ExtDataSaver (обычное приложение)
.epf 95,23Kb ver:1.0
15
15 Скачать (1 SM) Купить за 1 850 руб.
ExtDataSaver Async (управляемое приложение, асинхронный режим)
.epf 93,08Kb ver:1.0
24
24 Скачать (1 SM) Купить за 1 850 руб.

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

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

18000 руб.

30.05.2017    53810    9    69    

46

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

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

2400 руб.

04.05.2018    46963    123    66    

66

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

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

3000 руб.

12.05.2020    28391    138    100    

90

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

Внешняя компонента для конвертации PDF файлов в картинки без использования дополнительных программ. Работает на сервере и в тонком клиенте.

2400 руб.

25.06.2024    959    2    3    

2

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

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    3469    2    0    

4

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

Внешняя компонента в виде библиотеки (.dll файл), позволяющая посылать команды и получать ответы по протоколу WebSocket из 1С. Компонента работает только на стороне "клиента".

4440 руб.

22.06.2020    18224    18    33    

22

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

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

3600 руб.

02.09.2010    77352    72    257    

191

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

В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.

04.12.2024    3650    kovalevdmv    26    

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

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

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