Имя: Пароль:
1C
 
Как передать реквизит формы "ДеревоЗначений" на сервер?
0 Mobilis77
 
13.09.26
12:38
Уважаемый ALL, прошу помочь, возможно с примитивным вопросом, но не могу понять, что делаю не так.  Имеется форма, В ней добавлен реквизит ФормаДерево с типом "ДеревоЗначений". Пытаюсь передать это дерево на сервер для дальнейшей его обработки (считывания данных из него).

&НаСервере
Функция ОбработатьДеревоНаСервере(ДеревоФормы)    
   Дерево = РеквизитФормыВЗначение(ДеревоФормы, Тип("ДеревоЗначений") );
        
КонецФункции

&НаКлиенте
Процедура СоздатьДокументИзДерева(Команда)    
    ОбработатьДеревоНаСервере(ФормаДерево);    
КонецПроцедуры

В результате получаю ошибку в серверной функции: Несоответствие типов параметр 1.  Хотя в отладчике ДеревоФормы имеет тип ДанныеФормыДерево.  Что делаю не так?
1 Mobilis77
 
13.09.26
12:33
Отладчик
2 Dirk Diggler
 
13.09.26
12:45
ЕМНИП тз и дз плохо сериализуются. Перед передачей в многоуровневый массив структур надо превращать.
3 Сергиус
 
13.09.26
12:53
(0)А если попробовать через ДанныеФормыВЗначение?
4 Mobilis77
 
13.09.26
12:59
(3) Дружище, спасибо, сработало.
5 Mobilis77
 
13.09.26
14:37
Не тут то было. На сервере дерево формируется, можно его обрабатывать. Но, даже если в серверной процедуре только

&НаСервере
Функция ОбработатьДеревоНаСервере(ДеревоФормы)    
   Дерево = ДанныеФормыВЗначение(ДеревоФормы, Тип("ДеревоЗначений") );
        
КонецФункции


То по окончанию процедуры на клиенте ошибка: Нельзя изменять поле, содержащее объект данных формы
[ОшибкаИспользованияВстроенногоЯзыка]
6 Garykom
 
гуру
13.09.26
19:03
Подучи уже теорию

Если у тебя &НаСервере (не &НаСервереБезКонтекста) то и ТЗ и ДЗ (когда они реквизиты формы) есть и на клиенте и на сервере - ничего никуда через параметры процедуры/функции передавать не надо! Если конечно не в другой общий модуль например передавать
Только есть не в виде ТЗ или ДЗ а в виде ДанныеФормыКоллекция или ДанныеФормыДерево

Т.е. с этим вот твоим реквизитом формы ДеревоФормы можно работать на сервере (на клиенте тоже но урезано) напрямую как с коллекцией
Либо можно там же на сервере сделать РеквизитФормыВЗначение и превратить ДанныеФормыДерево (для ТЗ ДанныеФормыКоллекция) в настоящее ДеревоЗначений (или ТаблицуЗначений)
Работать с ДЗ как угодно а затем сделать обратно ЗначениеВРеквизитФормы

ДанныеФормыВЗначение/ЗначениеВДанныеФормы примерно тоже самое что и РеквизитФормыВЗначение/ЗначениеВРеквизитФормы но работает еще и &НаСервереБезКонтекста
7 Garykom
 
гуру
13.09.26
19:09
А еще лучше после 1С 7.7 перед тем как приступать к изучению 1С 8 УФ
Сначала вкратце изучить веб и браузерные технологии
Ну вот эти HTML/CSS и JavaScript на фронте (клиенте) и с любым языком на бэке (сервере), можно даже PHP как основу или сразу Golang или Python
Это быстро по верхам пробежаться и попробовать сваять нечто простое в виде клиента и сервера
Но зато потом будет все понятно откуда вытекло такое сложное в УФ
8 Mobilis77
 
13.09.26
22:29
(6) Спасибо за науку. Занимаюсь кодом не часто, совсем забыл что &НаСервере  "пакует" и передает форму тоже. Может подскажете как передать реквизит формы (тип деревоЗначений) в процедуру &НаСервереБезКонтекста  ?
9 Сергиус
 
13.09.26
22:45
(8)Какая цель перебора строк дерева? Так то можно его и на клиенте обойти через ПолучитьЭлементы()
10 Сергиус
 
13.09.26
22:49
+(9)Так то вам правильно про массив структур подсказали в (2). Либо работайте в контексте формы с ним
11 Garykom
 
гуру
13.09.26
23:01
(8)
&НаСервере  "пакует" и передает форму тоже

Нифига, форма с контекстом всегда и на сервере и на клиенте ибо там Stateful а не Stateless
И постоянная синхронизация, если умудрился разорвать ее - будет ошибка платформы
Передача с клиента с паковкой это как раз если &НаСервереБезКонтекста делать в том же модуле формы
Или вызывать с клиента УФ методы в других (не самой формы) модулях серверных, где разрешен вызов сервера с клиента
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн