Имя: Пароль:
1C
1С v8
сжатие картинок в 1т 11 - не могу перезаписать значение картинки
0 Екактерина
 
23.09.19
11:20
Добрый день!

Пожалуйста, подскажите,что делаю не так

Сжала картинки справочника номенклатуры сторонними средствами, записала их в папку, теперь мне нужно перезаписать основное изображение номенклатуры на это сжатое изображение. Но хранилище значений для записи недоступно, что могу делать не так?

в 1с совсем мало...помогите!

Вот код:

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Ссылка,
        |    Номенклатура.ФайлКартинки КАК ФайлКартинки,
        |    Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
        |    Номенклатура.Код КАК Код
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Ссылка";
    
    //Запрос.УстановитьПараметр("Родитель", Объект.Группа);
    Запрос.УстановитьПараметр("Ссылка", Объект.Номенклатура);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать();    
    
    Пока Выборка.Следующий() Цикл
        Если Выборка.ЭтоГруппа Тогда ПРодолжить;КонецЕсли;
        Если ЗначениеЗаполнено(Выборка.ФайлКартинки) Тогда
         ПервоначальнаяКартинка = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.ФайлКартинки);
        
            //Картинка = Выборка.ФайлКартинки.ФайлХранилище.Получить();
            Если ПервоначальнаяКартинка = Неопределено Тогда Продолжить;КонецЕсли;
            Если ПервоначальнаяКартинка.Размер()/1024 > 100 Тогда
                    ИмяФайла = "C:\Users\Desktop\!!!\IN\"+СокрЛП(Выборка.Код)+".jpg";
                    ИмяФайлa3 = "C:\Users\Desktop\!!!\IN\"+СокрЛП(Выборка.Код + "-W600")+".jpg";
                    ИмяФайла2 = "C:\Users\Desktop\!!!\OUT\"+СокрЛП(Выборка.Код)+".jpg";
                    ПервоначальнаяКартинка.Записать(ИмяФайла);
                    Результат = Неопределено;                        
                    ЗапуститьПриложение("C:\Users\Desktop\!!!\Im\PhotoResize400.exe -o -w600 " + ИмяФайла,,Истина,Результат);
                    ЗапуститьПриложение("C:\Users\Desktop\!!!\jpgcln26\JPGCLN32.EXE -nobackup "+ИмяФайла2,,Истина,Результат);
                    Если Результат <> Неопределено Тогда
                        
                        ИзмененнаяПозиция = Выборка.Ссылка.ПолучитьОбъект();
                        МояКартинка = Новый Картинка(ИмяФайлa3);
                        МояКартинка.Записать(ИмяФайла2);
                        Хран = Новый ХранилищеЗначения(МояКартинка);
                        ИзмененнаяПозиция.ФайлКартинки.ФайлХранилище = Хран; // место, где ругается
                        ИзмененнаяПозиция.Записать();                        
                        Сообщить("Номенклатура "+Выборка.Ссылка);
                     КонецЕсли;
                КонецЕсли;
                КонецЕсли;
        КонецЦикла;
1 Ёпрст
 
23.09.19
11:24
(0)  ИзмененнаяПозиция.ФайлКартинки.ФайлХранилище = Хран //от тут поправь
2 catena
 
23.09.19
11:25
Получив объект номенклатуры вы не получаете объекты всех связанных реквизитов. Что такое ИзмененнаяПозиция.ФайлКартинки ?
3 Екактерина
 
23.09.19
11:25
я понимаю, что там надо поправить, я и спрашиваю почему не записывает
4 Ёпрст
 
23.09.19
11:25
ФайлХранилище - это слово выкинь везде из кода и привет
5 Екактерина
 
23.09.19
11:26
Измененная позиция это объект номенклатуры, файлкартинки это поле, где хранится наименование файла основного изображения. и я внутри обращаюсь к хранилищу
6 Екактерина
 
23.09.19
11:27
в файлехранилище же и есть моя картинка и его мне нужно перезаписать
7 Екактерина
 
23.09.19
11:28
НайденнаяССылка=Справочники.ХранилищеДополнительнойИнформации.НайтиПоРеквизиту("Объект",Выборка.Ссылка);
                        Объект = НайденнаяССылка.ПолучитьОбъект();
                        МояКартинка = Новый Картинка(ИмяФайла2);
                        Хран = Новый ХранилищеЗначения(МояКартинка);
                        Объект.Хранилище = Хран;
                        Объект.Записать();

я опиралась на вот этот код с инфостарта для ут 10
8 ptiz
 
23.09.19
11:31
(0) ИзмененнаяПозиция.ФайлКартинки - это ССЫЛКА на справочник. Нельзя менять значение реквизита у ссылки. Либо новый элемент создавай, либо через "получитьобъект()" меняй у объекта.
9 Ёпрст
 
23.09.19
11:34
(7) тогда так:


ИзмененнаяПозиция = Выборка.ФайлКартинки .ПолучитьОбъект();
                        МояКартинка = Новый Картинка(ИмяФайлa3);
                        МояКартинка.Записать(ИмяФайла2);
                        Хран = Новый ХранилищеЗначения(МояКартинка);
                        ИзмененнаяПозиция.ФайлХранилище = Хран; // место, где ругается
                        ИзмененнаяПозиция.Записать();                        
                        Сообщить("Номенклатура "+Выборка.Ссылка);
10 Екактерина
 
23.09.19
11:36
Я получала объект и из присоединенной номенклатуры и в ней пыталась перезаписть и ошибка та же
Если Результат <> Неопределено Тогда
                        НайденнаяССылка=Справочники.НоменклатураПрисоединенныеФайлы.НайтиПоНаименованию(Выборка.ФайлКартинки);
                        //ИзмененнаяПозиция = Выборка.Ссылка.ПолучитьОбъект();
                        МояКартинка = Новый Картинка(ИмяФайлa3);
                        МояКартинка.Записать(ИмяФайла2);
                        Хран = Новый ХранилищеЗначения(МояКартинка);
                        //ИзмененнаяПозиция.ФайлКартинки = СокрЛП(Выборка.Код);
                        //ИзмененнаяПозиция.ФайлКартинки.ФайлХранилище = Хран;
                        //ИзмененнаяПозиция.Записать();    
                        НайденнаяСсылка.ФайлХранилище = Хран;
                        НайденнаяСсылка.Записать();
                        Сообщить("Номенклатура "+Выборка.Ссылка);
                    КонецЕсли;
11 Екактерина
 
23.09.19
11:41
нашла ошибку объект не взяла, но все равно он не перезаписывает на измененное сжатое изображение
12 ptiz
 
23.09.19
11:51
(11) См. (9)
Только там:
а) или МояКартинка.Записать(ИмяФайла2);  - лишнее
б) или не хватает ДвДанные = Новый ДвоичныеДанные(ИмяФайла2);  Хран = Новый ХранилищеЗначения(ДвДанные );
(я не смотрел как правильно в УТ11 картинку пихать)

ну и имена файлов проверить
13 Екактерина
 
23.09.19
12:02
а может ли быть дело в том. что я меняю хранилище значение основной картинки, которая содержит другой путь и поэтому он не перезаписывает... Я просто не могу понять, что я делаю неправильно. Сильно меня не ругайте, пожалуйста. я в тупике с этим сжатием и знаний маловато..
14 Teamen
 
02.10.19
11:07
Я тоже новичок в написании кода, но недавно как раз решал такую задачу, вот удалось в процедуре обновить файл после сжатия

    НоваяКартинка = Новый Картинка (ЛокПуть);
    Попытка
        ХранилищеКартинки = Новый ХранилищеЗначения(НоваяКартинка);
    Исключение
        Возврат Null;
    КонецПопытки;
    ЛокСправочникХЗНСсылка = Справочники.ХранилищеДополнительнойИнформации.НайтиПоРеквизиту("Объект",Выборка.Объект);
    Если ЛокСправочникХЗНСсылка.Пустая() Тогда
        Возврат Null;
    КонецЕсли;
    ЛокСправочникХЗН = ЛокСправочникХЗНСсылка.ПолучитьОбъект();
    РазмерНовый = НоваяКартинка.ПолучитьДвоичныеДанные().Размер();
    Если Анализ <> Истина Тогда
        ЛокСправочникХЗН.Хранилище = ХранилищеКартинки;
        ЛокСправочникХЗН.Записать();        
    КонецЕсли;
    Попытка
        Сообщить ("Объект " + Выборка.Объект + "  имеет НОВЫЙ размер картинки =>  " + РазмерНовый);
        Возврат    РазмерНовый;
    Исключение
        Возврат Null;
    КонецПопытки;
15 palsergeich
 
02.10.19
11:19
(14) не надо в коде использовать Null, этот литерал есть только для совместимости с запросами.
Стандарт для кода 1с это НЕОПРЕДЕЛЕННО.
Именно его возвращает функция без ключевого слова Возврат, а не Null
16 Teamen
 
02.10.19
11:28
Спасибо за разъяснение.