Имя: Пароль:
1C
 
Простой вопрос: метод ЗначениеВРеквизитФормы(,"");
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