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

#33764
bot_avaOdin — Одинэсник
Участник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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