Имя: Пароль:
1C
1С v8
Excel документ в ХранилищеЗначений. Как можно редактировать?
0 Плот
 
13.02.13
08:44
Привет! Ребята подскажите пжл, как можно редактировать файл екселя который помещен в хранидище значения? Открываю его вот таким способом:
   СтандартнаяОбработка = ложь;
   МойФайл = ПутьКФайлу.Получить();
   Если МойФайл = неопределено тогда
       Предупреждение("Здесь нет файла!",10);
       Возврат;
   КонецЕсли;        
   ИмяВременногоФайла = ПолучитьИмяВременногоФайла()+РасширениеФайла;
   МойФайл.Записать(ИмяВременногоФайла);
   ЗапуститьПриложение(ИмяВременногоФайла);
   ЗаписатьВБазуФайл(ИмяВременногоФайла);
1 Нуф-Нуф
 
13.02.13
08:53
Открой докуметооборот. Там такое есть
2 kotletka
 
13.02.13
08:58
странная процедура ЗаписатьВБазуФайл , синтакс помощник про неё не знает
3 kotletka
 
13.02.13
08:58
опиши как помещаешь в хранилище
4 Плот
 
13.02.13
09:00
Процедура ЗаписатьВБазуФайл(ИмяВыбФайла)
   ВыбФайл            = Новый Файл(ИмяВыбФайла);
   ДвоичныеДанные  = Новый ДвоичныеДанные(ИмяВыбФайла);
   ХранилищеФайлов = Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
   ПутьКФайлу = ХранилищеФайлов;            
   РасширениеФайла = ВыбФайл.Расширение;    
КонецПроцедуры
5 Wobland
 
13.02.13
09:00
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   НЗ=РегистрыСведений.ФайлыЗаданий.СоздатьНаборЗаписей();
   НЗ.Отбор.Задание.Установить(Объект.Ссылка);
   НЗ.Прочитать();
   Если НЗ.Количество() Тогда
       Данные=НЗ[0].Файл.Получить();
       РасширениеФайла=НЗ[0].Расширение;
   Иначе
       Данные=Неопределено;
       Расширение="";
   КонецЕсли;
   Если Данные<>Неопределено Тогда
       АдресФайла=ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
   КонецЕсли;        
КонецПроцедуры

&НаКлиенте
Процедура Показать(Команда)
   #Если ВебКлиент Тогда
       Предупреждение("Не доделано, не додумано");
   #Иначе
       Если НЕ ЭтоАдресВременногоХранилища(АдресФайла) Тогда
           Возврат;
       КонецЕсли;
       ВременноеИмя=ПолучитьИмяВременногоФайла(РасширениеФайла);
       ПолучитьФайл(АдресФайла, ВременноеИмя, Ложь);
       ЗапуститьПриложение(ВременноеИмя);
   #КонецЕсли
КонецПроцедуры
6 kotletka
 
13.02.13
09:09
(4)см(5) чтобы что то извлечь из хранилища ты должен хранить "адрес", т.е какой то объект с реквизитом  типа ХранилищеЗначения
7 Плот
 
13.02.13
09:10
(6,5) Спасиб. Ушел разбираться.
8 Плот
 
13.02.13
12:05
(5) Правильно я понял что файл нужно хранить где то на диске?
9 Плот
 
13.02.13
12:06
(8) Затупил. Вопрос снят.
10 Плот
 
13.02.13
12:21
(5) Вопрос то был, как после того как был поправлен файл записать его снова в ХранилищеЗначений?
11 alexei366
 
13.02.13
12:30
Тебе надо цепляться к событию некому, к примеру к событию закрытия формы, где ты изначально открываешь файл на редактирование, в момент открытия ты считываешь MD5 файла выгруженного на диск и вместе с MD5 запоминаешь и путь к файлу в какойто переменной на клиенте. Затем при закрытии формы ты сверяешь MD5 , и если они не совпадают значится файл изменили , ну и записываешь новую версию.
Сам я делал когда-то таким способом, имелась таблица файлов, и сотрудник кликая два раза на строку открывал файл (и пофиг на формат) в этот момент выводился вопрос "сохранить изменения в файле или нет", сотрудник делает изменения, закрывает файл, нажимает "Да" в вопросе, там далее сравнивается MD5 и если он изменился то записываем в ХЗ новый файл
12 Wobland
 
13.02.13
12:33
(10) да мне не жалко. оттуда же

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
   Если НЕ ЭтоАдресВременногоХранилища(АдресФайла) Тогда
       Возврат;
   КонецЕсли;
   НЗ=РегистрыСведений.ФайлыЗаданий.СоздатьНаборЗаписей();
   НЗ.Отбор.Задание.Установить(Объект.Ссылка);
   Запись=НЗ.Добавить();
   //к этому моменту ссылка не должна быть пустой
   Запись.Задание=Объект.Ссылка;
   Запись.Файл=Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФайла));
   Запись.Расширение=РасширениеФайла;
   НЗ.Записать();
КонецПроцедуры

&НаКлиенте
Процедура Загрузить(Команда)
   Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.МножественныйВыбор=Ложь;
   Диалог.Фильтр="Документы Word|*.doc|Все файлы|*.*";
   Если Диалог.Выбрать() Тогда
       АдресФайла=ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла), УникальныйИдентификатор);
       Ф=Новый Файл(Диалог.ПолноеИмяФайла);
       РасширениеФайла=Сред(Ф.Расширение, 2);
       Модифицированность=Истина;
   КонецЕсли;
КонецПроцедуры
13 Плот
 
13.02.13
12:33
(11) То что нужно! Спасибо!
14 Плот
 
13.02.13
12:35
А если я всегда буду записывать файл после открытия, не смотря на что правлен или не правлен, наверное не есть гуд?
15 alexei366
 
13.02.13
12:40
Да не, просто если изменений не было, выводиться сообщение пользователю "Файл не изменён", а то вдруг в Экселе сохранил через "Сохранить как" и на рабочий, и тогда ясен фиг не увидешь ничего.
Ну если у тя предполагается исключительно Эксель, то можно запускать Ком объект и отобразить пользователю через visible, и в обработчике ожидания на форме следить когда ком объект сдохнет и проверять новую сохраненную версию.
16 alexei366
 
13.02.13
13:21
На

Функция РедактироватьФайл(СтруктураФайла , Отредактирован, ОписаниеОшибки) Экспорт
   
   
   Попытка
       
       Отредактирован = Ложь;
       
       ИмяФайла = ПолучитьИмяВременногоФайла(СтруктураФайла.Формат);
       СтруктураФайла.Данные.Записать(ИмяФайла);
       ЗапуститьПриложение(ИмяФайла);
       
       МД5 = РаботаССерверомВызов.ВычислитьМД5(СтруктураФайла.Данные);
       
       СЗ = Новый СписокЗначений;
       СЗ.Добавить("ДА","Да");
       СЗ.Добавить("НЕТ","Нет");
       Ответ = Вопрос(СтруктураФайла.Наименование+" : сохранить изменения",СЗ);
       Если Ответ = "ДА" Тогда
           ДвДанные = Новый ДвоичныеДанные(ИмяФайла);
           НовыйМД5 = РаботаССерверомВызов.ВычислитьМД5(ДвДанные);
           Если МД5 = НовыйМД5 Тогда
               Предупреждение("Файл не изменился");
               Отредактирован = Ложь;    
               Попытка
                   УдалитьФайлы(ИмяФайла);
               Исключение
               КонецПопытки;
               Возврат Истина;
           Иначе
               СтруктураФайла.Данные = ДвДанные;
               Отредактирован = Истина;
               Попытка
                   УдалитьФайлы(ИмяФайла);
               Исключение
               КонецПопытки;
               Возврат Истина;
           КонецЕсли;
           
       Иначе
           Отредактирован = Ложь;
           Попытка
               УдалитьФайлы(ИмяФайла);
           Исключение
           КонецПопытки;
           Возврат Истина;
       КонецЕсли;
       
       
   Исключение
       
       Попытка
           УдалитьФайлы(ИмяФайла);
       Исключение
       КонецПопытки;
       
       ОписаниеОшибки = ОписаниеОшибки();
       Возврат Ложь;
       
   КонецПопытки;
   
   
КонецФункции



Функция ВычислитьМД5(ДвДанные) Экспорт
         
   ХешДан = Новый ХешированиеДанных(ХешФункция.MD5);
   ХешДан.Добавить(ДвДанные);
   МД5 = СтрЗаменить(Строка(ХешДан.ХешСумма)," ","");
       
   Возврат МД5;    
   
   
КонецФункции
17 Плот
 
13.02.13
14:05
(16) Спасибо!
AdBlock убивает бесплатный контент. 1Сергей