|
Реквизит типа таблица значений в тонком клиенте | ☑ | ||
---|---|---|---|---|
0
mishkerdon
06.05.14
✎
19:41
|
В общем у меня есть форма отчета с реквизитом типа "Таблица значений". В этом реквизите есть колонка "Помещение" типа "Справочник.Помещение".
Когда я заполняю на сервере этот реквизит, потом при переборе через цикл пытаюсь получить доступ к полям справочника этой колонки (ну например, наименование, площадь и т.п.) он ругается что таких полей нету. Что я делаю не так?? |
|||
1
ДенисЧ
06.05.14
✎
19:42
|
Делай на сервере
|
|||
2
mishkerdon
06.05.14
✎
19:44
|
ДенисЧ, я пытаюсь именно на клиенте, так как создаю COMОбъект (Word) и пихаю в него данные. Как можно на клиенте сделать это??
|
|||
3
ДенисЧ
06.05.14
✎
19:45
|
"Исправьте 6 ошибок в слове 'клиент' и вы получите правильный ответ!"
|
|||
4
mishkerdon
06.05.14
✎
19:47
|
а как вообще реализовать заполнение COMОбъекта на сервере и передача его клиенту?? Через ВременноеХранилище только?
|
|||
5
SSSSS_AAAAA
06.05.14
✎
19:53
|
(4) Данные дергают на сервере, а не на клиенте. И потом пихают куда надо.
|
|||
6
oleg_prg
06.05.14
✎
19:55
|
Как-то так
&НаСервере Функция ПолучитьРеквизит(ПарамРеквизит, Имя) Рез = ""; Выполнить("Рез = ПарамРеквизит."+СокрЛП(Имя)); Возврат Рез; КонецФункции &НаКлиенте Процедура Х() Сообщить(ПолучитьРеквизит(ТЗначений.Помещение, "Метраж")); Сообщить(ПолучитьРеквизит(ТЗначений.Помещение, "Наименование")); Сообщить(ПолучитьРеквизит(ТЗначений.Помещение, "ЛюбоеПоле")); КонецПроцедуры Думаю идея понятна |
|||
7
mishkerdon
06.05.14
✎
19:58
|
ну вот в том то и дело что у меня очень много данных разномастных берется из базы (некоторые справочники до 20 реквизитов имеют), и в ворде некоторые данные пихаются в виде таблиц по циклу, а некоторые через ContentControl. Неужели нельзя как то автоматизированно создавать коллекцию структур уже при передаче данных???
А трюк с выполнить не будет снижать производительность? Чтобы на каждый элемент ТЗ туда сюда гонять данные? |
|||
8
Defender aka LINN
06.05.14
✎
20:01
|
(6) У тебя вместо коленки уже титановый протез, не иначе...
|
|||
9
oleg_prg
06.05.14
✎
20:05
|
(8) Лучше код напиши. В вопросе человек в принципе не понимает как вытянуть на клиенте реквизит доступный на сервере, я кинул первым, что пришло в голову. Это код для понимания самого принципа.
|
|||
10
mishkerdon
06.05.14
✎
20:09
|
да я знаю этот трюк с "Выполнить". Просто когда у меня идет цикл на 800 строк, а внутри него еще цикл по 10-20 строк, к тому же эту задачу параллельно запускает 5 человек, то тут мне кажется "Выполнить" просто схавает сеть и сервер.
|
|||
11
oleg_prg
06.05.14
✎
20:12
|
Причем здесь выполнить... Создайте функцию на сервере в которой сформируйте нужную таблицу с реквизитами типа строка и отдайте эту таблицу на клиент. Я же говорю мой пример это лишь пример для понимания, как с сервера вытянуть нужную информацию
|
|||
12
Defender aka LINN
06.05.14
✎
20:14
|
(9) Код в типовых уже давно написан, даже, я так подозреваю, в типовых для Белоруссии.
|
|||
13
mishkerdon
06.05.14
✎
20:15
|
т.е. все равно придется для каждой таблицы формировать свои примитивные таблицы с полями типа "Строка"?
|
|||
14
oleg_prg
06.05.14
✎
20:21
|
Думаю да, если я не прав, пусть поправят.
PS вот без выполнить ) &НаСервере Функция ПолучитьРеквизит(ПарамРеквизит, Имя) Возврат ПарамРеквизит[Имя]; КонецФункции |
|||
15
Fragster
гуру
06.05.14
✎
20:31
|
обычно запросом получают все нужные данные, а затем уже обходят его результат. В данном случае - нужно заполнить коллекцию на сервере и обойти ее на клиенте.
а Пока Выборка.Следующий() Цикл ... Выборка.Номенклатура.БазоваяЕдиницаИзмерения ... КонецЦикла И в обычных формах было говнокодом. |
|||
16
Zhuravlik
06.05.14
✎
20:46
|
(0)
- В управляемых формах "&НаКлиенте" нет типа "ТаблицаЗначений". Но есть тип "ДанныеФормаКоллекция". - В клиентских процедурах недоступно обращение через точку к ссылочным типам данных, поскольку это является по-сути запросом к БД, а все запросы должны происходить на сервере (&НаСервере - с передачей контекста формы, или &НаСервереБезКонтекста). - Неправильно воспользоваться примером, приведенным в (14) - явное обращение через точку означает что платформа выполнит запрос к базе типа: "ВЫБРАТЬ * ИЗ Справочники.Помещения КАК Помещения ГДЕ Ссылка = &Ссылка", т.е. получает все поля объекта. Все поля дольше получать чем одно поле) - Необходимо стремится к тому, чтобы минимизировать объем данных, получаемых в запросе от сервера. - Следует избегать запросов в цикле. з.ы. В типовых конфах есть универсальная процедура для получения реквизитов объекта, туда передается ссылка на объект и структура, в которой каждый ключ - это наименование поля. К объекту строится запрос, результат которого заполняет структуру по ключам, и возвращает эти данные. Искать в модулях "ОбщегоНазначения" и "ОбщегоНазначенияПовтИсп". Самое лучшее при получении реквизитов использовать эту функцию из модуля "ОбщегоНазначенияПовтИсп" - но следует учитывать что возвращаемые значения закешируются, может случиться что после получения данных значение реквизита изменилось. И т.д. и т.п. Так-то) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |