Имя: Пароль:
1C
1С v8
Обычное приложение. Мутабельность коллекций
,
0 Ненавижу 1С
 
гуру
22.07.13
16:06
1. Этому есть простое обоснование 60% (3)
2. Нормального обоснования нет 20% (1)
3. Никогда об этом не думал и не хочу 20% (1)
Всего мнений: 5

Почему одни коллекции можно передать на сервер, а другие - нельзя. Почему некоторые из них мутабельные?
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
Или вводить две функции на сервере

Процедура ПроцедураНаСервере(спз)
КонецПроцедуры


Процедура ПроцедураСКлиентаНаСервер(Хранилище)
Спз= Хранилище.Получить();
ПроцедураНаСервере(спз)
КонецПроцедуры
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн