Как устранить недостаток метода ЗаполнитьЗначенияСвойств в 1С?

В ЧЕМ ЗАКЛЮЧАЕТСЯ НЕДОСТАТОК?

Медленная работа метода ЗаполнитьЗначенияСвойств в 1С
Метод ЗаполнитьЗначенияСвойств в 1С оказался значительно медленнее, чем ожидалось, когда количество свойств в приемнике значительно меньше, чем в источнике. Недавно мой коллега выявил это узкое место при работе с прайс-листом в конфигурации УХ. Изначально я был скептически настроен, но тестирование показало, что если в приемнике 5 полей, а в источнике больше 100, метод действительно работает медленно. Предполагалось, что метод анализирует количество свойств и выбирает оптимальный алгоритм, но, судя по всему, он всегда обходит источник.
Анализ производительности
Для проверки была написана программа, которая в цикле 10 000 раз заполняет структуру с 5 свойствами по структуре с 500 свойствами. Время выполнения составило 325 мс. В обратном случае, когда заполнялась структура с 500 свойствами по структуре с 5 свойствами, время выполнения составило 35 мс. Хотя разница кажется некритической, она может стать значительной при работе с другими типами данных, как это было в конфигурации УХ, где источником и приемником были объекты типа СтрокаДерева.

КАК УСТРАНИТЬ НЕДОСТАТОК?

Возможное решение
Чтобы обойти эту проблему, можно явно указывать свойства для заполнения, что добавляет сложности коду. Создание собственной функции для решения этой проблемы не всегда оправдано и может быть проблематичным.
Другие функции, подверженные этой проблеме
Проблема может проявляться и в других функциях, использующих ЗаполнитьЗначенияСвойств. Например, функция ЕстьРеквизитИлиСвойствоОбъекта из БСП:
Код
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
   КлючУникальности = Новый УникальныйИдентификатор;
   СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
   ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
 Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
КонецФункции
Выводы
Не стоит тратить силы на самостоятельное исправление этой проблемы, но нужно быть в курсе её существования.
Возможные улучшения
Метод ЗаполнитьЗначенияСвойств выглядит так:
ЗаполнитьЗначенияСвойств(<Приемник>,<Источник>,<СписокСвойств>, <ИсключаяСвойства>)
Трудно представить сценарий, когда одновременно используются оба параметра: СписокСвойств и ИсключаяСвойства. Возможно, было бы полезно иметь две отдельные функции:
  • ЗаполнитьЗначенияСво     йств(<Приемник>,<Источник>,
<СписокСвойств>)
  • ЗаполнитьЗначенияСвойствСИсключениями(<Приемник>, <Источник>, <ИсключаяСвойства>)
НАШИ КОНТАКТЫ
info@105.ooo
Почта:
Московская область, г. Дубна, ул. Программистов, дом 4, стр. 1
Адрес:
8-800-333-6-105
Телефон:
Бесплатный звонок