|
Простой вопрос: метод ЗначениеВРеквизитФормы(,""); , , mszsuz, Vbirf, Fedor-1971, Rovan, АЛьФ, Anton1307, Gennady, Ivanich, Уран Ренгенович, toypaul, Stepashkin, butterbean
| ☑ | ||
---|---|---|---|---|
0
Ivanich
01.04.25
✎
14:05
|
всегда работал так и не задумывался:
ОбъектОбр = РеквизитФормыВЗначение("Объект",); //ОбъектОбр.ТЧ; заполняю и т.д..... ЗначениеВРеквизитФормы(ОбъектОбр,"Объект"); Всё Ок! Сегодня, думаю, зачем всю форму гонять, хочу только таб.часть тчДопУсл = РеквизитФормыВЗначение("Объект.тчДопУслуги",); //тчДопУсл заполняю, вижу что заполняется..... ЗначениеВРеквизитФормы(тчДопУсл,"тчДопУслуги"); текст ошибки: Недопустимое значение параметра (параметр номер '2') [ОшибкаИспользованияВстроенногоЯзыка] пробовал так: ЗначениеВРеквизитФормы(тчДопУсл,"Объект.тчДопУслуги"); та же ошибка. Как правильно сделать? |
|||
1
Мультук
гуру
01.04.25
✎
14:13
|
(0)
И где тут проникновенные методы РеквизитФормыВЗначение, РеквизитФормыВЗначение ? &НаСервере Процедура ЗаполнитьТабЧасть() тз = ПолучитьДанныеХренЗнаетОткуда(); Объект.тчДопУслуги.Загрузить(тз); КонецПроцедуры Для сильных экономистов, которые не хотят гонять форму на сервер в контексте &НаКлиенте Процедура ЗаполнитьТабЧасть() массивСтруктур = ПолучитьДанныеХренЗнаетОткудаНаСервереБезКонтекста(); Для каждого строка из массивСтруктур Цикл НоваяСтрока = Объект.тчДопУслуги.Добавить(); ЗаполнитьЗначенияСвойств( НоваяСтрока, Строка); Конеццикла; КонецПроцедуры |
|||
2
Anton1307
01.04.25
✎
14:13
|
тчДопУсл = Объект.тчДопУслуги.Выгрузиить()
... Объект.тчДопУслуги.Загрузить(тчДопУсл) |
|||
3
Ivanich
01.04.25
✎
14:18
|
(2) это же на &НаКлиенте
а алгоритм заполнения требует действий на сервере |
|||
4
Ivanich
01.04.25
✎
14:32
|
(1) Вот здесь тоже про разбор синтаксиса ничего не сказали:
Как правильно работать с ЗначениеВРеквизитФормы() |
|||
5
Ivanich
01.04.25
✎
14:24
|
(1) спасибо, возьму на заметку.
Но вопрос текста ошибки не раскрыт |
|||
6
Fedor-1971
01.04.25
✎
14:33
|
(3) так не вопрос, перейди в процедуру на сервере и как в (2) Выгрузи ТЧ - поправь - Загрузи изменённые
Либо, получи данные для изменения и перебирай записи Объект.ТвояТЧ и поправляй оные |
|||
7
Garykom
гуру
01.04.25
✎
14:40
|
(0) Можно только реквизиты формы (в именах методов так и написано "РеквизитФормы")
Объект.ТЧ - это табличная часть реквизита формы, ее отдельно низзя так Т.е. реквизит формы можно целиком а часть реквизита нини И как правильно выше написали у ТЧ (или иной коллекции) есть свои методы Выгрузить/Загрузить |
|||
8
Мультук
гуру
01.04.25
✎
14:42
|
(3)
Возьмем простейший код из формы ЗаказКлиента. На форме Объект имеет тип ДокументОбъект.ЗаказКлиента ДокументПродажи = РеквизитФормыВЗначение("Объект"); ЦеныРасчитаны = ДокументПродажи.ЗаполнитьУсловияПродажПоСоглашению(ПересчитыватьЦены); ЗначениеВРеквизитФормы(ДокументПродажи, "Объект"); Но запустив отладку мы получим ТИПЗнч(Объект) === ДанныеФормыСтруктура (а вовсе не ДокументОбъект.ЗаказКлиента) А вот ТИПЗнч(ДокументПродажи ) === ДокументОбъект.ЗаказКлиента Отлично. Получение ДокументОбъект.ЗаказКлиента оправдано, ибо делается, чтобы вызвать метод из модуля документа, ибо по другому вызвать этот метод никак нельзя. Что говорит нам ТИПЗнч(Объект.Товары ) === ДанныеФормыКоллекция Допустим вы делаете таблицаЗначений = РеквизитФормыВЗначение("Объект.Товары"); Но Объект.Товары это не таблица значений, а табличная часть. И совсем непонятно, почему она должна превратиться в таблицу значений. И главное зачем, ибо таблицаЗначений = Объект.Товары.Выгрузить(); или Объект.Товары.Загрузить(тз) |
|||
9
Ivanich
01.04.25
✎
15:04
|
&НаСервере
Процедура ЗаполнитьДопУсл() тчДопУсл = РеквизитФормыВЗначение("Объект.тчДопУслуги",); //выполнил заполнение и ВСЁ КонецПроцедуры Действительно, для работы табличной частью метод ЗначениеВРеквизитФормы( ,"Объект") НЕ нужен |
|||
10
Мультук
гуру
01.04.25
✎
15:12
|
(9)
Вы так ничего и не поняли. &НаСервере Процедура ЗаполнитьДопУсл() тчДопУсл = Объект.тчДопУслуги; //выполнил заполнение и ВСЁ КонецПроцедуры |
|||
11
Ivanich
01.04.25
✎
15:19
|
(10) Спасибо! Проверил - работает. (мне стыдно...)
|
|||
12
Галахад
гуру
01.04.25
✎
20:40
|
(1) Про "сильных экономистов" это пять! 👍
|
|||
13
Anton1307
01.04.25
✎
20:40
|
(3) Так это...
А выполнив РеквизитФормыВЗначение("Объект.тчДопУслуги",) объект какого типа планируется получить? Таблица значений? Она априори присутствует только на сервере. |
|||
14
timurhv
01.04.25
✎
21:49
|
(1) Ну придет там нежданчиком 1 млн строк с отключенным ограничением в 100к строк, что будет?
|
|||
15
Мультук
гуру
01.04.25
✎
21:53
|
(14)
Я не знаю. Не пробовал. Точнее так - у меня обычно приходит то что нужно и сколько нужно. Какие ваши предложения ? |
|||
16
Asmody
01.04.25
✎
22:16
|
(14) Если вы понимаете, что у вас там может прилететь миллион строк, то архитектуру такой формы надо делать по-другому. По-взрослому: порционные данные, пагинаторы и все такое.
|
|||
17
timurhv
01.04.25
✎
23:09
|
(16) Ну так байт был на:
"Для сильных экономистов, которые не хотят гонять форму на сервер в контексте" А так РС с заполнением на сервере или около того. |
|||
18
Fedor-1971
02.04.25
✎
10:50
|
(14) по факту, получится тормозной документ (может листаться и открываться медленно и вдумчиво) или отвалится клиент
Но технически всё прожуётся, просто форма сама будет ломиться на сервер для заполнения буфера строк в Объекте (вывод ДС с данными РС - не всегда панацея, т.к. только что созданный документ не имеет ссылки, придётся изобретать велосипед как различать данные для разных документов) |
|||
19
Ivanich
02.04.25
✎
11:11
|
Сделал тест:
Файловая ЕРП 2.5.17.192 платформа 8.3.24.1586 Толстый клиент Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОбороты.Период КАК Период, | ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОбороты.Склад КАК Склад, | ТоварыНаСкладахОбороты.ВНаличииПриход КАК ВНаличииПриход, | ТоварыНаСкладахОбороты.ВНаличииРасход КАК ВНаличииРасход |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(, , Секунда, ) КАК ТоварыНаСкладахОбороты"; кол-во возвращаемых строк 10027 Результат: форма на сервере Объект.ТЧ.Загрузить(РезультатЗапроса.Выгрузить()); 1.939805 или 55,32% ----------------------------------------------- форму на сервер НЕ передаём массивСтруктур = Команда2НаСервере(); 0.830070 или 23.67% + ЗаполнитьЗначенияСвойств( НоваяСтрока, Строка); 0.209769 или 5.98% = 29,65% |
|||
20
Мультук
гуру
02.04.25
✎
11:13
|
(19)
Было интересно до слов Толстый клиент После этого - не интересно |
|||
21
Ivanich
02.04.25
✎
11:15
|
Т.е. для "сильных экономистов" выигрыш почти в 2 раза.
может, конечно, ещё тест как-то можно поменять...
|
|||
22
Ivanich
02.04.25
✎
11:15
|
(20) - сейчас под тонким попробую....
|
|||
23
Ivanich
02.04.25
✎
11:24
|
тонкий.
Форма на сервере: 0.985447 а "сильный экономист" ошибка: Ошибка при вызове метода контекста (Команда2НаСервере) {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(23)}:массивСтруктур = Команда2НаСервере(); [ОшибкаВоВремяВыполненияВстроенногоЯзыка] по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: НачалоСвойства: ret Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType по причине: Ошибка отображения типов: Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable' |
|||
24
Ivanich
02.04.25
✎
11:27
|
&НаСервереБезКонтекста
Функция Команда2НаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОбороты.Период КАК Период, | ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОбороты.Склад КАК Склад, | ТоварыНаСкладахОбороты.ВНаличииПриход КАК ВНаличииПриход, | ТоварыНаСкладахОбороты.ВНаличииРасход КАК ВНаличииРасход |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(, , Секунда, ) КАК ТоварыНаСкладахОбороты"; РезультатЗапроса = Запрос.Выполнить(); Возврат РезультатЗапроса.Выгрузить(); КонецФункции Может быть ошибка здесь: Возврат РезультатЗапроса.Выгрузить();??? |
|||
25
Fedor-1971
02.04.25
✎
11:39
|
(24) Да, ТаблицуЗначений между Сервером и Клиентом гонять не получится, придётся извращаться (например, положить оную в параметр формы и делать контекстный вызов сервера)
Потому, где ТЗ получили, там и обрабатываем |
|||
26
Мультук
гуру
02.04.25
✎
11:42
|
(24)
В (3) я как бы намекнул массивСтруктур = ПолучитьДанныеХренЗнаетОткудаНаСервереБезКонтекста(); Так делать можно, но не нужно. Только для "экномистов" и экспериментаторов. &НаСервереБезКонтекста Функция Команда2НаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОбороты.Период КАК Период, | ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОбороты.Склад КАК Склад, | ТоварыНаСкладахОбороты.ВНаличииПриход КАК ВНаличииПриход, | ТоварыНаСкладахОбороты.ВНаличииРасход КАК ВНаличииРасход |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(, , Секунда, ) КАК ТоварыНаСкладахОбороты"; РезультатЗапроса = Запрос.Выполнить(); Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив( РезультатЗапроса.Выгрузить() ); КонецФункции |
|||
27
Ivanich
02.04.25
✎
13:44
|
Тонкий клиент
1.920524 - форма на сервер передаётся 1.480308 - форма на сервер НЕ передаётся Выигрыш 1,3
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |