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