Недавно коллега обнаружил медленную работу ЗаполнитьЗначенияСвойств, это было значительным узким местом в прайс-листе конфигурации УХ. Сначала удивился - не поверил. Оказалось в приемнике 5 полей, а в источнике > 100, ожидал что метод анализирует где меньше свойств и выбирает алгоритм обхода, но нет, судя по всему всегда обходится источник.
Анализ медленной работы
Для проверки сделал код, выполняющийся в цикле 10000 раз, который в первом варианте заполняет структуру с 5 свойствами по структуре, с 500 свойствами выполнилось за 325 мс и во втором варианте, наоборот, 35 мс. На мой взгляд разница некритическая, но видимо, когда источник или приемник имеют другие типы, разница становится намного значительнее (в УХ источник и приемник были типа СтрокаДерева).
Решение: добавить строку, в которой будут перечислены все свойства для заполнения, но это добавляет сложности коду. На мой взгляд, решать эту проблему самостоятельно созданием своей функции не стоит, это достаточно проблематично и редко является проблемой.
Другие функции по этой проблеме
Эта же проблема может проявляться и в другом коде, использующем ЗаполнитьЗначенияСвойств
Например: Функция ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта... (из БСП), достаточно интересно реализована надо растянуть статью :), поэтому приведу код ниже
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
КлючУникальности = Новый УникальныйИдентификатор;
СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
КонецФункции
Вывод
Думаю, кидаться собственными силами исправлять это проблему не стоит, а вот знать нужно.
К размышлению
Сейчас метод выглядит так:
ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>)
Трудно представить необходимость сценария, когда используются оба параметра СписокСвойств и ИсключаяСвойства одновременно.
Возможно, было бы здорово иметь две функции:
ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>)
ЗаполнитьЗначенияСвойствСИсключениями(<Приемник>, <Источник>, <ИсключаяСвойства>)
p.s.
Данную статью можно считать рекомендациями к анализу, реализации фирмой 1С (можно спасти не одно дерево). Последняя платформа на которой проверил 8.3.24.