Книга знаний

1С:Предприятие / v8 / Приемы программирования

v8: Хранение в хранилище обработок и файлов

Описана методика хранения в хранилище обработок(отчетов) и файлов.Автор статьи:
Последняя редакция №1 от 12.01.07
URL: http://kb.mista.ru/article.php?id=443

Ключевые слова: хранилище,обработка,отчет,файл


К сожалению, 1С не позволяет хранить обработки и отчеты в переменных типа "Хранилище".
Приходится извращаться. Код основан на типовых конфигурациях (не мое изобретение).

Для начала рассмотрим две функции по сохранению файла в переменную хранилища и извлечения этого файла из хранилища.

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

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


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


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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика