Перейти к содержанию

Обращение к неизвестному методу или свойству (UnknownMember)

Тип Поддерживаются
языки
Важность Включена
по умолчанию
Время на
исправление (мин)
Теги
Ошибка BSL
OS
Важный Нет 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