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

Справочник находок

Что значит правило находки (rule) в сводке (summary.md, summary.json, JUnit, Problems, SARIF), почему это ошибка или предупреждение и что с ней делать. Ссылка на раздел есть у каждой находки в summary.md.

Уровни. Ошибка — «не отправлять» (код выхода 1). Предупреждение — посмотреть: код компилируется, но, вероятно, не делает того, что задумано. Одна ошибка одного места от нескольких проверок — одна находка, все проверки — в «найдено: …» (первая — основная).

Как отключить. Построчного подавления нет: находка либо исправляется, либо её проверка выключается целиком ([checks] <проверка> = "off" в otk.toml, список — otk doctor). Замечания BSL LS настраиваются его конфигурацией .bsl-language-server.json, дымовой тест форм — [smoke] exclude, принятые ошибки проверки всех модулей — базовой линией (otk designer-check --update-baseline).

Правила: статика — metadata-ref, common-method, form-name, manager-method, platform-api, handler, dependent, bslls, bsla; пробы в копии ИБ (<вид>/<исход>) — probe, query, session, extcheck, load, scenario, smoke; проверка всех модулей — designer; разделы «не проверено» — not-checked и «не покрыто этим прогоном» — uncovered.

Статика (без базы)

Изменённые строки сверяются с индексом метаданных всей выгрузки (у расширения — и основной конфигурации, parent). Отключение — [checks] metadata = "off" (все, кроме platform-api и analyzers).

metadata-ref

Обращение к объекту метаданных, которого нет: объект менеджера, значение перечисления, предопределённый элемент, путь в строке (ПредопределенноеЗначение, ПолучитьФорму).

Ссылка = Справочники.Контрагентв.ПустаяСсылка();          // Объект не найден: Справочники.Контрагентв (возможно: Контрагенты)
Вид = Перечисления.ВидыОплат.Наличныее;                    // Нет значения перечисления

Ошибка: в базе такой строкой упадёт выполнение (Конфигуратор её часто не ловит — имя менеджера разрешается при исполнении). Исправить имя (подсказка «возможно: …» — ближайшие имена). У расширения без parent — предупреждение: объект может быть в основной конфигурации.

common-method

Вызов общего модуля: нет экспортного метода или неверное число параметров.

ОбщегоНазначения.ЗначениеРеквизитаОбьекта(Ссылка, "Код");  // Нет экспортного метода
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка);         // Недостаточно параметров: требует 2, передано 1

Ошибка: лишние или недостающие параметры компилируются, но строка при исполнении всегда падает «Слишком много / Недостаточно фактических параметров». Исправить вызов или сигнатуру (сделать метод экспортным).

form-name

Имя формы в строке (ПолучитьФорму, ОткрытьФорму): нет объекта или формы у него.

ОткрытьФорму("Документ.Заказ.Форма.ФормаДокументта");      // Нет формы

Ошибка: форма не откроется при исполнении. Исправить имя формы.

manager-method

Вызов метода менеджера, которого нет в модуле менеджера и не похожего на стандартный (Создать…, Найти…, Выбрать, Остатки…).

Справочники.Номенклатура.ЗаполнитьЦенуу(Объект);           // Возможно ошибочный метод менеджера

Предупреждение: стандартных методов менеджеров много, совпадение по началу имени — эвристика. Проверить имя метода или сделать его экспортным в модуле менеджера. Начала имён стандартных методов — словарь имён платформы, ключ managerMethods; стандартные формы (form-name) — ключ forms.

platform-api

Методы и типы платформы по справке синтакс-помощника платформы проверки: неизвестный метод или свойство глобального контекста, Новый неизвестного типа или без конструктора, метод недоступен в контексте исполнения строки (клиент, сервер, внешнее соединение, веб-клиент) или появился в версии новее режима совместимости.

&НаКлиенте
Процедура А()
    НайтиПомеченныеНаУдаление();     // Метод НайтиПомеченныеНаУдаление недоступен: тонкий клиент … (доступен: сервер …)
    Х = Новый ТаблицаЗначенийй;      // Тип не определен: Новый ТаблицаЗначенийй
    ОбщегоНазначенияКлиентСерверр.Сообщить("…");   // Переменная не определена: ОбщегоНазначенияКлиентСерверр
КонецПроцедуры

«Переменная не определена» — имя перед точкой не переменная модуля и не параметр метода, не общий модуль, не менеджер (Справочники), не экспортная переменная модуля приложения или внешнего соединения и не имя справки (глобальное свойство, системное перечисление). Так Конфигуратор сообщает о несуществующем или переименованном общем модуле. Имя, которое платформа принимает, а справка не знает, — в словарь имён платформы ([platformNames] globals); так же ложное «Метод не найден» и «Тип не определен» — ключи methods и constructors.

Ошибка. Предупреждение — если метод, свойство или тип недоступны только в веб-клиенте при environment.webClient = false (тип без замера веб-клиента своей линейки — и при true) или элемент новее режима совместимости, который Конфигуратор всё же определит (та же линейка платформы, конструкторы типов): модуль не скомпилируется только на платформе ниже указанной. Перенести код в нужный контекст (&НаСервере, #Если), поправить имя или режим совместимости. Тип в контексте строки: Новый ЧтениеТекста в клиентском коде — «Тип ЧтениеТекста недоступен: веб-клиент». Веб-клиент для типов Конфигуратор не проверяет, поэтому он измерен в настоящем веб-клиенте (8.3.27, 8.5.1, 8.5.4): клиентский модуль с таким Новый в веб-клиенте не открывается вовсе («непредвиденная ошибка»). Справка ошибается в обе стороны: ПараметрВыбора, HTTPСоединение, ДиалогВыбораЦвета в веб-клиенте есть, COMОбъект — нет. Справка недоступна — «не проверено» platform-api; отключение — [checks] platform-api = "off".

Предупреждения «новее режима совместимости» своей линейки — не ошибки (Конфигуратор код принимает): минимальная платформа проекта environment.minPlatform = "8.3.24" (--min-platform) оставляет только элементы новее неё, environment.compatWarnings = false (--no-compat-warnings) выключает их совсем. Сколько скрыто — в примечаниях сводки. Ошибку о методе более новой линейки (8.5 при режиме 8.3.x) ключи не трогают.

handler

Обработчик, указанный в Form.xml (события формы, элементов, команд), не найден в модуле формы.

Ошибка: форма не откроется («Не найден обработчик»). Добавить процедуру или убрать ссылку на неё в форме.

dependent

Зависимый модуль: правка удалила экспортный метод общего модуля (или весь модуль) или изменила его сигнатуру, а неизменённый модуль его вызывает.

РаботаСФайлами.ПрисоединитьФайл(Ссылка);   // Вызов удалённого экспортного метода РаботаСФайлами.ПрисоединитьФайл

Ошибка: сломан код, которого правка не касалась. Вернуть метод или поправить вызовы; такой модуль проверяется и пробами наравне с изменёнными.

bslls

bslls:<Диагностика> — новое относительно базы замечание BSL Language Server в изменённом модуле (сравнение «было/стало» по правке). Без .bsl-language-server.json в проекте — встроенный набор критических диагностик (ошибки, а не стиль: транзакции, недостижимый код, функция без возврата, разбор запросов, неверная сигнатура обработчика …); описание каждой — в документации BSL LS по её имени.

Ошибка — bslls:ParseError, bslls:ProcedureReturnsValue, bslls:UnknownPreprocessorSymbol (платформа молча выкидывает такой блок), bslls:ThisObjectAssign; остальные — предупреждения. Поправить список — раздел [analyzerSeverity]. Если пробы платформы проверили тот же модуль или запрос, дубль BSL LS становится источником находки платформы, а ошибка разбора запроса, который платформа разобрала без ошибок, отбрасывается (число — в примечаниях). BSL LS видит только изменённые модули и их метаданные, поэтому QueryToMissingMetadata (таблицы запроса нет в метаданных) и MissingCommonModuleMethod (у заимствованного в расширение общего модуля нет метода основной конфигурации) остаются, только если объекта или экспортного метода нет и в индексе всей выгрузки с основной конфигурацией. Отключение — [checks] analyzers = "off" или своей конфигурацией BSL LS.

bsla

bsla:<Правило> — новое относительно базы замечание bsl-analyzer (environment.analyzer = "bsl-analyzer" или "both"). Анализатор видит модель всей конфигурации (у расширения — и основной), поэтому кроме общих с BSL LS правил сообщает: UnresolvedMethodCall, UnresolvedBareCall — вызов несуществующего метода; MismatchedArgCount — неверное число аргументов; UnresolvedField — неизвестное поле; UnknownFieldInQuery — нет поля в таблице запроса; QueryToMissingMetadata — нет таблицы запроса в метаданных; UnavailableInEnvironment — метод недоступен в контексте исполнения (серверный на клиенте); TypeMismatch — несоответствие типов; PlatformMemberNewerThanMinVersion — новее environment.minPlatform; PlatformMemberHiddenByCompatibilityMode — скрыт режимом совместимости (выключается environment.compatWarnings = false). Замечание, которое было в модуле и до правки, новым не считается.

Уровни — как у bslls: ошибка — разбор, Возврат со значением в процедуре, неизвестный символ препроцессора, присваивание ЭтотОбъект; семантические правила — предупреждения, пока сверка на контрольных дефектах не покажет, какие из них ложных не дают. Вызов метода общего модуля без исходников (Module.bin) анализатор не разрешает — такие замечания отбрасываются (число — в сведениях о прогоне). При both замечание обоих анализаторов — одна находка с кодом первого (bslls:), у находки в static.json — список analyzers.

Пробы в копии ИБ

Правило — <вид>/<исход>. Исходы: compile-error — ошибка компиляции (ошибка), runtime-error — код скомпилировался, но упал при выполнении пробы (предупреждение: тело модуля объекта, ПриСозданииНаСервере с данными копии), unknown — платформа ответила непонятно (ошибка: молчание не считается успехом), failed — упал тест или открытие формы (ошибка).

probe

Компиляция изменённого модуля в контексте исполнения: сервер и внешнее соединение — пробой COM или YAxUnit, тонкий клиент — YAxUnit ([checks] probes-server, probes-client). Контекст в «найдено: проба COM (внешнее соединение)».

Пример: probe/compile-error «Переменная не определена (Икс)». Исправить код; ошибка только в одном контексте — чаще всего код не под той директивой или #Если.

query

Разбор текста запроса платформой (Новый Запрос + НайтиПараметры; [checks] queries). Пример: query/compile-error «Поле не найдено "Номенклатура.Артикулл"». Исправить текст запроса. Предупреждение вместо ошибки — если запрос правкой не менялся (ошибка была и до неё) или текст собран подстановкой (ошибка может быть от неё); запрос с переменными частями, который не собрать, — «не проверено» с needs: ui.

session

Модуль сеанса или общий модуль, без которого не открывается сеанс внешнего соединения: COM не подключился с ошибкой компиляции. Пример: session/compile-error с местом в модуле сеанса. Ошибка: в этой базе не откроется ни один сеанс этого вида. Исправить модуль.

extcheck

Расширенная проверка изменённых модулей Конфигуратором во временном расширении ([checks] extcheck): общие модули, модули форм и объектов, все режимы, включая веб-клиент. Режимы — в скобках сообщения («… (Внешнее соединение, Сервер)»). Модуль, где ошибка первой стадии скрыла остальные, — «не проверено» («проверен частично»).

load

Выгрузка не загружается в копию ИБ (load/compile-error, источник «загрузка в ИБ»): битый XML, несогласованные метаданные. Пробы при этом не выполняются. Исправить файл из сообщения (часто — после ручного слияния выгрузки).

scenario

Сценарный тест YAxUnit по изменённому методу упал (scenario/failed). Ошибка: изменилось поведение метода — или тест устарел. Запустить тест локально, исправить код или тест.

smoke

Открытие изменённой формы (smoke/failed, при [smoke] severity = "warning" — smoke/runtime-error): ошибка в обработчиках открытия или форма не закрывается. Форму, которая без параметров отказывается открываться, — «не проверено». Исключить форму — [smoke] exclude.

designer

Проверка всех модулей Конфигуратором в том же прогоне (gate --designer): designer/compile-error — ошибка, которой нет в базовой линии otk-designer-check.baseline.json; в той же строке, что ошибка другой проверки, — её источник «полная проверка Конфигуратором (режимы)». load/compile-error от этого шага — редакция не загрузилась. Ошибка типовой, которую не исправить, — принять базовой линией (otk designer-check --update-baseline, закоммитить файл).

not-checked

«Не проверено» — проверка не выполнена из-за окружения, а не потому, что код чист. В JUnit — skipped, в Problems — предупреждение not-checked/<проверка> (имя проверки из [checks]; включить или поставить зависимость — otk doctor):

  • not-checked/metadata — статика по метаданным выключена;
  • not-checked/analyzers — нет выбранного анализатора BSL (BSL LS: environment.bslls, OTK_BSLLS, PATH, расширение VS Code «Language 1C (BSL)»; bsl-analyzer: environment.bslAnalyzer, OTK_BSL_ANALYZER, PATH) или он упал;
  • not-checked/platform-api — нет справки платформы;
  • not-checked/probes-server, not-checked/probes-client — нет копии ИБ, COM или YAxUnit;
  • not-checked/queries — нет копии ИБ или исполнителя запросов;
  • not-checked/extcheck — нет копии ИБ или временное расширение не загрузилось;
  • not-checked/scenarios, not-checked/smoke — нет копии ИБ, YAxUnit или тонкого клиента.

Без имени проверки: запрос с переменными частями, проба, не выполненная из-за падения сеанса, модуль, «проверенный частично». Где известно, чем закрыть, — то же needs, что у «не покрыто».

uncovered

«Не покрыто этим прогоном» — что этот метод не проверяет в принципе, сгруппировано по needs (чем закрыть):

  • designer:<контекст> (* — все режимы) — полная проверка Конфигуратором в режиме: контекст недоступен локально (environment.contexts) или у модуля нет пробы. Закрывает otk gate --designer (снимает в своих режимах) или otk designer-check, в CI — задание otk-designer-check;
  • ui — модуль команды, запрос из частей: UI и сценарные тесты;
  • publication — модуль HTTP- и веб-сервиса: проверка на опубликованной базе.