Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 01:14

Не работает код из книжки

Автор Andrej23, 28 дек 2013, 20:07

0 Пользователей и 1 гость просматривают эту тему.

Andrej23

Доброго времени суток.

Пробую код из книжки и столкнулся с такой проблемой: сделал форму элемента справочника, в справочник добавил реквизит КартинкаТовара с типом ХранилищеЗначения. На форму элемента повесил кнопку с вызовом команды формы для загрузки картинки в КартинкаТовара.
Конфигуратор ругается на то, что неизвестен тип значения. Подскажите пожалуйста где ошибка. 1с 8.2

&НаКлиенте
Процедура ЗагрузитьКартинку1(Команда)
// Вставить содержимое обработчика.
Режим = РежимДиалогаВыбораФайла.Открытие;
Фильтр = "Текст(*.*)|*.*";
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
КартинкаТовара = ХранилищеКартинки;
КонецЕсли
КонецПроцедуры

Andrej23

Вот в этой строке:
ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);

Тип не определен (ХранилищеЗначения)
      ХранилищеКартинки = Новый <<?>>ХранилищеЗначения(ВыбраннаяКартинка);       (Проверка: Тонкий клиент)

Besart

ХранилищеЗначения (ValueStorage)
На основании значения
Синтаксис:

Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>)
Параметры:

<Значение> (обязательный)

Тип: Произвольный.
Значение, которое должно быть помещено в хранилище.
<АлгоритмСжатияДанных> (необязательный)

Тип: СжатиеДанных.
Задает степень сжатия данных.
Описание:

Создает объект ХранилищеЗначения и помещает в него заданное значение.
Конструктор доступен только в режиме запуска "Толстый клиент", на сервере и внешнем соединении.

DmitriyF

&НаКлиенте
Процедура ЗагрузитьКартинку1(Команда)
   // Вставить содержимое обработчика.
#Если Сервер ИЛИ ТолстыйКлиент Тогда
   Режим = РежимДиалогаВыбораФайла.Открытие;
   Фильтр = "Текст(*.*)|*.*";
   ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
   ДиалогОткрытияФайла.ПолноеИмяФайла = "";
   ДиалогОткрытияФайла.Фильтр = Фильтр;
   ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
   ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
   Если ДиалогОткрытияФайла.Выбрать() Тогда
      ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
      ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
      КартинкаТовара = ХранилищеКартинки;
   КонецЕсли
#Иначе
Вызов процедуры на сервере
#КонецЕсли
КонецПроцедуры

Нет под рукой 1с но вроде должно быть как то так.

Andrej23

Сделал, но не работает

&НаСервере
Процедура ЗагрузитьКартинку123(Команда)
   #Если Сервер ИЛИ ТолстыйКлиент Тогда
   ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогОткрытияФайла.ПолноеИмяФайла = "";
   ДиалогОткрытияФайла.Фильтр = "Текст(*.*)|*.*";
   ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
   ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
   Если ДиалогОткрытияФайла.Выбрать() Тогда
      ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
     ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
      КартинкаТовара = ХранилищеКартинки;
   КонецЕсли
#Иначе
#КонецЕсли
КонецПроцедуры
(пришлось без "code" т.к. переносы не переносятся).

В строке
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

конфигуратор пишет ту же ошибку:
Тип не определен (ДиалогВыбораФайла)
   ДиалогОткрытияФайла = Новый <<?>>ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); (Проверка: Сервер)


Besart

&НаКлиенте
Процедура ЗагрузитьКартинку123(Команда)
   ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогОткрытияФайла.ПолноеИмяФайла = "";
   ДиалогОткрытияФайла.Фильтр = "Текст(*.*)|*.*";
   ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
   ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
   Если ДиалогОткрытияФайла.Выбрать() Тогда
      ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
        #Если Сервер ИЛИ ТолстыйКлиент Тогда
            ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
            КартинкаТовара = ХранилищеКартинки;
        #Иначе
            ХранилищеНаСервере(ВыбраннаяКартинка);
        #КонецЕсли
   КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ХранилищеНаСервере(ВыбраннаяКартинка)
     ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
      КартинкаТовара = ХранилищеКартинки;
КонецПроцедуры;

Andrej23

Спасибо, теперь загрузка проходит без ошибки.

Подскажите еще пожалуйста, а можно на эту же форму после загрузки вывести загруженную в реквизит КартинкаТовара картинку?

Пробовал сделать на форме реквизит Декорация1 (поле картинки), но она ссылается на строковой реквизит с путем к файлу и где-то ошибся - код почему-то не распознает реквизит справочника КартинкаТовара (тип ХранилищеЗначения).

Пробовал вот так:

&НаКлиенте
Процедура ЗагрузитьКартинку123(Команда)  //загружает картинку в реквизит справочника КартинкаТовара.
   ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогОткрытияФайла.ПолноеИмяФайла = "";
   ДиалогОткрытияФайла.Фильтр = "Текст(*.*)|*.*";
   ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
   ДиалогОткрытияФайла.Заголовок = "Выберите картинку";
   Если ДиалогОткрытияФайла.Выбрать() Тогда
      ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла);
        #Если Сервер ИЛИ ТолстыйКлиент Тогда
            ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
            КартинкаТовара = ХранилищеКартинки;
        #Иначе
            ХранилищеНаСервере(ВыбраннаяКартинка);
        #КонецЕсли
   КонецЕсли
КонецПроцедуры

Процедура ПриОткрытии(Отказ) //здесь хотел сделать загрузку картинки на форму в реквизит Декорация1 при открытии формы элемента
   КартинкаТов = Новый Картинка();
   ЗагрКартинки(КартинкаТов);
Если КартинкаТов <> Неопределено Тогда
   Элементы.Декорация1.Картинка = КартинкаТов;
КонецЕсли
КонецПроцедуры 


&НаСервере
Процедура ХранилищеНаСервере(ВыбраннаяКартинка)
     ХранилищеКартинки = Новый ХранилищеЗначения(ВыбраннаяКартинка);
     КартинкаТовара = ХранилищеКартинки;
КонецПроцедуры;
 
Процедура ЗагрКартинки(КартинкаТов)
   КартинкаТов = КартинкаТовара.Получить();
КонецПроцедуры;

Besart

см. решение по з.5.2 из сборника

Andrej23

Огромное спасибо, буду разбираться :)

Теги: картинка 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск