Имя: Пароль:
1C
1С v8
Передача данных с сервера на клиент
0 Lika_350
 
29.10.21
11:56
Добрый день
Ситуация такая - необходимо добавить ссылку на лида в карточку покупателя. При нажатии на ссылку должна открыться карточка лида (ФормаЭлемента)

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

    КонецЦикла;

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


&НаКлиенте
Процедура ПереходПоСсылке()
        
     ОткрытьФорму("Справочники.Лиды.Форма.ФормаЭлемента");
    
КонецПроцедуры

Как правильно это сделать - не знаю. Просьба тапками не кидаться, я только-только учусь
1 mikecool
 
29.10.21
12:04
ничего не понял
2 Asmody
 
29.10.21
12:08
(0) логика примерно такая:

в обработчике нажатия на ссылку:
1. Вызвать функцию на сервере, которая вернет нужную ссылку
2. Открыть форму полученной ссылки


создание самих ссылок надо делать где-нибудь ПриСозданииНаСервере или ПриЧтенииНаСервере
3 Kassern
 
29.10.21
12:08
(0) если мы говорим в общем случае, то вам нужна функция, а не процедура. На клиенте вызываете функцию, к примеру Лид=ПолучитьЛидПоКонтрагентуНаСервере(Контрагент) А дальше уже суйте куда надо эту ссылку. Получается вы с клиента запросили данные с сервера и вернули результат на клиент
4 fisher
 
29.10.21
12:37
(0) Ну, если минимальными усилиями относительно сабжевого кода, то попробуй типа такого (сам не тестил):

&НаКлиенте
Перем СоответствиеЛидовЭлементамФормы;

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

    КонецЦикла;

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


&НаКлиенте
Процедура ПереходПоСсылке()
    
    ПоказатьЗначение(, СоответствиеЛидовЭлементамФормы[ТекущийЭлемент]);
    
КонецПроцедуры
5 fisher
 
29.10.21
12:40
Но изначально я бы добавил табличку в реквизиты формы для хранения списка лидов. А на форме прямо эту табличку и отображал если лидов несколько или одну гипперсылку показывал, если лид один. Тогда и динамически генерить элементы формы не надо и хранение данных проще и нагляднее.
6 fisher
 
29.10.21
12:43
А не, фигню написал. Ты же список лидов на сервере получаешь. Тогда так как я написал не получится.
7 fisher
 
29.10.21
12:44
Нужно соответствие на клиента вытягивать.
8 Lika_350
 
29.10.21
13:14
(4) Вылезает ошибка по строчке ПоказатьЗначение(, СоответствиеЛидовЭлементамФормы[ТекущийЭлемент]);
Получение элемента по индексу для значения не определено((
9 Lika_350
 
29.10.21
13:24
(7)
А как правильно вытянуть то?
10 fisher
 
29.10.21
14:03
(9) Лучше создай в реквизитах формы табличку "Лиды" с колонкой "Лид". Тогда можно попробовать так сделать:

&НаСервере
Процедура ПолучениеСсылки()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СвязиКонтрагентЛид.Лид.Ссылка КАК Лид
        |ИЗ
        |    РегистрСведений.СвязиКонтрагентЛид КАК СвязиКонтрагентЛид
        |ГДЕ
        |    СвязиКонтрагентЛид.Контрагент = &Контрагент";
    
    Запрос.УстановитьПараметр("Контрагент", Объект.Ссылка);
    
    Лиды.Загрузить(Запрос.Выполнить.Выгрузить());
    
    Для Каждого СтрокаЛида Из Лиды Цикл
    
          Элемент = ЭтаФорма.Элементы.Добавить(ВыборкаДетальныеЗаписиЛиды.ЛидСсылка,Тип("ДекорацияФормы"));  
          Элемент.Имя = "Лид" + Лиды.Индекс(СтрокаЛида);
          Элемент.Гиперссылка  = Истина;
          Элемент.Заголовок  =  СтрокаЛида.Лид;
          Элемент.УстановитьДействие("Нажатие", "ПереходПоСсылке");
          
    КонецЦикла;

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


&НаКлиенте
Процедура ПереходПоСсылке()
    
    ИндексЛида = Число(Сред(ТекущийЭлемент.Имя, 4));
    
    ПоказатьЗначение(, Лиды[ИндексЛида].Лид);
    
КонецПроцедуры

Вообще я стараюсь избегать фокусов с такой вот "арифметикой на именах" и использовать более явные связи, если это возможно. Здесь это для упрощения решения. Попробуй сначала хоть так.
11 fisher
 
29.10.21
14:03
А ПолучениеСсылки() ты откуда вызываешь? При создании формы на сервере?
12 Lika_350
 
29.10.21
14:05
(11)

Да, изначально код вообще там был, потом создала отдельную процедуру
13 Lika_350
 
29.10.21
14:06
(10) Мне по заданию нужно добавлять реквизиты программно, не изменяя реквизиты формы, вот и мучаюсь
14 Kassern
 
29.10.21
14:21
15 youalex
 
29.10.21
14:45
(13) если реквизиты нельзя по условию, можно формировать имя элемента по значению ссылки, вроде:

ИмяЭлемента = "Лид_" + СтрЗаменить(XMLСтрока(ВыборкаИзЗапроса.Ссылка), "-", "_");
Элемент = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), Элементы.Группа1Ссылки);  //Элементы.Группа1Ссылки - лучше их все же в отдельной группе создавать

а в обработке, указанной в УстановитьДействие() - обратное преобразование:

ГУИД = СтрЗаменить(Сред(Элемент.Имя, 5), "_", "-"); //первые 4 это "Лид_"
СсылкаЛида = XMLЗначение(Тип("ДокументСсылка.Документ1"), ГУИД);
ПоказатьЗначение(, СсылкаЛида);