Несколько дней убил на то что бы разобраться в данном вопросе. Отлаживал выгрузку на сторонний веб сервис через пакеты XDTO. Долго не мог разобраться почему не работает. В итоге родился вот такой код.
Кто без подсказке сможет сразу сказать что будет сообщено пользователю?
Для меня это явилось полной неожиданностью, но я получил
1
1
1
Пробовал на платформе 8.3.16.1224
Структура1 = Новый ФиксированнаяСтруктура("Значение, Массив"
,"Значение структуры 1"
,Новый Массив);
Структура2 = Новый Структура(Структура1);
Структура3 = Новый Структура(Структура1);
Структура3.Значение="Значение структуры 2";
Структура3.Массив.Добавить("Элемент массива");
Сообщить(Структура1.Массив.Количество());
Сообщить(Структура2.Массив.Количество());
Сообщить(Структура3.Массив.Количество());
ПоказатьКто без подсказке сможет сразу сказать что будет сообщено пользователю?
Для меня это явилось полной неожиданностью, но я получил
1
1
1
Пробовал на платформе 8.3.16.1224
По теме из базы знаний
- Работа со схемой запроса
- Как работают управляемые формы и тонкий клиент 1С – взгляд "из-под капота"
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Управление сборкой. Расширение для конфигурации СППР
- Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Дело не совсем в структурах. Вот аналогичный код, который даст ровно тот же результат:
Переменная Массив1 по сути содержит в себе ссылку на некоторую область данных, где и хранятся элементы массива. Когда мы присваиваем переменной Массив2 значение Массив1, мы копируем лишь ссылку. Сами данные остаются неизменными, не копируются, а лежат все в той же области оперативной памяти, что и раньше. Соответственно меняя по ссылке данные массива, мы увидим это изменение для любых ссылок, что имеются в подпрограмме.
Аналогично и с Вашими структурами. При копировании структуры копируются их ключи и значения. В качестве значений выступают не сами элементы массива, а лишь ссылка на область данных, где эти значения элементов массива хранятся. Потому и кажется, что массивы в структурах меняются синхронно. На самом деле это все один и тот же массив.
Массив1 = Новый Массив;
Массив2 = Массив1;
Массив3 = Массив1;
Массив1.Добавить("Значение");
Сообщить(Массив1.Количество());
Сообщить(Массив2.Количество());
Сообщить(Массив3.Количество());
ПоказатьПеременная Массив1 по сути содержит в себе ссылку на некоторую область данных, где и хранятся элементы массива. Когда мы присваиваем переменной Массив2 значение Массив1, мы копируем лишь ссылку. Сами данные остаются неизменными, не копируются, а лежат все в той же области оперативной памяти, что и раньше. Соответственно меняя по ссылке данные массива, мы увидим это изменение для любых ссылок, что имеются в подпрограмме.
Аналогично и с Вашими структурами. При копировании структуры копируются их ключи и значения. В качестве значений выступают не сами элементы массива, а лишь ссылка на область данных, где эти значения элементов массива хранятся. Потому и кажется, что массивы в структурах меняются синхронно. На самом деле это все один и тот же массив.
(2)
Я примерно так и понял. Просто на осознания этого у меня ушло много времени. Ожидаешь несколько другого поведения.
Аналогично и с Вашими структурами. При копировании структуры копируются их ключи и значения. В качестве значений выступают не сами элементы массива, а лишь ссылка на область данных, где эти значения элементов массива хранятся. Потому и кажется, что массивы в структурах меняются синхронно. На самом деле это все один и тот же массив.
Я примерно так и понял. Просто на осознания этого у меня ушло много времени. Ожидаешь несколько другого поведения.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот