Сохранение в реквизит ХранилищеЗначения двоичных данных.
Доброго времени суток!
Подскажите, очень прошу, что я делаю. не правильно?
Есть код получения в веб-клиента файла, который я хочу сохранить в реквизит, ну например справочника. Код рабочий, ниже.
Этот же код в обработчике ПриЗаписиНаСервере прекрасно работает
Не могу понять логику 1С, почему с ТекущегоОбъекта сохраняется в реквизиты справочника, а напрямую в реквизит - вылетает с ошибкой. Подскажите советом, ссылкой на теорию или кодом.
P.S. Прошу не ругать что не использую функцию НачатьПомещениеФайлаНаСервер, не в ней сейчас проблема, пока тестирую со старой функцией, позже перепишу код.
Конфигурация самописная, без БСП, 1С:Предприятие 8.3 (8.3.18.1563)
Подскажите, очень прошу, что я делаю. не правильно?
Есть код получения в веб-клиента файла, который я хочу сохранить в реквизит, ну например справочника. Код рабочий, ниже.
&НаКлиенте
Процедура Добавить(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект),, , Истина , УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат,АдресВХранилище,ВыбранноеИмяФайла,ДополнительныеПараметры) Экспорт
Если Результат Тогда
Файл = Новый Файл(ВыбранноеИмяФайла);
ИмяФайла = Файл.Имя;// ИмяФайла - реквизит на форме, строка
ИмяФайлаНаСервере = АдресВХранилище; // ИмяФайлаНаСервере - реквизит на форме, строка
КонецЕсли;
СохранитьНаСервере()
КонецПроцедуры
Процедура СохранитьНаСервере()
Если ЭтоАдресВременногоХранилища(ИмяФайлаНаСервере) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИмяФайлаНаСервере);
ИмяФайлаВременное=ПолучитьИмяВременногоФайла(ИмяФайла);
ХранилищеВременное=Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
Объект.ФайлХранилище = ХранилищеВременное;
// В этом месте вылетает с ошибкой "Поле объекта не обнаружено (ФайлХранилище)
// Объект.ФайлХранилище = ХранилищеВременное;
Объект.ИмяФайла = ИмяФайла;
КонецЕсли;
КонецПроцедуры
ПоказатьЭтот же код в обработчике ПриЗаписиНаСервере прекрасно работает
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(ИмяФайлаНаСервере) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИмяФайлаНаСервере);
ТекущийОбъект.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
ТекущийОбъект.ИмяФайла = ИмяФайла;
КонецЕсли;
КонецПроцедуры
ПоказатьНе могу понять логику 1С, почему с ТекущегоОбъекта сохраняется в реквизиты справочника, а напрямую в реквизит - вылетает с ошибкой. Подскажите советом, ссылкой на теорию или кодом.
P.S. Прошу не ругать что не использую функцию НачатьПомещениеФайлаНаСервер, не в ней сейчас проблема, пока тестирую со старой функцией, позже перепишу код.
Конфигурация самописная, без БСП, 1С:Предприятие 8.3 (8.3.18.1563)
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) реквизиты с типом данных ХранилищеЗначения не доступны в данных формы. Т.е. как к реквизиту формы к нему невозможно обратиться, только через получение объекта прикладного типа. И в обработчике ПередЗаписьюНаСервере ТекущийОбъект это как раз объект, в котором уже доступен такой реквизит.
(3)
РеквизитФормыВЗначение значит мне поможет только? Блин ну какая то банальная задачка, а тормозится на пустом месте.
реквизиты с типом данных ХранилищеЗначения не доступны в данных формы. Т.е. как к реквизиту формы к нему невозможно обратиться, только через получение объекта прикладного типа. И в обработчике ПередЗаписьюНаСервере ТекущийОбъект это как раз объект, в котором уже доступен такой реквизит.
РеквизитФормыВЗначение значит мне поможет только? Блин ну какая то банальная задачка, а тормозится на пустом месте.
Неверно идёт работа с данными формы. Реквизит формы "Объект" (тип "ДанныеФормыСтруктура") и объект базы данных (тип "СправочникОбъект.<СправочникИмя>") - разные вещи, которые не обязаны совпадать. На это и намекает платформа, когда выдаёт ошибку об отсутствии у данных формы свойства "ФайлХранилище", его действительно нет, т.к. платформа не добавляет в данные формы реквизиты объекта с типом "ХранилищеЗначения".
В Вашем случае для корректной работы механизма лучше всего ограничиться помещением файла в связанное с формой временное хранилище без вызова немедленного сохранения:
А затем, если пользователь решит сохранить внесённые изменения (ведь он может и отказаться), перед записью на сервере установить необходимые значения в поля Объекта (ТекущийОбъект - уже "настоящий" объект, а не "ДанныеФормыСтруктура"):
В Вашем случае для корректной работы механизма лучше всего ограничиться помещением файла в связанное с формой временное хранилище без вызова немедленного сохранения:
&НаКлиенте
Процедура Добавить(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект),, , Истина , УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат,АдресВХранилище,ВыбранноеИмяФайла,ДополнительныеПараметры) Экспорт
Если Результат Тогда
Файл = Новый Файл(ВыбранноеИмяФайла);
Объект.ИмяФайла = Файл.Имя;
ИмяФайлаНаСервере = АдресВХранилище; // ИмяФайлаНаСервере - реквизит на форме, строка
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
ПоказатьА затем, если пользователь решит сохранить внесённые изменения (ведь он может и отказаться), перед записью на сервере установить необходимые значения в поля Объекта (ТекущийОбъект - уже "настоящий" объект, а не "ДанныеФормыСтруктура"):
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если Модифицированность и ЭтоАдресВременногоХранилища(ИмяФайлаНаСервере) Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ИмяФайлаНаСервере);
ТекущийОбъект.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
КонецЕсли;
КонецПроцедуры
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот