Имя: Пароль:
1C
1С v8
Получить значение элемента с управляемой формы
0 Rizhij_Nikitos
 
12.02.13
19:19
Собственно задача поднималась мною пару дней назад и кое-как я решил вопрос, получаю на клиенте форму, открываю ее, перебираю все значения полей ввода и флажков, записываю имена таблиц, после чего закрываю форму и передаю инфу на сервак, клепаю простенький отчет о том как называется элемент и что содержит, в т.ч. отслеживаю на каких страницах что находится.

Но вот косяк. Господа разработчики, как последние собаки, взяли и назвали реквизит немного не так, как называется элемент на форме, в итоге обращаясь к Форма[Элемент.Имя] или к Форма.Объект[Элемент.Имя], дабы получить его содержание, я вылетаю с ошибкой потому что Элемент.Имя=РеализацияПоЗаказу, а Форма.Объект[Элемент.Имя]=РеализацияПоЗаказам.

Возник вопрос, как мне управляемую форму разобрать так, чтобы полностью получить имя реквизита, соответствующего полю на форме.
1 Rizhij_Nikitos
 
12.02.13
19:33
Вверх
2 GANR
 
12.02.13
19:35
(0) Этот код должен выпоняться на сервере

Форма[]
3 GANR
 
12.02.13
19:35
Форма[ИмяЭлемента].ПутьКДанным
4 Rizhij_Nikitos
 
12.02.13
19:36
Ты очень умный, скажи как мне форму на сервере получить?
5 GANR
 
12.02.13
19:42
В модуле формы можно сделать что-то вроде

&НаСервере
Функция ПолучитьПутьЭлемента(ИмяЭлемента)
   Возврат Элементы[ИмяЭлемента].ПутьКДанным
КонецФункции

(4) Ты хочешь передать форму в некий общий модуль так? Тогда дествия такие (с клиента, на сервер в качестве параметра ее передать нельзя)

1. модуль формы
&НаСервере
Процедура ТвояПроцедура()
   ТвойСерверныйОбщийМодуль.ТвояФункция(ЭтаФорма)
КонецПроцедуры

2. серверный общий модуль
Функция ТвояФункция(Форма)
   ...
   ТвойПуть = Форма.Элементы.ТвойЭлемент.ПутьКДанным;
   ...
КонецФункции

Пойдет?
6 GANR
 
12.02.13
19:46
С клиента, на сервер в качестве параметра процедуры/функции форму передать нельзя. Обходной путь - зайти в подпрограмму с директивой &НаСервере.
7 Rizhij_Nikitos
 
12.02.13
19:48
Так объясню. Я выбираю на форме отчета любой справочник или документ, после чего выбираю объект\документ. Надо получить его форму, после чего обойти все его элементы формы и вывести их названия и значения которые они содержат. Это внешний отчет и работать должно в любой типовой УТ11/КА1.1/БП3.0
8 GANR
 
12.02.13
19:55
(7) Хм. ПолучитьФорму(...) только на клиенте работает. Да уж, вилы.
9 GANR
 
12.02.13
19:58
И метаданные, похоже, тоже не выход
10 Rizhij_Nikitos
 
12.02.13
20:00
Все было хорошо и даже получалось, пока совпадали имена реквизитов формы и пути к данным
11 MSII
 
12.02.13
20:00
Записать имена элементов, реквизитов и значения реквизитов в какую-то подходящую коллекцию и передать ее на сервер. В чем проблема? Или я неправильно понял задачу?
12 Rizhij_Nikitos
 
12.02.13
20:06
Имена всех элементов и я могу списать, реквизитов тоже. Как их сопоставить?
13 MSII
 
12.02.13
20:09
(12) На клиенте же ты их можешь сопоставить. У элемента читаешь свойство ПутьКДанным, пишешь в коллекцию - имя элемента, его путь к данным, значение реквизита. Все это пакуй и на сервер. Нет?
14 Rizhij_Nikitos
 
12.02.13
20:14
Нет. У элемента на форме нет пути к данным, потому что как не странно, у элемента на форме нет доступа к данным. Путь к данным возможен только на сервере.
15 Rizhij_Nikitos
 
12.02.13
20:27
Вверз
16 V_V_V
 
12.02.13
20:33
Элементы не спасут отца?
17 Rizhij_Nikitos
 
12.02.13
20:34
(16) предлагай
18 V_V_V
 
12.02.13
20:36
(14) Если тебе данные нужно возвращать на сервер - почему не перебрать все элементы еще ПриСозданииНаСервере?
19 Rizhij_Nikitos
 
12.02.13
20:44
(18) при создании на сервере чего? У меня внешний отчет. Я в нем получаю основную форму указанного документа или справочника.
20 MSII
 
12.02.13
20:48
(19) Тогда беда. Жди, когда подписки на события форм появятся. Все ждем и ты жди. Или модифицируй форму.
21 Rizhij_Nikitos
 
12.02.13
20:50
(20) все управляемые формы во всех конфах с управляемыми формами у всех клиентов?))))
22 Rizhij_Nikitos
 
12.02.13
20:51
(20) начну сейчас, чтобы завтра уже поехать по клиентам ставить новый "релиз"...
23 MSII
 
12.02.13
20:56
(22) Без паники. Предлагаю решение - обернуть присваивание в попытку, а в исключении сообщать - "Внимание! Имена реквизита формы и элемента формы различны! Немедленно внесите изменения в конфигурацию!" и на этом завершать построение отчета.
24 Rizhij_Nikitos
 
12.02.13
20:58
(23) почти это и делаю, только я придумал так - записывать имя элемента и давать пользователю сопоставить со всеми объектами это имя элемента, типа как "Для элемента ХХХ не определен источник данных, пожалуйста определите имя реквизита, который является источником данных для данного реквизита:"
И вываливается список всех объектов с возможностью выбора одного. А данные выбора засуну в отчет.
25 GANR
 
13.02.13
03:15
(24)Пиши рационализаторское предложение разработчикам платформы на [email protected] с указанием конфы, платформы, рег. номера программного продукта и фирмы (без этого - пошлют).
26 GANR
 
13.02.13
03:17
+(25) И ты, (20), пиши и убеждай.
27 НЕА123
 
13.02.13
08:32
1. модуль формы
&НаКлиенте
Процедура ТвояПроцедура()
   Для Каждого ЭЛ из Элементы Цикл
   ТвойПуть = ТвойСерверныйОбщийМодуль.ТвояФункция(ЭЛ);
   КонецЦикла
КонецПроцедуры


&НаСервере
Функция ТвояФункция(Форма)
   Попытка
   ТвойПуть = Форма.Элементы.ТвойЭлемент.ПутьКДанным;

    Исключение
   ТвойПуть = "";
   КонецПопытки
   Возврат ТвойПуть;
КонецФункции
28 НЕА123
 
13.02.13
08:33
1. модуль формы
&НаКлиенте
Процедура ТвояПроцедура()
   Для Каждого ЭЛ из Форма.Элементы Цикл
   ТвойПуть = ТвойСерверныйОбщийМодуль.ТвояФункция(ЭЛ);
   КонецЦикла
КонецПроцедуры


&НаСервере
Функция ТвояФункция()
   Попытка
   ТвойПуть = Форма.Элементы.ТвойЭлемент.ПутьКДанным;

    Исключение
   ТвойПуть = "";
   КонецПопытки
   Возврат ТвойПуть;
КонецФункции
29 НЕА123
 
13.02.13
08:35
мля...
не мое


1. модуль формы
&НаКлиенте
Процедура ТвояПроцедура()
   Для Каждого ЭЛ из Форма.Элементы Цикл
   ТвойПуть = ТвояФункция(ЭЛ);
   КонецЦикла
КонецПроцедуры


&НаСервере
Функция ТвояФункция(ЭЛ)
   Попытка
   ТвойПуть = ЭЛ.ПутьКДанным;

    Исключение
   ТвойПуть = "";
   КонецПопытки
   Возврат ТвойПуть;
КонецФункции
30 MSII
 
13.02.13
08:55
(26) Да кто я такой. Им там, на Селезневской, виднее, что и как.
31 Rizhij_Nikitos
 
13.02.13
09:32
(29) Одна проблема, для типов данных элементов на форме нет типов данных на сервере:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ГруппаФормы'
32 Поросенок Петр
 
13.02.13
09:34
Жесть. 31 пост решается совсем другая проблема.
33 Rizhij_Nikitos
 
13.02.13
09:45
(32) ты о чем?) В общем объясняю, что нужны отображения типов на сервере для того что бы передавать на сервер клиентские типы данных. Каждый раз определять что за тип и что то придумывать(а я честно даже не знаю, есть ли для этих типов отображения на сервере)...
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший