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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Почему изображение не сохраняется после выбора файла в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #33763
      Телеграм группа https://t.me/odineskiOdineski
      Участник

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

        СтандартнаяОбработка = Ложь;
        Фильтр = «Все картинки (*.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|»;
        Диалог = Новый ПараметрыДиалогаПомещенияФайлов(«Выберите файл», Ложь, Фильтр);
        Оповещение = Новый ОписаниеОповещения(«ПослеЗакрытияДиалогаВыбораФайла», ЭтаФорма);
        НачатьПомещениеФайлаНаСервер(Оповещение,,,, Диалог, УникальныйИдентификатор);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С