Имя: Пароль:
1C
 
Программная работа с картинками.
0 Trimax
 
13.11.19
12:02
Исходные данные: ERP 2.5, Платформа 8.3.13.15. Работаем с расширением.
Задача: Програмно в расширении добавить поле с выбором картинки логотипа контрагента.
В расширении общие модули.
&Перед("ПриСозданииНаСервере")
Процедура АБ_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
"Наковырял" код
...
Если Форма.ИмяФормы = "Справочник.Партнеры.Форма.ФормаЭлементаРеквизитыКонтрагента" Тогда
        
        ДобавляемыеРеквизиты    = Новый Массив;
        РеквизитСсылкаНаКартинку = Новый РеквизитФормы("СсылкаНаКартинку",    Новый ОписаниеТипов("Строка"),    , "СсылкаНаКартинку");
        ДобавляемыеРеквизиты.Добавить(РеквизитСсылкаНаКартинку);
        Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
        Элементы = Форма.Элементы;
        ПолеФормы = Элементы.Добавить("СсылкаНаКартинку", Тип("ПолеФормы"), Элементы.ГруппаОбщаяИнформация);
        ПолеФормы.Вид                          = ВидПоляФормы.ПолеКартинки;
        
        ПолеФормы.Заголовок= "Логотип";
        
        ПолеФормы.ПутьКДанным="СсылкаНаКартинку";
        ПолеФормы.Доступность= Истина;
        ПолеФормы.Видимость = ИСТИНА;
        ПолеФормы.Гиперссылка=Истина;
        ПолеФормы.ТолькоПросмотр               = Ложь;
        ПолеФормы.УстановитьДействие("Нажатие", "СсылкаНаКартинкуНажатие");
    КонецЕсли;
....
Так вот "нажатие" не отрабатывает в процедуру. Т.е выдает стандартное окно "".
Подскажите, где ошибка.
1 mikecool
 
13.11.19
12:12
емнип, действие надо на стороне клиента устанавливать
2 Trimax
 
13.11.19
14:10
(1) Подскажи, как направить на сторону клиента, не вытаскивая форму в расширение.Что дописать. Или дай, пжалуста ссылку где почитать.
3 Trimax
 
13.11.19
14:30
Вот, что в основном пишут в интернетах
.....
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = «Покупатель»;

Назначение элементу формы обработчика события:

ЭлементПокупатель.УстановитьДействие(«ПриИзменении», «Подключаемый_ПокупательПриИзменении»);

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении(Элемент)
   // Действия события
КонецПроцедуры
Т.е Установитьдействие указывается при создании элемента на сервере и прописывается передача на клиент. Вроде как похоже, но есть мааленький ньюанс: тут указан вид элемента ПолеВВода, а у меня строка. Может где-то тут собака порылась?
4 spiller26
 
13.11.19
14:32
(3) Размести элемент без расширения на тестовой и смотри, что у как.
5 spiller26
 
13.11.19
14:44
1. Тебе нужно новый реквизит на форме (тип строка)
2. Разместить Поле для этого реквизита на форме
3. Добавить событие для этого поля
4. Обработчик события написать

Так в помощь, на сервере вытаскивает картинку
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
абтСсылкаПодписьВДокументах = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "абтПодписьВДокументах");
6 Trimax
 
13.11.19
14:49
(5) Первый и второй пункты имеются в наличии. В ыорме появляется нужное мне поле с нужным реквизитом. Затык с п.3. Как описать событие?
Т.е.   ПолеФормы.УстановитьДействие("Нажатие", "СсылкаНаКартинкуНажатие"); не работает и без ошибок.
7 Trimax
 
13.11.19
14:52
+6 по замыслу при нажатии на поле должна открыть выбор картинки согласно процедуре.
&НаКлиенте
Процедура СсылкаНаКартинкуНажатие(Элемент, СтандартнаяОбработка)
              СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытия.ПолноеИмяФайла = "";
    Фильтр = "Файл Jpg (*.jpg)|*.jpg";
    ДиалогОткрытия.Фильтр = Фильтр;
    ДиалогОткрытия.МножественныйВыбор = Ложь;
    ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
    ДиалогОткрытия.Показать(ОписаниеОповещения);    
КонецПроцедуры
Но она не попадает в эту процедуру вообще.
Выплывает окно 1С "".
8 spiller26
 
13.11.19
14:58
(7) Я делал так, но это в Документообороте

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

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

        ФайловыеФункцииКлиент.ВыбратьКартинкуИПоместитьВХранилище(
            ОписаниеОповещения, УникальныйИдентификатор,, Истина);
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура абтВыборКартинкиПродолжение(Результат, Параметры) Экспорт

    Если Результат <> Истина Тогда
        Возврат;
    КонецЕсли;
    
    абтСсылкаПодписьВДокументах = Параметры.АдресВременногоХранилищаФайла;
    Модифицированность = Истина;
    
КонецПроцедуры
9 Trimax
 
13.11.19
15:06
(8) Да это уже следующий шаг процедуры выбора картинки... Мне сейчас необходимо вообще создать "что-то", что-бы при нажатии на форму элемента, уходило в процедуру. А сейчас у меня выскакивает стандартное окно.
10 spiller26
 
13.11.19
15:14
(9) В процедуру попадает "СсылкаНаКартинкуНажатие"?
11 Trimax
 
13.11.19
15:16
(10) Нет! В этом и затык. Хоть на сервере объявлял, хоть на клиенте. Просто не попадает.
12 Trimax
 
13.11.19
15:20
Хм. Решил "извратится по-полной". Добавил кнопку програмно.

Кмд = Форма.Команды.Добавить("Команда1");
    Кмд.Действие = "АБ_СсылкаНаКартинкуНажатие";
    Кмд.Заголовок = "Нажатие кнопки";
         Элемент2 = Форма.Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"), Форма.Элементы.ГруппаОбщаяИнформация);
    Элемент2.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
    Элемент2.ИмяКоманды = "Команда1";
Эффект тот-же. "0". Жмякаешь и ни чего не открывается.
Может есть какая-то стандартная процедура выбора картинки.
13 spiller26
 
13.11.19
17:35
Вот наваял.

https://prnt.sc/pwfi1h

[]В расширение кидаем
ОбщМодуль.УправлениеСвойствами
  - В модуле прописываем.

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

[] Справочники.Контрагенты:
- Добавляем реквизит "Расш1_Логотип" (тип ХранилищеЗначений)
- кидаем "ФормуЭлемента", убираем всё лишнее.
В модуле прописываем

//////////////////////////////////////////////////////////////////////////////////////////////////

&НаКлиенте
Процедура Расш1_Поле1НажатиеВместо(Элемент, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    
    ОписаниеОповещения = Новый ОписаниеОповещения("Расш1_ОбработатьВыборФайлаКартинки", ЭтаФорма);
    
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогОткрытияФайла.Фильтр                      = "Файлы картинка (*.jpg) |*.jpg";
    ДиалогОткрытияФайла.Заголовок                   = "Выберете файл для загрузки";
    ДиалогОткрытияФайла.ПредварительныйПросмотр     = Ложь;
    ДиалогОткрытияФайла.МножественныйВыбор          = Ложь;
    ДиалогОткрытияФайла.Расширение                  = "jpg";
    
    НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);
    
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ОбработатьВыборФайлаКартинки(ПомещенныеФайлы, ДопПараметры) Экспорт
    
    Если ПомещенныеФайлы = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Расш1_Логотип = ПомещенныеФайлы[0].Хранение;
    Модифицированность = Истина;     
    
КонецПроцедуры // ()
///////////////////////////////////////////////////////////////////////////////////////////

Получаем
https://prnt.sc/pwfoyt
Итог
https://prnt.sc/pwfq46
14 Trimax
 
14.11.19
08:24
(13) Огромное спасибо от души!!! Сейчас буду пробовать. Уточняющий вопрос. Форму обязательно кидать в расширение? Ибо смысл был не добавлять форму в расширение, т.к. она тащит за собой все реквизиты.
15 spiller26
 
14.11.19
10:23
(14) Форму обязательно, т.к. события нужно в модуле формы писать.
Убери их из расширения, должно получится как на картинке, без лишнего всего. На самой форме всё равно ничего добавлять не будешь (уже в общем описано добавление будет), только будет задействован модуль формы.
16 spiller26
 
14.11.19
10:30
Вот выгрузил расширение. Делал в БП 3.0.73.46
https://yadi.sk/d/daXgM8HJZ9RXYw