8.х Ошибка получения из ХранилищаЗначений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Svb, 13 авг 2016.

  1. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    1.069
    Симпатии:
    23
    Баллы:
    29
    Добрый день.
    Не понимаю почему метод получить() возвращает неопределено?
    2016-08-13_00-15-23.png
    Что за подстава? Платформа 8.3.6.2363
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.681
    Симпатии:
    886
    Баллы:
    204
    Причины не скажу, возможно как-то связано с неявным вызовом сервер после того, как структура сформировалась.
    В общем сделай через временное хранилище.
  3. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    1.069
    Симпатии:
    23
    Баллы:
    29
    Не получилось. С хранилищем значения, результат ровно тот же.
    А вот в толстом клиенте оба варианта (и мой, и с хранилищем значения) отрабатывают. Не пойму в чем дело.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.681
    Симпатии:
    886
    Баллы:
    204
    А как делал через временное хранилище?
  5. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    1.069
    Симпатии:
    23
    Баллы:
    29
    Привет.
    Код ниже. Я во временное хранилище помещаю структуру, в которую входят двоичные данные. Так вот остальные элементы структуры (дата, строка) получаются из хранилища корректно. А двоичные данные - нет.
    Код:
    &НаКлиенте
    Процедура ОткрытьФайлОписания()
    
        ТекСтрока = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;
        Если ТекСтрока=Неопределено Тогда Возврат; КонецЕсли;
    
        Адрес = Новый УникальныйИдентификатор;
    
        ПолучитьФайлОписанияВХранилищеСервер(ТекСтрока.ПрикрепленныйФайл, Адрес);
    
        ДанныеФайлаОписания = ПолучитьИзВременногоХранилища(Адрес);
    
        ВременныйФайл = ПолучитьИмяВременногоФайла(ДанныеФайлаОписания.РасширениеФайла);
        ДвоичныеДанные = ДанныеФайлаОписания.ДвоичныеДанные.Получить();
        ДвоичныеДанные.Записать(ВременныйФайл);
    
        НачатьЗапускПриложения(
            Новый ОписаниеОповещения("ВыполнитьОткрытиеФайлаОписания", ЭтотОбъект),
            ВременныйФайл,
            ,
            Истина
        );
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура ПолучитьФайлОписанияВХранилищеСервер(ПрикрепленныйФайл, Адрес=Неопределено)
    
        Запрос = Новый Запрос("ВЫБРАТЬ
                              |    ПрикрепленныеФайлы.Наименование,
                              |    ПрикрепленныеФайлы.ХранилищеЗначения КАК ДвоичныеДанные,
                              |    ПрикрепленныеФайлы.РасширениеФайла,
                              |    ПрикрепленныеФайлы.РазмерФайла
                              |ИЗ
                              |    Справочник.ПрикрепленныеФайлы КАК ПрикрепленныеФайлы
                              |ГДЕ
                              |    ПрикрепленныеФайлы.Ссылка = &ПрикрепленныйФайл");
        Запрос.УстановитьПараметр("ПрикрепленныйФайл", ПрикрепленныйФайл);
        ДанныеФайла = Запрос.Выполнить().Выбрать();
        ДанныеФайла.Следующий();
        Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла");
        ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла);
    
        Адрес = ПоместитьВоВременноеХранилище(Результат, Адрес);
    
    КонецПроцедуры
    
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.681
    Симпатии:
    886
    Баллы:
    204
    А так?
    Код:
    ........
    Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла");
    
    ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла, , "ДвоичныеДанные");
    
    Результат.Вставить("ДвоичныеДанные". ДанныеФайла.ДвоичныеДанные.Получить());
    .............
    
    Svb нравится это.
  7. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    1.069
    Симпатии:
    23
    Баллы:
    29
    Вот же ж! Работает, спасибо!
  8. pihy
    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Сделал все по аналогии. Но все равно
    ДанныеФайла.ДвоичныеДанные.Получить() принимает значение НЕОПРЕДЕЛЕНО, хотя
    ДанныеФайла.ДвоичныеДанные имеет значение ХранилищеЗначения

    это платформа выделывается?
  9. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    142
    Симпатии:
    16
    Баллы:
    29
    блин, ну СП кто читать будет?

    ХранилищеЗначения.Получить() - Сервер и толстый клиент, ... !

    1.получите на сервере значение
    2.сохраните во временный файл
    3.передайте его на клиент

    ХранилищеЗначения (ValueStorage)
    Получить (Get)
    Синтаксис:
    Получить()
    Возвращаемое значение:
    Тип: Произвольный.
    Значение, содержащееся в хранилище.
    Описание:
    Получает из хранилища сохраненное в нем значение.
    Доступность:
    Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
    Пример:
    МояКартинка = ХранилищеКартинки.Получить
  10. pihy
    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    А если я на сервере получаю запросом список прикрепленных файлов к номенклатуре и на клиент мне не нужно его передавать, а сохранить на диск с определенным наименованием по маске?
    ХранилищеЗначения.Получить().Записать([ПутьСохраненияФайла]) - так не корректно?
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.681
    Симпатии:
    886
    Баллы:
    204
    Корректно.
  12. pihy
    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Застрял и все тут. Вот мой код:

    Код:
    &НаСервере
    Процедура ЗаполнитьНаСервере()
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла КАК Номенклатура,
        |    НоменклатураПрисоединенныеФайлы.Ссылка КАК ПрисоединенныйФайл,
        |    "" "" КАК ИмяФайла,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Код КАК Код,
        |    НоменклатураПрисоединенныеФайлы.Расширение КАК РасширениеФайла,
        |    НоменклатураПрисоединенныеФайлы.Размер КАК РазмерФайла
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
        |ГДЕ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.ПометкаУдаления = ЛОЖЬ
        |
        |УПОРЯДОЧИТЬ ПО
        |    Номенклатура,
        |    ПрисоединенныйФайл
        |АВТОУПОРЯДОЧИВАНИЕ";
       
        ДанныеФайла = Запрос.Выполнить().Выбрать();
       
        ИндексФайла = 1;
        ПредыдущаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка();
       
        Пока ДанныеФайла.Следующий() Цикл
           
           
            Если ДанныеФайла.Номенклатура = ПредыдущаяНоменклатура Тогда
               
                ИндексФайла = ИндексФайла+1;
               
                ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура;
                ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="\",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"\") + ДанныеФайла.Код +"-" +Строка(ИндексФайла) + ".jpg";
               
            Иначе
               
                ИндексФайла = 1;
               
                ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура;
                ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="\",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"\") + ДанныеФайла.Код + ".jpg";
               
            КонецЕсли;
           
            ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить().Записать(ИмяФайла);
           
        КонецЦикла;
       
    КонецПроцедуры
    
    ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище имеет значение:
    [​IMG]
    а ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить() возвращает Неопределено
    [​IMG]
    ну и, соответственно, дальше ошибка "значение не является значением объектного типа..."

    Ткните, пожалуйста, в каком моменте туплю.
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.681
    Симпатии:
    886
    Баллы:
    204
    Если возвращает неопределено, значит нет ничего в хранилище.
  14. pihy
    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Действительно. Оказалось, изображения хранятся в РегистрыСведений.ПрисоединенныеФайлы - там все заработало. Спасибо всем)
Похожие темы
  1. skv_79
    Ответов:
    21
    Просмотров:
    3.161
  2. sanpolyt
    Ответов:
    3
    Просмотров:
    5.975
  3. bigrunner
    Ответов:
    9
    Просмотров:
    949
  4. Tasya
    Ответов:
    0
    Просмотров:
    470
  5. Bkmz
    Ответов:
    10
    Просмотров:
    417
Загрузка...

Поделиться этой страницей