Сохранение в реквизит ХранилищеЗначения двоичных данных.

1. Deemon82 06.10.21 00:57 Сейчас в теме
Доброго времени суток!
Подскажите, очень прошу, что я делаю. не правильно?
Есть код получения в веб-клиента файла, который я хочу сохранить в реквизит, ну например справочника. Код рабочий, ниже.
&НаКлиенте
Процедура Добавить(Команда)
	НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект),, , Истина , УникальныйИдентификатор);

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

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

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

		Объект.ИмяФайла = ИмяФайла;
	КонецЕсли;
КонецПроцедуры
Показать


Этот же код в обработчике ПриЗаписиНаСервере прекрасно работает

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


Не могу понять логику 1С, почему с ТекущегоОбъекта сохраняется в реквизиты справочника, а напрямую в реквизит - вылетает с ошибкой. Подскажите советом, ссылкой на теорию или кодом.

P.S. Прошу не ругать что не использую функцию НачатьПомещениеФайлаНаСервер, не в ней сейчас проблема, пока тестирую со старой функцией, позже перепишу код.

Конфигурация самописная, без БСП, 1С:Предприятие 8.3 (8.3.18.1563)
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 06.10.21 05:50 Сейчас в теме
(1) реквизиты с типом данных ХранилищеЗначения не доступны в данных формы. Т.е. как к реквизиту формы к нему невозможно обратиться, только через получение объекта прикладного типа. И в обработчике ПередЗаписьюНаСервере ТекущийОбъект это как раз объект, в котором уже доступен такой реквизит.
5. Deemon82 06.10.21 11:43 Сейчас в теме
(3)
реквизиты с типом данных ХранилищеЗначения не доступны в данных формы. Т.е. как к реквизиту формы к нему невозможно обратиться, только через получение объекта прикладного типа. И в обработчике ПередЗаписьюНаСервере ТекущийОбъект это как раз объект, в котором уже доступен такой реквизит.


РеквизитФормыВЗначение значит мне поможет только? Блин ну какая то банальная задачка, а тормозится на пустом месте.
6. spacecraft 06.10.21 11:47 Сейчас в теме
(5)
РеквизитФормыВЗначение значит мне поможет только?

Это смотря для чего. Если прочитать их хранилища, то да.
Такое хранилище не доступно в данных формы, чтобы не гонять возможные Гб с сервера на клиент и обратно. И не занимать память.
2. provadyuga 99 06.10.21 05:45 Сейчас в теме
Видимо отсутствует реквизит "ФайлХранилище" типа "ХранилищеЗначения".
4. Deemon82 06.10.21 11:40 Сейчас в теме
(2) Не не, все норм, тип реквизита справочника выбран типа ХранилищеЗначения, иначе бы в обработчике ПередЗаписьюНаСервере все это не работало.
7. Avimyn 07.10.21 11:41 Сейчас в теме
Неверно идёт работа с данными формы. Реквизит формы "Объект" (тип "ДанныеФормыСтруктура") и объект базы данных (тип "СправочникОбъект.<СправочникИмя>") - разные вещи, которые не обязаны совпадать. На это и намекает платформа, когда выдаёт ошибку об отсутствии у данных формы свойства "ФайлХранилище", его действительно нет, т.к. платформа не добавляет в данные формы реквизиты объекта с типом "ХранилищеЗначения".

В Вашем случае для корректной работы механизма лучше всего ограничиться помещением файла в связанное с формой временное хранилище без вызова немедленного сохранения:
&НаКлиенте
Процедура Добавить(Команда)
    НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект),, , Истина , УникальныйИдентификатор);

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

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


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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот