Почему платформа не передает ссылку на числовую переменную, хоть в ИТС и сказано, что по умолчанию должна передаваться именно ссылка?
Тут в качестве результата мы должны получить идентичные значения. Но они разные...
Процедура Инициализация()
ЧисловаяПеременная = 777;
П = Новый Структура ("ЧисловаяПеременная", ЧисловаяПеременная);
ЧисловаяПеременная = 888;
Тест(П);
Сообщить(СтрШаблон("%1, %2", ЧисловаяПеременная, П.ЧисловаяПеременная));
КонецПроцедуры
Процедура Тест(П)
Сообщить("Внутри тест: " + П.ЧисловаяПеременная);
П.ЧисловаяПеременная = 999;
КонецПроцедуры
ПоказатьТут в качестве результата мы должны получить идентичные значения. Но они разные...
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
А с чего они должны быть одинаковые?
Как раз работает передача по ссылке.
Смотрите:
1. Присваиваем переменной значение 777.
2. Сохраняет ссылку на переменную в структуру.
3. Присваиваем переменной значение 888. Тут это уже новая переменная с таким же именем. 1С это позволяет делать. Значение присваивания примитивных типов всегда делается по значению.
4. Передаем структуру по ссылке в другую процедуру.
5. В другой процедуре изменяем значение переменной 999. Фактически заменяем хранящуюся там переменную новым значением.
6. Возвращаемся обратно.
7. Выводим значение переменной и новое значение из структуры.
Тут главное понять, что в структуре хранится не ссылка, а туда передается значение по ссылке. Это разные операции.
Тут в качестве результата мы должны получить идентичные значения. Но они разные...
А с чего они должны быть одинаковые?
Как раз работает передача по ссылке.
Смотрите:
1. Присваиваем переменной значение 777.
2. Сохраняет ссылку на переменную в структуру.
3. Присваиваем переменной значение 888. Тут это уже новая переменная с таким же именем. 1С это позволяет делать. Значение присваивания примитивных типов всегда делается по значению.
4. Передаем структуру по ссылке в другую процедуру.
5. В другой процедуре изменяем значение переменной 999. Фактически заменяем хранящуюся там переменную новым значением.
6. Возвращаемся обратно.
7. Выводим значение переменной и новое значение из структуры.
Тут главное понять, что в структуре хранится не ссылка, а туда передается значение по ссылке. Это разные операции.
(4)
Это не так. Там все так же 777. Проверь сам.
Так как реализовать передачу ссылок на кучу переменных из одной процедуры в другую?
3. Присваиваем переменной значение 888. В структуре значение переменной так же 888.
Это не так. Там все так же 777. Проверь сам.
ЧисловаяПеременная = 777;
П = Новый Структура ("ЧисловаяПеременная", 0);
П.ЧисловаяПеременная = ЧисловаяПеременная;
ЧисловаяПеременная = 888;
Сообщить(СтрШаблон("1:%1, %2", ЧисловаяПеременная, П.ЧисловаяПеременная));
Тест(П);
Сообщить(СтрШаблон("2:%1, %2", ЧисловаяПеременная, П.ЧисловаяПеременная));
ПоказатьТак как реализовать передачу ссылок на кучу переменных из одной процедуры в другую?
(2) там сказано действительно только про передачу параметров. Но насколько я понимаю, если в качестве значения ключа в структуру передать другую структуру, то все-таки будет передана ссылка, а не копия структуры. Или я не прав? Каким образом вообще можно взять ссылку на любой тип переменной и поместить в муссив или структуру?
Вы путаете с передачей параметров процедур/функций. Там в самом деле по умолчанию передача параметров идет всегда по ссылке, даже примитивных типов (если не использовать Знач).
А в вашем примере аналог простого присваивания одной переменной примитивного типа другой. Оно всегда делается по значению.
Даже не знаю, в каких языках это иначе.
А в вашем примере аналог простого присваивания одной переменной примитивного типа другой. Оно всегда делается по значению.
Даже не знаю, в каких языках это иначе.
Стало быть вопрос должен решаться следующим образом:
Процедура Обработка(Объекты)
Перем1 = 0;
Перем2 = "Старое значение";
Перем3 = Ложь;
Перем4 = Новый Массив;
Перем4.Добавить("Неизбежность светлого будущего");
Перем5 = Неопределено;
Перем6 = Перем1;
Контекст = ПолучитьКонтекст(Перем1,
Перем2,
Перем3,
Перем4,
Перем5,
Перем6);
Если Объекты.Количество() > 0 Тогда
Если ТипЗнч(Объекты[0]) = Тип("ТаблицаЗначений") Тогда
Перем1 = 10;
ИзменениеПеременных(Контекст);
ИначеЕсли ТипЗнч(Объекты[0] = Тип("Структура") Тогда
Перем5 = ТекущаяДата();
ИзменениеПеременных(Контекст);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ИзменениеПеременных(Контекст)
Контекст.Перем1 = Контекст.Перем1 + 1;
Контекст.Перем2 = "Новое значение";
Контекст.Перем3 = Истина;
Контекст.Перем4 = Новый Массив;
Если Не ЗначениеЗаполнено(Контекст.Перем5) Тогда
Контекст.Перем5 = глЗначениеПоУмолчанию;
КонецЕсли;
Контекст.Перем6.Удалить(0);
КонецПроцедуры
Процедура ПолучитьКонтекст(Перем1,
Перем2,
Перем3,
Перем4,
Перем5,
Перем6)
// Перем100)
Возврат Новый Структура("Перем1
|Перем2,
|Перем3,
|Перем4,
|Перем5,
|Перем6",
Перем1,
Перем2,
Перем3,
Перем4,
Перем5,
Перем6);
КонецПроцедуры
Показать
(12) У меня тоже слезятся. Все потому, что разработчики 1С используют ООП, С++ и все богатые возможности этого языка, но не позволяют ничего подобного в синтаксисе их языка, намеренно ограничивая реальные возможности не только языка С++, но и GPLных библиотек, которые они используют. Очень надеюсь, что в ближайшем будущем основным скриптовым языком в 1С станет стандарт EcmaScript или V8.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот