Передача массива по значению в процедуру. Платформа
В статье про сортировку картинок для Розница 2.3 мне посетовали, что у меня не изменится порядок массива Файлы, потому что массив передается по значению:
&После("ЗаполнитьПрисоединенныеФайлыКОбъекту") Процедура дор_ЗаполнитьПрисоединенныеФайлыКОбъекту(Знач ВладелецФайла, Знач Файлы) //Осипов - для порядка файлов Если ТипЗнч(ВладелецФайла) = Тип("СправочникСсылка.Номенклатура") Тогда ТЗ = Новый ТаблицаЗначений(); ТЗ.Колонки.Добавить("Файл"); ТЗ.Колонки.Добавить("ГлавнаяКартинка"); ТЗ.Колонки.Добавить("Наименование"); Для Каждого Файл ИЗ Файлы Цикл НСтр = ТЗ.Добавить(); НСтр.Файл = Файл; НСтр.ГлавнаяКартинка = ВладелецФайла.ФайлКартинки = Файл; НСтр.Наименование = Строка(Файл); КонецЦикла; ТЗ.Сортировать("ГлавнаяКартинка Убыв, Наименование"); Файлы = ТЗ.ВыгрузитьКолонку("Файл"); КонецЕсли; КонецПроцедуры
Я удивился, ведь я расширял типовую процедуру, значит передача по значению было указано в ее объявлении.
Проверил, действительно, это так:
Но ведь как-то этот код работает? Объяснение только одно — массив не копируется при передаче по значению, т.е. эта директива игнорируется и массив всегда передается по ссылке.
Написал проверочный код:
&НаКлиенте Процедура Протестировать(Команда) ОчиститьСообщения(); М = Новый Массив(); ПротестироватьМассив(М); Сообщить("Снаружи: " + М.Количество()); КонецПроцедуры &НаКлиенте Процедура ПротестироватьМассив(Знач М) М.Добавить(1); М.Добавить(2); Сообщить("Внутри: " + М.Количество()); КонецПроцедуры
И действительно, получил ожидаемый результат — массив передается по ссылке:
Попробуем немного изменить код:
&НаКлиенте Процедура Протестировать(Команда) ОчиститьСообщения(); М = Новый Массив(); М.Добавить(0); ПротестироватьМассив(М); Сообщить("Снаружи: " + М.Количество()); КонецПроцедуры &НаКлиенте Процедура ПротестироватьМассив(Знач М) М.Добавить(1); М.Добавить(2); Сообщить("Внутри: " + М.Количество()); КонецПроцедуры
И опять результат, который подтверждает, что по значению для массива не работает:
И все же мне придется поправить свой код, потому что если использовать такой код:
&НаКлиенте Процедура Протестировать(Команда) ОчиститьСообщения(); М = Новый Массив(); М.Добавить(0); ПротестироватьМассив(М); Сообщить("Снаружи: " + СтрСоединить(М, ",")); КонецПроцедуры &НаКлиенте Процедура ПротестироватьМассив(Знач М) М = Новый Массив(); М.Добавить(1); М.Добавить(2); Сообщить("Внутри: " + СтрСоединить(М, ",")); КонецПроцедуры
То получим вот такой результат:
Т.е. если массив передается по значению, то его содержимое менять можно, а ссылку нет.
Остается только догадываться, зачем в этой функции используется передача массива по значению. какой в этом глубокий смысл…
Парадокс!
Свежие комментарии