Имя: Пароль:
1C
1С v8
Сохранить файл изображения
0 vvs79
 
13.09.23
19:22
1С Розница 3.
В справочнике Номенклатура  есть ссылка на справочник НоменклатураПрисоединенныеФайлы. В котором, в свою очередь, есть поле ФайлХранилище (список). Но подскажете, как програмно сохранить файл из этого списка на диск ?
Читал все советы по такой задаче, ничего не помогло.
(или расскажите где почитать про такое).
1 lubitelxml
 
13.09.23
19:34
(0) там вроде была кнопка сохранить, посмотри как работает, и воспроизведи
2 vvs79
 
13.09.23
19:43
Пункт всплывающего меню.

"посмотри как работает, и воспроизведи"
везде про такое читаю, но не знаю как (начал программить на  1С 2-ве недели назад).
Не подскажете где написано как это делать.
Или сами расскажите.
3 mikecool
 
13.09.23
19:52
показывай, что уже сделал
4 vvs79
 
13.09.23
20:09
Добавил кнопку на форму расходной накладной и описал событие нажатия:

&НаСервере
Функция Расш1_Найти(Имя_Т)                              
    Запрос = Новый Запрос;  
    Q="ВЫБРАТЬ
|    НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка,
|    НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
|    НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла,
|    НоменклатураПрисоединенныеФайлы.Том КАК Том,
|    НоменклатураПрисоединенныеФайлы.ФайлХранилище КАК ФайлХранилище
|ИЗ
|    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
|ГДЕ
|    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Ссылка = &ном"    ;
     Запрос.Текст = Q;
     Запрос.УстановитьПараметр("ном", Имя_Т);                    
     файлы=Запрос.Выполнить().Выбрать();    
     n=0;
     Пока файлы.Следующий() Цикл        
         сообщить("P:="+файлы.ПутьКФайлу);
         сообщить(файлы.ТипХраненияФайла);
         сообщить(файлы.Том);
         сообщить(файлы.ФайлХранилище);  
                    
         Выборка = Справочники.НоменклатураПрисоединенныеФайлы.Выбрать();      
         Пока Выборка.Следующий() Цикл
                 ВладелецФайла = Выборка.ВладелецФайла ;    
                Если ВладелецФайла=Имя_Т ТОГДА      
                    Сообщить(" найдено");      
                    АдресХранилища=ПоместитьВоВременноеХранилище(Выборка.ФайлХранилище);
                    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
                    
                    //ДвоичныеДанные.Записать("c:\111.jpg");
                                
                КонецЕсли;
         КонецЦикла;

         n=n+1;
     конеццикла;
    
КонецФункции

Вот ДвоичныеДанные.Записать("c:\111.jpg"); говорит нет функции записать.
5 vvs79
 
13.09.23
20:28
Ну и на клиенте вызов:
&НаКлиенте
Процедура Расш1_всТоварыОчиститьПосле(Команда)        
    
    Для каждого СтрокаТовар Из Объект.Запасы Цикл
        N=СтрокаТовар.Номенклатура;
        А="Название: "+СтрокаТовар.Номенклатура+" Цена: "+СтрокаТовар.Цена+" Количество: "+СтрокаТовар.Количество;
    
        B=Расш1_Найти(СтрокаТовар.Номенклатура);  
    КонецЦикла;
    
    
    
    ФайлTXT= Новый ТекстовыйДокумент;        
    A="<html><BODY BGCOLOR=""yellow""><font size=""6""color=""red"" face=""Arial"">" + Символы.ПС;
    ФайлTXT.ДобавитьСтроку(A);    
    ФайлTXT.ДобавитьСтроку("<head>");
    A="<img src=""logo.jpg"" width=""75"" height=""75""<br />";
    ФайлTXT.ДобавитьСтроку(A);      
    
    НС=0;
    
    ФайлTXT.ДобавитьСтроку("<table width=""100%"" cellspacing=""0"" cellpadding=""5"">");
    ФайлTXT.ДобавитьСтроку("<tr> ");
    ФайлTXT.ДобавитьСтроку("<td width=""200"" valign=""top""><img src=""2c.jpg"" width=""250"" height=""600""<br /></td><td valign=""top"">");
    ФайлTXT.ДобавитьСтроку("<table>");
    ФайлTXT.ДобавитьСтроку("<tr>");
    ФайлTXT.ДобавитьСтроку("<th BGCOLOR=""white"" colspan=""2"" width=""75%"" align=""left""><font size=""6"">НАИМЕНОВАНИЕ</font></th><th BGCOLOR=""white"" width=""25%""><font size=""6"">КОЛ-ВО</font></th>");
    ФайлTXT.ДобавитьСтроку("</tr>");  
    Для каждого СтрокаТовар Из Объект.Запасы Цикл                                                                
        КодВозврата="";
        А="Название: "+СтрокаТовар.Номенклатура+" Цена: "+СтрокаТовар.Цена+" Количество: "+СтрокаТовар.Количество;
        НС=НС+1;
        ФайлTXT.ДобавитьСтроку("<TR>");
        ФайлTXT.ДобавитьСтроку("<td BGCOLOR=""white"" width=""5%"" align=""center""><font size=""6"">"+НС+"</font></td><td BGCOLOR=""blue"" width=""65%"" align=""center""><font COLOR=""white"" size=""6"">"+СтрокаТовар.Номенклатура+"</font></td><td BGCOLOR=""blue"" width=""25%"" align=""center""><font COLOR=""white"" size=""6"">"+СтрокаТовар.Количество+"</font></td>");
        ФайлTXT.ДобавитьСтроку("</TR>");
    КонецЦикла;    
    ФайлTXT.ДобавитьСтроку("<p>"+"</p>");      
    ФайлTXT.ДобавитьСтроку("<p>"+"</p>");      
    ФайлTXT.ДобавитьСтроку("<p>"+"</p>");      
    ФайлTXT.ДобавитьСтроку("<p>"+"</p>");      
    ФайлTXT.ДобавитьСтроку("<font size=""12"">");
    ФайлTXT.ДобавитьСтроку("<TR>");    
    I="Итого: "+Объект.Запасы.Итог("сумма")+" р.";
    
    ФайлTXT.ДобавитьСтроку("<td colspan=""3""><font size=""12"">"+I+"</font></td>");
    ФайлTXT.ДобавитьСтроку("</TR>");
    ФайлTXT.ДобавитьСтроку("</font>");
    НазваниеК = СокрЛП(Объект.Контрагент);  
    
    //ФайлTXT.ДобавитьСтроку("<div id=""footer"">");    
    ФайлTXT.ДобавитьСтроку("<TR>");
    ФайлTXT.ДобавитьСтроку("<td height=""400"" valign=""bottom"" colspan=""3""><font size=""6"">"+НазваниеК+"</font></td>");
    ФайлTXT.ДобавитьСтроку("</TR>");    
    ФайлTXT.ДобавитьСтроку("</table>");    
    ФайлTXT.ДобавитьСтроку("</table>");    
    ФайлTXT.ДобавитьСтроку("</BODY></html>");
    
    ФайлTXT.НачатьЗапись(, "C:\secondmonitor\1.htm", КодировкаТекста.UTF8, Символы.ПС);
    ЗапуститьПриложение(
        "C:\secondmonitor\PUBID_538855-SecondMonitor.exe",
        "C:\secondmonitor\", // текущий каталог для запускаемого приложения
        Ложь,
        КодВозврата
    );
КонецПроцедуры
6 Tatitutu
 
14.09.23
11:34
(4) слишком сложно и ...

замени
                    Сообщить(" найдено");      
                    АдресХранилища=ПоместитьВоВременноеХранилище(Выборка.ФайлХранилище);
                    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
                    
                    //ДвоичныеДанные.Записать("c:\111.jpg");

на

                  МояКартинка=Выборка.ФайлХранилище.Получить();
                  МояКартинка.Записать("c:\111.jpg")


ну когда немного разберёшься в механизмах можно вместо (4)



    СсылкаНаКарт = ПолучитьНавигационнуюСсылку(Имя_Т, "ОсновноеИзображение");    
    ПолучитьФайлССервераАсинх(ПолучитьСсылкуНаОбъектБазы(СсылкаНаКарт),"c:\111.jpg");

        //но, это отдельная магия из мира MAGAZKA, где нет ничего не возможного
7 vvs79
 
14.09.23
12:50
Заменил.
На строке МояКартинка.Записать("c:\111.jpg") ошибка: Значение не является значением объектного типа (Записать).
8 Tatitutu
 
14.09.23
13:23
(7)
а так
МояКартинка=Выборка.ФайлХранилище.Хранилище.Получить();
МояКартинка.Записать("c:\111.jpg")
9 vvs79
 
14.09.23
13:28
Ещё бы название файла картинки узнать, а то "1111.jpg" это я просто-так написал :-(
10 Табуретко
 
14.09.23
13:31
(9)Выборка.ВладелецФайла
11 Tatitutu
 
14.09.23
13:39
(9) да по хорошему там все переписать легче заново

  B=Расш1_Найти(СтрокаТовар.Номенклатура);  

обращаешься к ПРОЦЕДУРЕ как ФУНКЦИИ

что такое B - она нигде потом не используется

//ВОТ ЭТО ЧТО И ДЛЯ ЧЕГО ? клавиатура сломаны и буква закончились N, A ,B
    
   Для каждого СтрокаТовар Из Объект.Запасы Цикл
        
        N=СтрокаТовар.Номенклатура;

        А="Название: "+СтрокаТовар.Номенклатура+" Цена: "+СтрокаТовар.Цена+" Количество: "+СтрокаТовар.Количество;
    
        B=Расш1_Найти(СтрокаТовар.Номенклатура);  
    КонецЦикла;


сохраняемш в "c:\111.jpg"
а в итоге пишешь 2c.jpg

сохранять по идее нужно в папку "C:\secondmonitor\2c.jpg"

раз уж решили подключить второй монитор

а результат уже видел ? - вырви глаз ))) <BODY BGCOLOR=""yellow"" рулит
12 vvs79
 
14.09.23
13:50
Насчёт процедуре, как в функции - раньше использовал параметр, потом надобность отпала (в процессе разработки, но вдруг ещё понадобиться).
"B" тоже раньше использовал.
Про цвета - не я макет заказывал :-)
(рабочий код).

И МояКартинка=Выборка.ФайлХранилище.Хранилище.Получить(); вызывает другую ошибку: Поле объекта не обнаружено (Хранилище). :-(
13 Tatitutu
 
14.09.23
13:57
МояКартинка=Выборка.ФайлХранилище.Получить();
в отладчике , чему равна МояКартинка ?
14 vvs79
 
14.09.23
14:19
Правильно,  МояКартинка = неопределено. Хотя в номенклатуре картинка есть.
15 vvs79
 
14.09.23
14:22
Мне тут люди подсказывают, что там (с картинками в номенклатуре) не всё так просто. Надо использовать РегистрыСведений.ДвоичныеДанныеФайлов.
16 dmt
 
14.09.23
14:23
(15) используй лучше РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл).Записать(ИмяФайла);
17 vvs79
 
14.09.23
14:27
(15) А как получить СсылкаНаПрисоединенныйФайл ? Из НоменклатураПрисоединенныеФайлы ?
18 Tatitutu
 
14.09.23
14:49
(17) это у тебя Имя_Т
19 vvs79
 
14.09.23
14:56
Вызывается: Расш1_Найти(СтрокаТовар.Номенклатура);  
Какая же это СсылкаНаПрисоединенныйФайл ?
20 vvs79
 
14.09.23
14:59
Если только Справочники.НоменклатураПрисоединенныеФайлы а на что там ссылаться ?
21 Tatitutu
 
14.09.23
15:04
(20) у тебя в (4)

Пока Выборка.Следующий() Цикл
                 ВладелецФайла = Выборка.ВладелецФайла ;    
                 // добавь
                 СсылкаНаПрисоединенныйФайл = Выборка.Ссылка;


но, можно намного проще через ПолучитьНавигаиционнуюСсылку()
22 vvs79
 
14.09.23
15:26
Ошибка доступа к файлу '111.jpg'. 5(0x00000005) Отказано в доступе.
Без ПолучитьНавигаиционнуюСсылку().
23 Tatitutu
 
14.09.23
15:41
в корень диска С не нужно писать - прав не хватит скорее всего
изменить путь
24 vvs79
 
14.09.23
15:54
Не РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл).Записать("C:\111.jpg") не помогает не Записать("H:\111.jpg");
25 vvs79
 
14.09.23
15:55
На h точно есть права.
26 vvs79
 
14.09.23
15:56
Может путь надо как то по другому указывать ?
27 vvs79
 
14.09.23
15:56
диск.
28 Tatitutu
 
14.09.23
16:00
Когда сосед или коллега освободит тебе Отладчик
посмотри что возвращает:

СсылкаНаПрисоединенныйФайл

РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл);
29 АгентБезопасной Нацио
 
14.09.23
16:01
(26) Читай про ДиалогВыбораФайла
30 vvs79
 
14.09.23
16:12
(28) Название какое надо пишет, тип СправочникСсылкаНоменклатураПрисоединённыеФайлы. Но почему ошибку даёт ?
31 vvs79
 
15.09.23
10:48
(28) Вызываю РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл).Записать("111.jpg");
В ссылке есть что-то определённое (и название и расширение и хранилище), но вызов оператора даёт эту ошибку, куда бы не записывал.
32 АгентБезопасной Нацио
 
15.09.23
11:33
(31) Берешь отладчик, и смотришь, что возвращает РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл)
33 vvs79
 
15.09.23
12:40
Тупил (пробовал разные варианты - всё поломал).
Сейчас вернул, В СсылкаНаПрисоединенныйФайл название файла с расширением правильное, даты, размер. Файлхранилище - написано Хранилище значение. Что то есть, посмотреть не могу.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн