Имя: Пароль:
1C
1С v8
Запуск консольного приложения из макета с двоичными данными
0 napagokc
 
30.10.13
14:58
Поделитесь опытом, пожалуйста...
Мне нужно уменьшить размер картинок товаров. Погуглил, остановился на идее использовать консольное приложение "convert.exe" из пакета ImageMagick. Хочу реализовать работу с этим конвертором через обычную внешнюю обработку, без какой-либо дополнительной установки ПО, т.к. обработку потом нужно будет разослать в филиалы, чтобы там ей воспользовались. Т.к. у всех разные ОС и разный уровень знаний, хочу всю работу пользователей свести до выбора каталога и нажатия кнопки.

Теперь как пытаюсь решить проблему. Загрузил программу в Макет обработки с типом макета Двоичные данные. И вот тут у меня затык. Гугл дает совет, что нужно программно сохранять из макета ехе-файл на диск и там уже запускать с нужными параметрами. Так ли это на самом деле? В и-нете нашел древнюю обработку Asmody, где он не сохраняет приложение на диск, а запускает как-то прямо так. К сожалению, она по каким-то причинам не работает - приложение действительно запускается (даже без сохранения на диск), но потом аварийно закрывается. Не удалось разобраться в чем причина, но факт того, что обработка запустила исполняемый файл без сохранения на диск - есть.
Вопрос: как это сделать?

Основной код из обработки Asmody прилагаю (обработка распространялась бесплатно и поэтому, надеюсь, я не нарушаю его авторских прав, выкладывая код здесь):
1 napagokc
 
30.10.13
14:58
+(0) Код:

Var __ExecFiles;
Var __IMDir;

// основная реализация библиотеки
function __getModule(module =  "mogrify", include_path=false)
    __execModule = "";
    if not __ExecFiles.Property(module, __execModule) then
        __execModule = module+".exe";
        bin=GetTemplate(module+"_exe");
        bin.write(__IMDir+__execModule);
        __ExecFiles.insert(module,__execModule);
    endif;
    return ?(include_path, __IMDir, "")+__execModule;
endfunction

function __saveToIM(picture, picture_name="", include_path=false) export
    if typeof(picture)=type("Картинка") then
        if picture_name="" then
            picture_name=string(new UUID())+".jpg";
        endif;
        if picture.format()<>ФорматКартинки.JPEG then
            picture=convert(picture);
        endif;
        
        picture.write(__IMDir+picture_name);
        return ?(include_path, __IMDir, "")+picture_name;
    else
        raise("Save file error: it is not a picture.");
        return undefined;
    endif;
endfunction

function convert(picture, toFormat="JPG") export
    __execMogrify = __getModule("mogrify");
    picture=picture.convert(ФорматКартинки.PNG);
    tempName=string(new UUID());
    picture.write(__IMDir+tempName+".png");
    
    commandLine=""""+__execMogrify+""" -format "+toFormat+" """+tempName+".png""";
    Сообщить(commandLine);
    System("start """" /WAIT /MIN "+commandLine, __IMDir);
    picture=new Картинка(__IMDir+tempName+".jpg");    
    DeleteFiles(__IMDir, tempName+".*");
    return picture;
endfunction

function resize(picture, picture_name="", x_size=200, y_size=200) export
    __execMogrify = __getModule("mogrify");
    if typeof(picture)=type("Картинка") then
        pic_file=__saveToIM(picture, picture_name);
    elsif typeof(picture)=type("Строка") then
        __file=new file(__IMDir+picture);
        if not __file.exist() then
            raise("File not found: "+__IMDir+picture);
            return undefined;
        endif;
        pic_file=picture;
    endif;
    
    commandLine=""""+__execMogrify+""" -resize "+format(x_size,"ЧГ=")+"x"+format(y_size,"ЧГ=")+" """+pic_file+"""";
    Сообщить(commandLine);
    System("start """" /WAIT /MIN "+commandLine, __IMDir);
    picture=new Картинка(__IMDir+pic_file);    
    DeleteFiles(__IMDir, pic_file);
    return picture;    
endfunction

function rotate(picture, picture_name="", degree=90) export
    __execMogrify = __getModule("mogrify");
    if typeof(picture)=type("Картинка") then
        pic_file=__saveToIM(picture, picture_name);
    elsif typeof(picture)=type("Строка") then
        __file=new file(__IMDir+picture);
        if not __file.exist() then
            raise("File not found: "+__IMDir+picture);
            return undefined;
        endif;
        pic_file=picture;
    endif;
    
    commandLine=""""+__execMogrify+""" -rotate "+format(degree,"ЧГ=")+" """+pic_file+"""";
    Сообщить(commandLine);
    System("start """" /WAIT /MIN "+commandLine, __IMDir);
    picture=new Картинка(__IMDir+pic_file);    
    DeleteFiles(__IMDir, pic_file);
    return picture;    
endfunction
2 napagokc
 
30.10.13
15:05
...или он сохраняет все-таки ече-файл на диск, а потом удаляет. Сейчас только начал внимательно вчитываться...