|
Обычное приложение. Мутабельность коллекций | ☑ | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0
Ненавижу 1С
гуру
22.07.13
✎
16:06
|
Почему одни коллекции можно передать на сервер, а другие - нельзя. Почему некоторые из них мутабельные?
|
||||||||||
1
mikecool
22.07.13
✎
16:08
|
а ломало разрабов писать их сериализацию
|
||||||||||
2
H A D G E H O G s
22.07.13
✎
16:10
|
Пофиг.
Никогда об этом не думал и не хочу |
||||||||||
3
Fragster
гуру
22.07.13
✎
16:11
|
слайды! слайды!
Этому есть простое обоснование |
||||||||||
4
Serginio1
22.07.13
✎
16:13
|
(22) Некоторые вещи тяжело сериализовать. Например у строки таблицы значений есть свойство владелец. То есть по уму нужно сериализовать ТЗ и из неё выделить Строку.
Кроме того может быть иерархия. Скорее всего с этим и связано. Хотя это относится к способам сериализации графа |
||||||||||
5
wowik
22.07.13
✎
16:18
|
1С - аксиома. Нужно принимать как есть.
Нормального обоснования нет |
||||||||||
6
Ненавижу 1С
гуру
22.07.13
✎
16:19
|
(3) какие нах слайды то?
(4) ТЗ разве нельзя передать на сервер? |
||||||||||
7
IШаман
22.07.13
✎
16:21
|
А примеры можно какие именно коллекции можно передать а какие нет.
|
||||||||||
8
Serginio1
22.07.13
✎
16:22
|
(6) А вот строка ТЗ вроде не сериализыется?
|
||||||||||
9
Ненавижу 1С
гуру
22.07.13
✎
16:23
|
(7) СП нельзя передать, а массив можно
|
||||||||||
10
vista
22.07.13
✎
16:23
|
(7)
Разве нельзя сделать 2 типа переменных - типы по значению и типы по ссылке? И в зависимости от типа сериализовать определённым образом. |
||||||||||
11
Serginio1
22.07.13
✎
16:26
|
(9) А строку массива?
|
||||||||||
12
ДенисЧ
22.07.13
✎
16:27
|
(11) А что такое "строка массива"?
|
||||||||||
13
Serginio1
22.07.13
✎
16:29
|
(12) Совсем запарился. Это просто элемент. Нет у строки массива владельца.
(9) А что такое СП? |
||||||||||
14
Ненавижу 1С
гуру
22.07.13
✎
16:30
|
(13) не СП, а СЗ=спиок значений
|
||||||||||
15
Kyon8
22.07.13
✎
16:32
|
(1) +1
А сейчас вообще обычное приложение разрабов не интересует. Этому есть простое обоснование |
||||||||||
16
IШаман
22.07.13
✎
16:33
|
А в массиве и списке одни и те же элементы?
|
||||||||||
17
Nexux
22.07.13
✎
16:34
|
(1)два липтона этому господину
Этому есть простое обоснование |
||||||||||
18
Serginio1
22.07.13
✎
16:34
|
(14 ) Почему не сериализуется?
Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueListType. А вот почему нельзя передать ХЗ |
||||||||||
19
Maxus43
22.07.13
✎
16:35
|
При чем тут сериализация? Мутабельный это не значит Несериализуемый. Объект тоже сериализуется, но менее мутабельным не становится
|
||||||||||
20
IШаман
22.07.13
✎
16:35
|
А вообще ТЗ не передается по значению. Потому она и является мутабельной.
|
||||||||||
21
Ненавижу 1С
гуру
22.07.13
✎
16:35
|
(16) конечно
(18) ну и я про тоже |
||||||||||
22
Ненавижу 1С
гуру
22.07.13
✎
16:36
|
(20) а массив?
|
||||||||||
23
Serginio1
22.07.13
✎
16:36
|
18 Просто элементы могут содержать несериализуемые объекты
|
||||||||||
24
IШаман
22.07.13
✎
16:37
|
(22) Массив - точно не знаю, но судя по всему да - надо попробовать.
|
||||||||||
25
Serginio1
22.07.13
✎
16:38
|
(22) Вообще в 1С все параметры передаются по ссылке.
Кстат а если поставить перед параметром Знач? |
||||||||||
26
Ненавижу 1С
гуру
22.07.13
✎
16:38
|
(25) думаешь перестанет передавать по ссылке?
|
||||||||||
27
Serginio1
22.07.13
✎
16:39
|
25+ А вообще в том же COM для этого существует маршалинг
|
||||||||||
28
Maxus43
22.07.13
✎
16:39
|
мутабельность - Это официальный термин из теории программирования. Мутабельные и немутабельные значения есть практически во всех языках программирования. Это принцип классификации. Например, в .Net есть строки (String) - немутабельные и объект StringBuilder - мутабельный тип (с) ВР.
Так реализовано |
||||||||||
29
Serginio1
22.07.13
✎
16:40
|
(26) ХЗ передача по ссылке гарантирует изменяемость объекта на стороне сервера.
|
||||||||||
30
IШаман
22.07.13
✎
16:40
|
(25) На 5-й год практики программирования ты открыл для себя что передача парметров может быть осуществлена разными способами?
|
||||||||||
31
IШаман
22.07.13
✎
16:41
|
(26) ТЗ всегда по ссылке передается, х.з. почему так в 1с сделано. Может память экономят:)
|
||||||||||
32
Serginio1
22.07.13
✎
16:42
|
(30) Ну вообще то я это знаю 26 лет.
|
||||||||||
33
IШаман
22.07.13
✎
16:42
|
(32) Слава богу.
|
||||||||||
34
Serginio1
22.07.13
✎
16:46
|
(31) Есть понятие адрес ссылки. Например если я на сервере присвою этому параметру новую тз, то на клиенте она тоже передастся. Значение для тз это адрес Тз в памяти, по ссылке это адрес переменной ссылающуюся на ТЗ
|
||||||||||
35
IШаман
22.07.13
✎
16:47
|
(34) Указателей в 1с нет, поэтому по адресу у вас врят ли что то получиться передать.
|
||||||||||
36
Serginio1
22.07.13
✎
16:48
|
34+ Просто в том же СОМ такие объекты прекрасно маршализируются
|
||||||||||
37
Serginio1
22.07.13
✎
16:51
|
(35) Они есть. Просто все параметры в 1С по умолчпнию передаются как адреса переменных. Для передачи по значению есть
Знач Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении функции никак не повлияет на фактический параметр, переданный при вызове функции. Если это ключевое слово не указано, то параметр функции передается по ссылке, то есть изменение внутри функции значения формального параметра приведет к изменению значения соответствующего фактического параметра. |
||||||||||
38
Ненавижу 1С
гуру
22.07.13
✎
16:53
|
(37) проверь тут:
А = Новый Массив(); А.Добавить(1); Пример(А); Сообщить(А.Количество()); Процедура Пример(Знач А) А.Очистить(); КонецПроцедуры |
||||||||||
39
IШаман
22.07.13
✎
16:54
|
(37) Но для ТЗ всегда передается по ссылке, а не по значению.
|
||||||||||
40
Ненавижу 1С
гуру
22.07.13
✎
16:55
|
(37) и там скорее всего не передача ссылки, а inout параметр через стек вызовов
|
||||||||||
41
Infsams654
22.07.13
✎
16:57
|
(0) см. (4). Проще говоря, все что есть внутри коллекции, тоже должно быть сериализуемо
|
||||||||||
42
Serginio1
22.07.13
✎
17:03
|
(38) Это не то. Очистить все будет.
Другого не будет Процедура Пример(Знач А) А=3; КонецПроцедуры |
||||||||||
43
Ненавижу 1С
гуру
22.07.13
✎
17:04
|
(42) а вот это как раз не интересно
|
||||||||||
44
Serginio1
22.07.13
✎
17:05
|
(40) В любом случае ты можешь сереализовать в строку или лучше в ХранилищеЗначения и не парится
|
||||||||||
45
Serginio1
22.07.13
✎
17:13
|
Например
Хранилище = Новый ХранилищеЗначения(СпЗ, Сжатие); СтрокаXML=XMLСтрока(ХранилищеКартинки ); Передать на сервер СтрокаXML Хранилище = XMLЗначение(Тип("ХранилищеЗначения"), СтрокаXML); Спз= Хранилище.Получить(); |
||||||||||
46
Serginio1
22.07.13
✎
17:16
|
(43) Кстати для этого фиксированный массив структура и прочее предусмотрено
|
||||||||||
47
Serginio1
22.07.13
✎
17:20
|
Добавь в голосование, что нехотят заниматься маршалингом и лень им было добавить тип ФиксированныйСписокЗначений.
Или вообще ввести конструктор для фиксированной коллекции |
||||||||||
48
Лефмихалыч
модератор
22.07.13
✎
17:29
|
(25) все равно передастся по ссылке. Много объектов еще так себя ведут.
|
||||||||||
49
Serginio1
22.07.13
✎
17:45
|
(48) Не будет как (42) (передается ссылка на Тз, а не ссылка на переменную которая содержит ссылку на ТЗ)
А вообще Ответ в фиксированных коллекциях. Например у массива есть фиксированный массив, но и массив может передаваться на сервер. Им нужно было создавать конструктор который бы делал объекто только для чтения. Например в C# есть ReadOnlyCollection |
||||||||||
50
Serginio1
22.07.13
✎
17:47
|
49 А вообще могли бы добавить просто параметр, который бы делал бы полную копию. В любом случае код в 45 не слишком трудозатратен.
|
||||||||||
51
Serginio1
22.07.13
✎
17:51
|
Кстати хранилище значение передается на сервер.
Хранилище = Новый ХранилищеЗначения(СпЗ, Сжатие); Передать на сервер Хранилище Это и будет фиксированным списком Спз= Хранилище.Получить(); |
||||||||||
52
Serginio1
22.07.13
✎
18:00
|
(51) Но я за то, что бы ввести ReadOnlyCollection (Фиксированная коллекция). Тогда если данные передаются в процессе сервера, то передается ссылка на ReadOnlyCollection, а если между клиенто и сервером то коллекция сериализуется.
|
||||||||||
53
Serginio1
22.07.13
✎
18:17
|
Или вводить две функции на сервере
Процедура ПроцедураНаСервере(спз) КонецПроцедуры Процедура ПроцедураСКлиентаНаСервер(Хранилище) Спз= Хранилище.Получить(); ПроцедураНаСервере(спз) КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |