Обращение к неизвестному методу или свойству (UnknownMember)¶
| Тип | Поддерживаются языки |
Важность | Включена по умолчанию |
Время на исправление (мин) |
Теги |
|---|---|---|---|---|---|
Ошибка |
BSLOS |
Важный |
Нет |
2 |
suspicious |
Описание диагностики¶
Диагностика выявляет обращения к методам и свойствам, которых не существует, — вероятные опечатки или вызовы несуществующего API:
Ресивер.Член— тип ресивера выведен и конкретен, но члена с таким именем у него нет;- голый вызов
Имя(...)— имя не резолвится ни в глобальную функцию/свойство платформы или конфигурации, ни в метод/переменную текущего модуля.
Названия типов соответствуют варианту встроенного языка проекта, а текст замечания — языку сервера. Пользовательские имена методов и свойств сохраняются без перевода.
Диагностика опирается на вывод типов и сведения о членах из синтакс-помощника платформы 1С (через bsl-context) либо из встроенного справочника. Каждый известный тип получателя проверяется отдельно: наличие члена у одного возможного типа не отменяет его отсутствия у другого. Невыведенный и произвольный типы сами по себе не доказывают ошибку и пропускаются.
Если доступны сведения о модуле, тип получателя уточняется для каждого контекста компиляции с учётом директивы метода и веток препроцессора. Режимы проверки автоматически выбираются по метаданным корня конфигурации, как при значении auto у параметров MemberAccessUnavailable. В сообщении указывается контекст, в котором член не найден. Без метаданных сохраняется обычная проверка известных типов и имён.
Заведомо недостижимые ветки, например #Если Сервер И НЕ Сервер, не проверяются. В OneScript символы препроцессора рассматриваются независимо от режимов платформы 1С; логические противоречия вроде Windows И НЕ Windows также исключают ветку.
Объявленный метод сохраняется в результатах поиска независимо от доступности его вызова. Запрет вызова найденного метода проверяет MemberAccessUnavailable, поэтому одна и та же причина не выдаётся обеими диагностиками. Если у разных возможных получателей на одной строке разные ошибки, сообщения обеих диагностик допустимы.
Состав членов «открытых» объектов данных — Структура, строка таблицы значений и им подобных — складывается из самого кода: ключ, добавленный Вставить("Имя", …) либо перечисленный в конструкторе, считается известным членом. Имя ключа известно даже тогда, когда тип его значения вывести не удалось: это разные сведения, и отсутствие второго не отменяет первого.
Диагностика выключена по умолчанию — она эвристическая и требует обкатки на реальных конфигурациях (полнота справочника, динамическая типизация и т.п.).
Примеры¶
Массив = Новый Массив;
Массив.Добвить(1); // Срабатывание: опечатка, у типа Массив нет метода "Добвить"
Исправление — использовать существующий член:
Массив.Добавить(1);
Тип из другой ветки препроцессора не скрывает ошибку:
#Если Сервер Тогда
Коллекция = Новый Соответствие;
#Иначе
Коллекция = Новый Массив;
#КонецЕсли
Коллекция.Добавить(1); // На сервере у Соответствия нет метода Добавить.
Источники¶
- Источник: синтакс-помощник платформы 1С:Предприятие 8
Сниппеты¶
Экранирование кода¶
// BSLLS:UnknownMember-off
// BSLLS:UnknownMember-on
Параметр конфигурационного файла¶
"UnknownMember": false