Имя: Пароль:
1C
1С v8
Реквизит типа таблица значений в тонком клиенте
,
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) - явное обращение через точку означает что платформа выполнит запрос к базе типа: "ВЫБРАТЬ * ИЗ Справочники.Помещения КАК Помещения ГДЕ Ссылка = &Ссылка", т.е. получает все поля объекта. Все поля дольше получать чем одно поле)
- Необходимо стремится к тому, чтобы минимизировать объем данных, получаемых в запросе от сервера.
- Следует избегать запросов в цикле.
з.ы. В типовых конфах есть универсальная процедура для получения реквизитов объекта, туда передается ссылка на объект и структура, в которой каждый ключ - это наименование поля. К объекту строится запрос, результат которого заполняет структуру по ключам, и возвращает эти данные. Искать в модулях "ОбщегоНазначения" и "ОбщегоНазначенияПовтИсп".
Самое лучшее при получении реквизитов использовать эту функцию из модуля "ОбщегоНазначенияПовтИсп" - но следует учитывать что возвращаемые значения закешируются, может случиться что после получения данных значение реквизита изменилось.
И т.д. и т.п.
Так-то)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн