Имя: Пароль:
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
28 Ivanich
 
03.04.25
17:22
Попробовал тест на серверной базе.
Постгри (если нужна версия - узнаю у сисадминов)
1С:Комплексная автоматизация 2 (2.5.17.202)
Платформа: (8.3.24.1586)
Тонкий клиент
Число записей: 15000

ИТОГ:
экономный вариант  проиграл (!) 19%

Может кто объяснить?
У меня КА серверная (на локальном компе), а ЕРП файловая.
Подозреваю, что от конфигурации не сильно зависит.
29 timurhv
 
03.04.25
17:39
(28) Зачем это все? На клиент с сервера и обратно будет передаваться только необходимая измененная информация, давно уже оптимизировали этот процесс.
Конструкции (0) уже давно устарели для оптимизаторов:

8.3.21 — Оптимизирована передача табличных частей с сервера на клиент в форме клиентского приложения. В случае, если на сервере выполняется изменение строк табличной части, на клиента передаются строки, которые состоят только из измененных колонок. Передаются изменения только тех строк, которые ранее переданы на сторону клиента. Передача осуществляется порциями по 35 строк (или менее). Если на сервере изменено более 105 строк (3 порции по 35 строк), то после передачи трех порций по 35 строк в каждой, выполняется передача на клиента всех строк табличной части. При открытии формы на клиента всегда передается не более 35 строк.

Т.е. платформа сама запоминает что нужно обновить и передает измененную информацию, в вашем случае вы передаете всегда всю информацию.
30 Fedor-1971
 
03.04.25
17:39
(28) Делал через вот такой вариант?
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив( РезультатЗапроса.Выгрузить() );

По факту, ты:
1. выбрал данные НаСервере
2. обход данных 1: преобразовал таблицу значений в массив структур
3. потерял кусок времени на передачу массива на Клиент (чай, не маленький)
4. обход 2: перебрал массив на клиенте и записал данные в ТЧ
вот тут плюсом будет автоматическая беготня формы НаСервер для сохранения буфера

В варианте "Сбегал на НаСервер" контекстным вызовом:
1. выбрал данные
2. Напрямую заполнил ТЧ
3. Вернулся НаКлиент
и получил "щасце" - потери времени минимальны
31 Ivanich
 
03.04.25
17:41
(29) "Конструкции (0) уже давно устарели для оптимизаторов"
А пример кода можно? Как правильно писать, или универсального решения нет?
32 Ivanich
 
03.04.25
17:44
(30) Спасибо! Отличное объяснение!
33 timurhv
 
03.04.25
20:12
(31) В видео сравнение как было и как стало. Можете свое решение аналогичным образом посмотреть по траффику.
https://youtu.be/MZ0CCw5CCwA?t=1620
Ошибка? Это не ошибка, это системная функция.