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

Обращение к члену, недоступному в текущем контексте (MemberAccessUnavailable)

Тип Поддерживаются
языки
Важность Включена
по умолчанию
Время на
исправление (мин)
Теги
Ошибка BSL
OS
Критичный Да 5 error

Параметры

Имя Тип Описание Значение
по умолчанию
checkServer Строка Проверять сервер (on/off/auto) auto
checkThinClient Строка Проверять тонкий клиент (on/off/auto) auto
checkWebClient Строка Проверять веб-клиент (on/off/auto) auto
checkMobileClient Строка Проверять мобильный клиент (on/off/auto) auto
checkThickClientManagedApplication Строка Проверять толстый клиент (управляемое приложение) (on/off/auto) auto
checkThickClientOrdinaryApplication Строка Проверять толстый клиент (обычное приложение) (on/off/auto) auto
checkExternalConnection Строка Проверять внешнее соединение (on/off/auto) auto
checkMobileApplicationClient Строка Проверять мобильное приложение (клиент) (on/off/auto) auto
checkMobileApplicationServer Строка Проверять мобильное приложение (сервер) (on/off/auto) auto
checkMobileStandaloneServer Строка Проверять мобильный автономный сервер (on/off/auto) auto

Описание диагностики

Проверяет доступность методов и свойств в контекстах компиляции места обращения. Учитывает вид модуля, доступность платформенного типа из синтакс-помощника, флаги общего модуля, директивы методов и условия препроцессора.

В OneScript проверяются условные объявления методов и места вызовов под #Если. Windows, Linux и MacOS взаимоисключающие, MONO проверяется независимо от ОС. Вызов из ветки Windows метода, объявленного только под Linux, считается недоступным. Проверяются все сочетания ОС и Mono, а не только ОС компьютера, на котором работает сервер. Пользовательские символы без известного значения сохраняют неопределённость и не служат основанием для сообщения о недоступности.

Для составного результата из синтакс-помощника недоступный в проверяемом контексте тип не считается доказанным получателем, если есть другой явно доступный тип с доступным членом. Неизвестная альтернатива не снимает запрет. Запрещённый член у доступного получателя и случай единственного недоступного типа продолжают диагностироваться.

Проверяются неквалифицированные вызовы методов своего модуля, экспортных методов глобальных общих модулей и модулей приложения/внешнего соединения, а также обращения к методам исходников, разрешённым системой вывода типов: по имени модуля, через переменную или результат функции. Платформенные методы и свойства, включая свойства глобального контекста, проверяются по доступности из СП. Прикладные специализации наследуют доступность своего базового типа, например ДокументМенеджер. При недостатке сведений о доступности сообщение не выдаётся. Каждая известная цель в наборе типов проверяется независимо: доступный вариант не скрывает недоступный. Тип Произвольный пропускается и не отменяет проверку остальных целей. Перед выдачей сообщения вывод типов уточняется для проверяемого контекста компиляции. Присваивания и возвраты функций из неактивных веток #Если/#Иначе не добавляют в него цели. Для вызванной функции с уже выгруженным телом сохраняются известные типы из индекса; уточнение её возврата по контексту требует доступного тела. Одноимённые объявления в разных ветках препроцессора рассматриваются совместно. Если локальное объявление исключено в проверяемом контексте, учитывается доступный глобальный метод, в том числе одноимённая встроенная функция платформы. На одно обращение выдаётся по одному сообщению для каждого контекста компиляции, в котором член недоступен. В цепочке Справочники.Имя.Выбрать() сообщается первое недоступное звено: если запрещено свойство Справочники, зависимые звенья не создают повторных сообщений в том же режиме. Обращения в аргументах проверяются независимо. Контекст указан в скобках в тексте сообщения; в файловом режиме различаются клиентская и серверная части форм и команд.

Контексты вызова и объявления вычисляются отдельно. Для форм сохраняются ограничения контекстных и внеконтекстных методов. В клиент-серверном варианте флаг общего модуля «Вызов сервера» разрешает клиенту и внешнему соединению вызывать серверные методы, но не добавляет клиентский контекст исполнения. В файловом варианте доступность общих модулей объединяет серверные флаги и флаги соответствующего клиента или внешнего соединения.

Для общих модулей используются флаги «Сервер», «Клиент (управляемое приложение)», «Клиент (обычное приложение)» и «Внешнее соединение». Доступность из СП используется с учётом правил конкретного вида модуля. Формы и команды имеют клиентскую и серверную части. Для модулей HTTP/Web-сервисов, сервисов интеграции, ботов и WebSocket используются все контексты, указанные в СП. Для объектов, менеджеров, наборов записей, менеджеров значений и перерасчётов также учитывается доступность их платформенных типов, включая таблицы и кубы внешних источников данных. Если эти данные отсутствуют, контекст остаётся неизвестным и проверка модуля пропускается. Модуль сеанса проверяется в серверных и файловых контекстах. Доступность его события в СП не используется как перечень контекстов компиляции самого модуля. Директивы &НаКлиенте и &НаСервере учитываются и в глобальных общих модулях. Обычная форма проверяется в управляемом режиме только при включённом свойстве конфигурации «Использовать обычные формы в управляемом приложении».

Каждый контекст имеет настройку on, off или auto (по умолчанию):

  • on — проверять контекст независимо от автоматического выбора по корню конфигурации;
  • off — не проверять этот контекст во всех модулях;
  • auto — учитывать основной режим запуска и назначение использования конфигурации.

В auto управляемое приложение не проверяется в толстом обычном клиенте. Для обычного приложения из клиентских режимов платформы выбирается толстый обычный клиент. Назначение «Мобильная платформа» включает мобильное приложение (клиент и сервер), «Приложение для платформы» — остальные режимы. При обоих назначениях используются обе группы. Мобильный клиент и его автономный сервер относятся к приложению для платформы. Исключение: checkMobileStandaloneServer = auto временно выключает проверку мобильного автономного сервера при любых метаданных. Для автоматического выбора необходимо читать состав автономной конфигурации в MDClasses и учитывать его в BSLLS. До подключения этой доработки контекст можно включить явно через on. При неизвестном типе модуля диагностика не выполняется, в том числе с параметрами on.

Например, для проекта, который не используется через COM-соединение:

{
  "diagnostics": {
    "parameters": {
      "MemberAccessUnavailable": {
        "checkExternalConnection": "off"
      }
    }
  }
}

Параметры checkServer, checkThinClient, checkWebClient, checkMobileClient, checkThickClientManagedApplication, checkThickClientOrdinaryApplication, checkExternalConnection, checkMobileApplicationClient, checkMobileApplicationServer и checkMobileStandaloneServer управляют соответствующими режимами независимо. Переключатель толстого клиента управляет клиент-серверным вариантом, а файловым — только при включённой общей настройке supportThickClientFileMode (по умолчанию выключена). Значение on у параметра диагностики не переопределяет эту настройку проекта. Переключатель внешнего соединения управляет обоими вариантами независимо от неё. Отключение проверки не меняет смысл #Если и #Иначе.

Препроцессор различает сервер, тонкий, веб-, мобильный и толстые клиенты, внешнее соединение, стороны мобильного приложения и мобильный автономный сервер. Файловый и клиент-серверный варианты различаются: в файловом толстом клиенте одновременно истинны Клиент и Сервер, в том числе в клиентской процедуре управляемой формы. Директивы методов при этом продолжают различать клиентскую и серверную части форм и команд. Поэтому отключение checkServer не отключает проверки файлового толстого клиента, в котором символ Сервер тоже может быть истинным. Учитываются вложенные #Если, #ИначеЕсли, #Иначе, операции НЕ, И, ИЛИ и скобки.

Если контекст нельзя определить (например, отсутствуют метаданные общего модуля или условие содержит неизвестный символ/символ ОС), неопределённость не считается ошибкой. Не проверяются методы без известных объявлений в исходниках и совместимость API с версией платформы; последнюю проверяет UnavailableMemberCall. Обычные условия Если, включая вызовы функций вроде ЭтоМобильныйКлиент(), не сужают контексты компиляции. Их семантика выполнения этой диагностикой не анализируется.

Примеры

В модуле управляемой формы внеконтекстный серверный метод не может вызвать контекстный:

&НаСервереБезКонтекста
Процедура Выполнить()
    Заполнить(); // Недоступный вызов
КонецПроцедуры

&НаСервере
Процедура Заполнить()
КонецПроцедуры

Исправление: сделать Заполнить внеконтекстным, если ему не нужны данные формы, либо выполнять вызов из контекстного метода.

В следующем примере метод отсутствует в веб-клиенте и мобильном клиенте:

#Если ТонкийКлиент Тогда
&НаКлиенте
Процедура ТолькоТонкий()
КонецПроцедуры
#КонецЕсли

&НаКлиенте
Процедура Выполнить()
    ТолькоТонкий(); // Недоступный вызов в части контекстов
КонецПроцедуры

Исправление: ограничить вызов тем же условием или предоставить реализацию в остальных контекстах.

Источники

Сниппеты

Экранирование кода

// BSLLS:MemberAccessUnavailable-off
// BSLLS:MemberAccessUnavailable-on

Параметр конфигурационного файла

"MemberAccessUnavailable": {
    "checkServer": "auto",
    "checkThinClient": "auto",
    "checkWebClient": "auto",
    "checkMobileClient": "auto",
    "checkThickClientManagedApplication": "auto",
    "checkThickClientOrdinaryApplication": "auto",
    "checkExternalConnection": "auto",
    "checkMobileApplicationClient": "auto",
    "checkMobileApplicationServer": "auto",
    "checkMobileStandaloneServer": "auto"
}