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

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
25
25 Скачать (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

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

См. также

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

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

3000 руб.

12.05.2020    29492    140    100    

93

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

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

1500 руб.

17.09.2018    37476    116    128    

117

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

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

3600 руб.

02.09.2010    78309    73    280    

191

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

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

2400 руб.

04.05.2018    47979    125    66    

68

Разработка внешних компонент Системный администратор Программист Стажер Бесплатно (free)

Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

14.01.2025    3033    bayselonarrend    14    

50

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

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

04.12.2024    5954    kovalevdmv    26    

79

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

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

2400 руб.

25.06.2024    1451    3    4    

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

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

Можно в макете скд например хранить все запросы обработки. Без них обработка может быть бесполезна
23. MRAK 729 20.01.16 10:16 Сейчас в теме
(16) CyberCerber, часть кода можно хранить в текстовом макете
20. frkbvfnjh 811 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 882 15.01.16 09:50 Сейчас в теме
(12) klinval, и то верно... Значит, надо еще пароль накладывать или модуль исключать.Тогда при вскрытии, как я понимаю, обработку надо будет пересохранить, а следовательно весь нужный код удалится.
5. frkbvfnjh 811 14.01.16 11:05 Сейчас в теме
Да CyberCerber , внешняя компонента находится в макете каждой обработки. В двоичный макет пока не могу писать. Попробую разобраться с исходниками V8Unpack, возможно напишу более интересную вещь.
6. frkbvfnjh 811 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 811 14.01.16 12:45 Сейчас в теме
Да, думаю смогу собрать компоненту под Linux, надо только время выбрать
15. caponid 15.01.16 12:28 Сейчас в теме
(10) будем ждать... только нужно под Lin как х86 так и х64
17. alex_4x 88 15.01.16 15:00 Сейчас в теме
Было бы прикольно научиться записывать изменения в модуль кода внутри обработки :-)
18. Lancelot-2M 115 15.01.16 16:09 Сейчас в теме
по поводу потери данных при сохранении - я с помощью v8Unpack докидывал файл в обработку и после пересохранения обработки конфигуратором ничего не терялось.
19. frkbvfnjh 811 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 5011 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 811 06.03.16 06:46 Сейчас в теме
(27) vec435, добавил очистку и сжатие...
28. frkbvfnjh 811 26.02.16 07:12 Сейчас в теме
Да, о полном удалении данных чёт не подумал... В принципе можно сохранить в обработку значение "Неопределено", но это все равно будет значение, и все равно будет занимать место, хотя и совсем не много. Думаю добавлю такой метод, и пожалуй добавлю сжатие данных deflate'ом.
30. fishca 1260 15.03.16 16:36 Сейчас в теме
Макеты (файлы справки к примеру, насколько я понимаю) объектов хранятся в виде сжатых данных по алгоритму Deflate в виде Base64 строки. Так что теоретически засунуть в обработку возможно все :)
31. fishca 1260 15.03.16 16:38 Сейчас в теме
И вполне возможно создавать свои объекты (макеты), главное их формат сохранить
32. rus128 2 27.07.16 16:23 Сейчас в теме
Как истинный перфекционист - заметил опечатки в описании:
1) "имеет всего 2 метода" - так 3 метода же! :-)
2) "степень сжатия данных ввиде числа" - нужен пробел для "в_виде";
3) в описании 3-го метода - "прЕводит";
4) в описании свойства "Версия" - "данноЙ свойство";
5) "можно использовать и с внешними отчета" - упущено "...МИ";
6) "лишь демонстрирую(?) пример работы" - пропущено "Т".
33. cprit 909 28.01.20 19:03 Сейчас в теме
Есть ли сборка под linux? Или только винда?
Разработка интересная, но без кроссплатформенности мне не подойдет
34. frkbvfnjh 811 29.01.20 07:10 Сейчас в теме
(33) Интересный вопрос. На данный момент - нет, но думаю можно будет собрать, правда может встать проблема, что эта компонента будет работать только если 1С будет запускаться с полными правами, т.к. Линукс очень параноидален. Если соберу, то отпишусь.
35. cprit 909 29.01.20 08:17 Сейчас в теме
36. mrcamomile 84 20.04.20 17:06 Сейчас в теме
Идея супер. У меня взлетело на серверной под винду только если ставлю разрядность х32.
Сделал обработку ПереносРолейПользователяИБ на базе этой обработки - решает такой кейс: мне в тестовый контур перед обновлением надо тестировать под пользователем с ролями рабочей базы. Для этого:
- захожу в рабочую, выбираю пользователя, сохраняю роли пользователя
- захожу в тестовую, выбираю пользователя, заменяю роли пользователя
37. v77 161 10.03.24 12:12 Сейчас в теме
А зачем ВК здесь нужна, не понятно.
38. v77 161 10.03.24 22:11 Сейчас в теме
Можно же средствами 1с записать в файл обработки всё, что угодно. Или это для 7.7?
39. frkbvfnjh 811 11.03.24 11:44 Сейчас в теме
(38) На момент написания публикации 1С 8.x не умела работать с двоичными данными. Кроме того одну и туже задачу можно решить разными способами, в данном случае используется внешняя компонента и небольшое количество кода 1С.
Оставьте свое сообщение