Обращение к члену, недоступному в текущем контексте (MemberAccessUnavailable)¶
| Тип | Поддерживаются языки |
Важность | Включена по умолчанию |
Время на исправление (мин) |
Теги |
|---|---|---|---|---|---|
Ошибка |
BSLOS |
Критичный |
Да |
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.
Обычные условия Если, включая вызовы функций вроде ЭтоМобильныйКлиент(),
не сужают контексты компиляции. Их семантика выполнения этой диагностикой не анализируется.
Примеры¶
В модуле управляемой формы внеконтекстный серверный метод не может вызвать контекстный:
&НаСервереБезКонтекста
Процедура Выполнить()
Заполнить(); // Недоступный вызов
КонецПроцедуры
&НаСервере
Процедура Заполнить()
КонецПроцедуры
Исправление: сделать Заполнить внеконтекстным, если ему не нужны данные формы,
либо выполнять вызов из контекстного метода.
В следующем примере метод отсутствует в веб-клиенте и мобильном клиенте:
#Если ТонкийКлиент Тогда
&НаКлиенте
Процедура ТолькоТонкий()
КонецПроцедуры
#КонецЕсли
&НаКлиенте
Процедура Выполнить()
ТолькоТонкий(); // Недоступный вызов в части контекстов
КонецПроцедуры
Исправление: ограничить вызов тем же условием или предоставить реализацию в остальных контекстах.
Источники¶
- Руководство разработчика 1С 8.3.27: директивы компиляции и препроцессор
- Правила создания общих модулей
Сниппеты¶
Экранирование кода¶
// 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"
}