Имя: Пароль:
1C
 
Редактирование и сохранение .doc файлов в базе
,
0 demmix
 
23.06.14
10:53
Привет всем.
Есть база в которой хранятся doc файлы. Как реализовать возможность редактирование таких файлов? т.е. добавили к документу файлик, потом открыли его, сохранили, и он заменился бы в базе на новый. Файлы хранятся внутри другой sql базы в формате base64, открываются через временные файлы.
1 Fish
 
23.06.14
10:55
(0) А в чём собственно проблема?
2 demmix
 
23.06.14
10:56
Проблема в том что я не могу придумать как. Получили мы строку с base64, преобразовали в двоичные данные, создали временный файл, заполнили его и открыли. Все код в 1с перестал выполняться, как отловить перезапись этого временного файла?
3 Wobland
 
23.06.14
10:57
сделай себе кнопку загрузить
4 demmix
 
23.06.14
10:58
(3) Кнопка загрузить уже есть, это не катит. Лишние действия придется пользователю делать, сохранять отредактированный файл и заново его загружать в базу
5 Wobland
 
23.06.14
11:00
>как отловить перезапись этого временного файла?
имя есть. пускай юзер явно об этом тычет в 1Ске
6 Иешуа
 
23.06.14
11:01
(0) Я давно-давно такое дело делал на 1С-Архиве. Там версионирование штатно работает и получалось открывать файлы в 1С. Но это была семерка и лет семь назад. Но, думаю, что и сейчас есть нечто аналогичное
7 demmix
 
23.06.14
11:02
(5) НУ как то некрасиво получиться. Юзера бы вообще оградить от лишних действия
8 Лодырь
 
23.06.14
11:03
(7) А иначе не отловить.
9 demmix
 
23.06.14
11:03
(6) Хм, открыть в 1с не пробовал еще, спасибо за подсказку.
10 Лодырь
 
23.06.14
11:05
(7) Типовая подсистема хранения присоединенных файлов принципиально не устраивает именно этим?
11 demmix
 
23.06.14
11:06
(10) Да, во первых храниться в базе ток один тип файлов с одним и тем же разрешением, а во вторых нужно редактирование
12 Лодырь
 
23.06.14
11:07
(11) Ну.. как бы там оно реализовано.
13 demmix
 
23.06.14
11:10
(12) Нет,там нельзя редактировать файлы. Они автоматом не заменяються
14 Lama12
 
23.06.14
11:13
(4) Несколько вариантов.
1. Скрипт в шаблоне документа. Открывать файл с параметром и в качестве параметра передавать ссылку на форму из которой происходит открытие. При закрытие делать оповещение.
2. Отдельная папка на сервере. Папка расшарена для всех. Скрыта. С документами пользователь работает из этой расшаренной папки. Измененные файлы "подбирает" регламентное задание. Естественно имена у файлов служебные.
3, 4 и т.д. есть еще пару идей, но их писать долго :)
15 demmix
 
23.06.14
11:15
(14) Вот насчет 1 варианта я тоже так думал, сейчас тоже попробую так, 2 вариант оригинальный)) а если будет желание то 3 и 4 вариант тоже озвуч, будет крайне полезно)) иии СПАСИБО!)
16 Лодырь
 
23.06.14
11:15
(13) Ну как же. Вот я беру в типовой УТ присоединяю файлик. Далее тыкаю редактировать - он редактируется и все изменения сохраняются несмотря на закрытие ворда.
17 МихаилМ
 
23.06.14
11:16
еще варианты
сравнивать дату изменения
подписка на wmi событие

либо открывать word как activx контейнер
18 demmix
 
23.06.14
11:17
(16) хм, я брал функционал из БСП, не работает там редактирование...сейчас в ут посмотрю
19 Лодырь
 
23.06.14
11:21
(18) Вот ролик процесса. Специально не поленился записать. http://screencast.com/t/SxUfN4WpZ36
20 Cube
 
23.06.14
11:24
О, костылей-то напредлагали... =))

Вообще-то есть прямой путь - ДобавитьОбработчик. Подробнее в СП 1С и в MSDN: http://msdn.microsoft.com/ru-ru/library/office/ff834271(v=office.15).aspx


Пример для УФ:

&НаКлиенте
Процедура ОткрытьМакетДляРедактирования(Команда)
    
    Адрес = ПоместитьФайлМакетаВоВременноеХранилище();
    Если Адрес = Неопределено Тогда
        Предупреждение(НСтр("ru = 'Нет данных для обработки.'"));
        Возврат;
    КонецЕсли;
    
    Если НЕ ПолучитьФайл(Адрес, КаталогВременныхФайлов() + Объект.ИмяФайлаМакета, Ложь) Тогда
        Возврат;
    КонецЕсли;
    
    Попытка
        MSWord = ПолучитьCOMОбъект(, "Word.Application");    //Если Word уже открыт, то покажем предупреждение - нефиг десять документов редактировать.
        Предупреждение("Для редактирования макета, закройте другие документы Microsoft Word.");
        Возврат;
    Исключение
        Попытка
            MSWord = Новый COMОбъект("Word.Application");    //Открываем Word.
        Исключение
            Сообщить("Ошибка при открытии макета. Скорее всего на Вашем компьютере не установлен Microsoft Word.", СтатусСообщения.Внимание);
            Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
            Возврат;
        КонецПопытки;
    КонецПопытки;
    Документ = MSWord.Documents.Open(КаталогВременныхФайлов() + Объект.ИмяФайлаМакета);
    MSWord.Visible = Истина;
    MSWord.Activate();
    
    ДобавитьОбработчик MSWord.DocumentBeforeClose, ПередЗакрытиемДокументаWord;
    ДобавитьОбработчик MSWord.Quit, ВыходИзWord;
    
КонецПроцедуры //ОткрытьМакетДляРедактирования()

&НаКлиенте
Процедура ПередЗакрытиемДокументаWord(Документ, Отмена)
    
    Если НЕ Документ.Saved Тогда
        Документ.Save();
        Модифицированность = Истина
    КонецЕсли;
    
КонецПроцедуры //ПередЗакрытиемДокументаWord()

&НаКлиенте
Процедура ВыходИзWord()
    
    АдресВоВременномХранилище = "";
    Если Модифицированность И ПоместитьФайл(АдресВоВременномХранилище, КаталогВременныхФайлов() + Объект.ИмяФайлаМакета, , Ложь) Тогда
        Объект.ДатаЗагрузкиМакета = ТекущаяДата();
        ЗарегистрироватьМакет(АдресВоВременномХранилище);
        ОбновитьИнформациюОФайле();
    КонецЕсли;
    
    УдалитьФайлы(КаталогВременныхФайлов() + Объект.ИмяФайлаМакета);
    
КонецПроцедуры //ВыходИзWord()


Работает сто лет - проблемы не было ни одной.
21 Cube
 
23.06.14
11:25
+(20) И не надо лохматить бабушку...
22 demmix
 
23.06.14
11:25
(19) Я уже сам развернул ут и посмотрел))
23 Лодырь
 
23.06.14
11:26
(21) Чо сказать - молодец )
24 Cube
 
23.06.14
11:26
+(20) Ах, да, это не чистый УФ. Это работает в толстом клиенте в УПП =)) Переписать под читый УФ пока лень, а потребности нет...
25 demmix
 
23.06.14
11:26
(21) ООО, вот за это лучи добра тебе!)
26 demmix
 
23.06.14
11:30
В общем ветку можно считать ЗАКРЫТОЙ! Всем огромное спасибо)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой