Передача массива по значению в процедуру. Платформа

В статье про сортировку картинок для Розница 2.3 мне посетовали, что у меня не изменится порядок массива Файлы, потому что массив передается по значению:

&После("ЗаполнитьПрисоединенныеФайлыКОбъекту")
Процедура дор_ЗаполнитьПрисоединенныеФайлыКОбъекту(Знач ВладелецФайла, Знач Файлы)
	//Осипов - для порядка файлов
	Если ТипЗнч(ВладелецФайла) = Тип("СправочникСсылка.Номенклатура") Тогда
		ТЗ = Новый ТаблицаЗначений();
		ТЗ.Колонки.Добавить("Файл");
		ТЗ.Колонки.Добавить("ГлавнаяКартинка");
		ТЗ.Колонки.Добавить("Наименование");
		Для Каждого Файл ИЗ Файлы Цикл
			НСтр = ТЗ.Добавить();
			НСтр.Файл = Файл;
			НСтр.ГлавнаяКартинка = ВладелецФайла.ФайлКартинки = Файл; 
			НСтр.Наименование = Строка(Файл);
		КонецЦикла;              
		ТЗ.Сортировать("ГлавнаяКартинка Убыв, Наименование");
		Файлы = ТЗ.ВыгрузитьКолонку("Файл");
	КонецЕсли;
КонецПроцедуры

Я удивился, ведь я расширял типовую процедуру, значит передача по значению было указано в ее объявлении.

Проверил, действительно, это так:

Но ведь как-то этот код работает? Объяснение только одно — массив не копируется при передаче по значению, т.е. эта директива игнорируется и массив всегда передается по ссылке.

Написал проверочный код:

&НаКлиенте
Процедура Протестировать(Команда)
	ОчиститьСообщения();
	М = Новый Массив();
	ПротестироватьМассив(М);
	Сообщить("Снаружи: " + М.Количество());
КонецПроцедуры


&НаКлиенте
Процедура ПротестироватьМассив(Знач М)
	М.Добавить(1);
	М.Добавить(2);
	Сообщить("Внутри: " + М.Количество());
КонецПроцедуры

И действительно, получил ожидаемый результат — массив передается по ссылке:

Попробуем немного изменить код:

&НаКлиенте
Процедура Протестировать(Команда)
	ОчиститьСообщения();
	М = Новый Массив();
	М.Добавить(0);
	ПротестироватьМассив(М);
	Сообщить("Снаружи: " + М.Количество());
КонецПроцедуры


&НаКлиенте
Процедура ПротестироватьМассив(Знач М)
	М.Добавить(1);
	М.Добавить(2);
	Сообщить("Внутри: " + М.Количество());
КонецПроцедуры

И опять результат, который подтверждает, что по значению для массива не работает:

И все же мне придется поправить свой код, потому что если использовать такой код:

&НаКлиенте
Процедура Протестировать(Команда)
	ОчиститьСообщения();
	М = Новый Массив();
	М.Добавить(0);
	ПротестироватьМассив(М);
	Сообщить("Снаружи: " + СтрСоединить(М, ","));
КонецПроцедуры


&НаКлиенте
Процедура ПротестироватьМассив(Знач М)
	М = Новый Массив();
	М.Добавить(1);
	М.Добавить(2);
	Сообщить("Внутри: " + СтрСоединить(М, ","));
КонецПроцедуры

То получим вот такой результат:

Т.е. если массив передается по значению, то его содержимое менять можно, а ссылку нет.

Остается только догадываться, зачем в этой функции используется передача массива по значению. какой в этом глубокий смысл…

Парадокс!

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *