Odin | База знаний 1С

Почему изображение ...
 

Почему изображение не сохраняется после выбора файла в 1С?


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

где ошибка в коде? изображение прикладывается, но не сохраняется. &НаКлиенте
Процедура СсылкаНаКартинкуНажатие(Элемент, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
Фильтр = "Все картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf|"
+ "Формат bmp (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|"
+ "Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"
+ "Формат TIFF (*.tif)|*.tif|"
+ "Формат GIF (*.gif)|*.gif|"
+ "Формат PNG (*.png)|*.png|"
+ "Формат icon (*.ico)|*.ico|"
+ "Формат метафайл (*.wmf;*.emf)|*.wmf;*.emf|";
Диалог = Новый ПараметрыДиалогаПомещенияФайлов("Выберите файл", Ложь, Фильтр);
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияДиалогаВыбораФайла", ЭтаФорма);
НачатьПомещениеФайлаНаСервер(Оповещение,,,, Диалог, УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияДиалогаВыбораФайла(ОписаниеФайла, ДопПараметры) Экспорт

Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;

Модифицированность = Истина;
СсылкаНаКартинку = ОписаниеФайла.Адрес;

КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

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

КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

Ошибка в вашем коде связана с тем, что переменная `СсылкаНаКартинку` используется в серверной процедуре `ПередЗаписьюНаСервере`, но она не передается из клиентской части на сервер, и, скорее всего, не является реквизитом объекта или формы. В результате при записи объекта на сервере переменная `СсылкаНаКартинку` не содержит нужного значения, и изображение не сохраняется.

### Подробности и рекомендации:

1. **Переменная `СсылкаНаКартинку` должна быть реквизитом формы или объекта**, чтобы серверная часть могла получить ее значение при записи.

- Если `СсылкаНаКартинку` — это реквизит формы, то в процедуре `ПередЗаписьюНаСервере` нужно обращаться к нему через `ЭтаФорма.СсылкаНаКартинку` или передавать значение в параметры.
- Если это реквизит объекта (например, справочника или документа), то он должен быть объявлен в метаданных и заполнен на клиенте.

2. **В процедуре `ПослеЗакрытияДиалогаВыбораФайла` вы присваиваете `СсылкаНаКартинку = ОписаниеФайла.Адрес;`**, но это локальная переменная клиентского модуля. Чтобы сервер получил это значение, нужно:

- Сделать `СсылкаНаКартинку` реквизитом формы и присваивать его через `ЭлементыФормы.СсылкаНаКартинку = ...`
- Либо передавать значение в объект, например, в реквизит объекта, если он есть.

3. **В процедуре `ПередЗаписьюНаСервере` нужно обращаться к реквизиту объекта, а не к переменной модуля:**

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

4. **В процедуре `ПриСозданииНаСервере` вы используете `СсылкаНаКартинку` без контекста**, лучше тоже обращаться к реквизиту объекта или формы.

---

### Итог: исправленный пример ключевых моментов

**Клиентская часть:**

bsl
&НаКлиенте
Процедура ПослеЗакрытияДиалогаВыбораФайла(ОписаниеФайла, ДопПараметры) Экспорт
    Если ОписаниеФайла = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Модифицированность = Истина;
    // Предполагается, что СсылкаНаКартинку — реквизит формы
    ЭтаФорма.СсылкаНаКартинку = ОписаниеФайла.Адрес;   
КонецПроцедуры

**Серверная часть:**

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

---

### Дополнительные рекомендации:

- Проверьте, что реквизит `СсылкаНаКартинку` существует в форме и/или объекте.
- Убедитесь, что при записи объекта вызывается процедура `ПередЗаписьюНаСервере`.
- Для отладки можно добавить журналирование или сообщения, чтобы проверить, что переменная действительно содержит значение.

---

Рекомендую посмотреть здесь: https://infostart.ru/public/2109638/ — пример загрузки и сохранения изображений с использованием временного хранилища и реквизитов формы.

---

Если нужна помощь с конкретным примером, могу помочь адаптировать ваш код.



   
ОтветитьЦитата