bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

[NEW] Получение метаданных объектов

Open artbear opened this issue 5 years ago • 5 comments

Описание проблемы, ошибки, которую надо диагностировать

  1. В тех случаях, когда известен тип объекта метаданного (справочник, документ, и т.п.), то получение метаданных объекта конфигурации следует выполнять с помощью метода Метаданные этого объекта (или ссылки для объектов ссылочного типа), а не путем обращения к свойству глобального контекста Метаданные, так как второй способ существенно более медленный.

Правильно:

  • СправочникОбъект.Метаданные()

Неправильно:

  • Метаданные.Справочники[ИмяСправочника]
  • Метаданные.НайтиПоПолномуИмени("Справочник." + ИмяСправочника)
  1. В тех случаях, когда тип объекта метаданного заранее неизвестен, рекомендуется воспользоваться методом НайтиПоТипу, например:
// Получить полное имя объекта метаданных  вида "Справочник.Номенклатура", 
// "Документ.ПриходнаяНакладная" по переданной ссылке.
ИмяОбъектаМетаданного = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();

Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы

https://its.1c.ru/db/v8std#content:445:hdoc

Параметры диагностики

Тип Статья на русском

  • [ ] :ant: Ошибка
  • [ ] :cop: Уязвимость
  • [ ] :guardsman: Потенциальная уязвимость
  • [x] :poop: Качество кода
  • [ ] :trollface: Другое

Важность Статья на русском

  • [ ] :broken_heart: Блокирующая / Blocker
  • [ ] :heart: Критическая / Critical
  • [x] :yellow_heart: Важная / Major
  • [ ] :blue_heart: Незначительная / Minor
  • [ ] :green_heart: Информационная / Info
  • [ ] :revolving_hearts: Другое

Тэги Статья на русском

  • [x] STANDARD - "Нарушение стандартов 1С"
  • [ ] LOCKINOS - "Не будет работать в другой ОС"
  • [ ] SQL - "Проблема с запросом"
  • [x] PERFORMANCE - "Проблема производительности"
  • [ ] BRAINOVERLOAD - "Непонятный код"
  • [x] BADPRACTICE - "Плохая практика программирования"
  • [ ] CLUMSY - "Излишние действия"
  • [ ] DESIGN - "Ошибка в проектировании"
  • [ ] SUSPICIOUS - "Подозрительный код"
  • [ ] UNPREDICTABLE - "Непредсказуемо работающий код"
  • [ ] DEPRECATED - "Устаревшая функциональность"
  • [ ] ERROR - "Ошибочная конструкция"
  • [ ] LOCALIZE - "Проблемы локализации"

Время на исправление (минут)

1

Дополнительная информация

artbear avatar Nov 25 '20 16:11 artbear

Нужен алгоритм проверки.

zeegin avatar Mar 18 '21 01:03 zeegin

алгоритм простой:

  • искать вызовы
  • Метаданные.Справочники[ИмяСправочника]
  • Метаданные.ВидМетаданного[ИмяМетаданного]
  • Метаданные.НайтиПоПолномуИмени("Справочник." + ИмяСправочника)
  • Метаданные.НайтиПоПолномуИмени("ВидМетаданного." + ИмяМетаданного)
  • Метаданные.НайтиПоПолномуИмени(XXX)

@zeegin

artbear avatar Mar 18 '21 07:03 artbear

Но ведь эти вызовы разрешены. Их не рекоменуется использовать когда есть Ссылка. Потому сложно не поймать FP. А как исключить неправильное использование именно при наличии ссылки, будет правильно, но не понятно как эту доп информацию вычленить.

zeegin avatar Mar 18 '21 08:03 zeegin

Но ведь эти вызовы разрешены. Их не рекоменуется использовать когда есть Ссылка.

@zeegin Расшифруй свою фразу

в приведенном мной источнике https://its.1c.ru/db/v8std#content:445:hdoc ничего не сказано про "Ссылка".

artbear avatar Sep 18 '21 11:09 artbear

Нет запрета на получения метаданных через менеджер Метаданные. Есть рекомендация не искать в менеджере метаданные нужного типа, когда известен объект или ссылка. Просто использовать менеджер это ок когда ты оперируешь именно метаданными, т.е. когда ни объекта ни ссылки у тебя нет.

Ругаться на все вызовы будет много FP.

zeegin avatar Apr 18 '22 10:04 zeegin