Правила линтера XBSL
Полный перечень проверок линтера с уровнями важности и областью применения.
Полный перечень проверок линтера. Файл дополняется при добавлении правил, а действующий
список печатает xbsl --list-rules или инструмент MCP list_rules. Сейчас правил: 280.
Таблица описывает инструментарий в поставке. Установленный плагин может добавить свои правила
и переопределить severity и включённость по умолчанию (см. Расширение),
поэтому действующий список способен отличаться от этого. xbsl --list-rules показывает, что
действительно работает в вашем окружении, а XBSL_NO_PLUGINS=1 – набор ниже.
Граница: линтер дополняет компилятор, но не заменяет его
Линтер работает по тексту, AST и модели проекта. Правила знают типы “на первом шаге”:
объявленный номинальный тип переменной и его члены, объекты проекта и порождаемые ими типы,
значения перечислений, глобальные типы подключённых библиотек (из архива .xlib).
Вывод типа выражения у движка есть. Модуль xbsl.typeinfer отвечает про получателя, член,
конструктор, приведение и настойчивую операцию, а вывод типов цепочек и локальных переменных
питает подсказку при наведении и автодополнение в редакторе. По всему проекту он отвечает
множеством типов, в котором остаются объединение, Неопределено и Null колонки запроса, и знает
имена самого проекта: строки Запрос{...} типизируются по списку выборки, реквизиты – по yaml,
структуры и методы – по модулям. Пять правил судят выведенный тип и повторяют предупреждения
IDE платформы: code/redundant-cast, code/cast-to-non-null, code/redundant-undefined-guard и
code/redundant-type-check, а также code/deprecated-api при выборе перегрузки. О выражении, тип которого вывод не называет, они молчат. Остальные
правила судят по объявленным типам.
Часть находок поймал бы и компилятор: неизвестный тип, число аргументов, не-исключение в
поймать, возврат не по сигнатуре. Ценность линтера здесь во времени. Он показывает это
раньше – за секунды на рабочей машине, до сборки и деплоя, – и называет точное место.
Остального компилятор не проверяет вовсе: соглашения по написанию кода, типографику, структуру
проекта (дубли Ид, парность файлов), секреты в исходниках. О неиспользуемых переменных и
импортах IDE платформы только предупреждает, и сборка с ними проходит.
Чего линтер не делает – всё, что требует полного вывода типов выражений: утечку ресурса в общем
случае, соответствие типа возвращаемого значения сигнатуре. Их стоит различать. Структурное
несоответствие возврата (значение в методе-ничто, пустой возврат в типизированном) правило
code/return-mismatch ловит, а возврат строки из метода с : Число пропустит – для этого нужно
вывести тип выражения. Ресурс же судится единственной формой, где всё сказано самим объявлением:
правило code/unclosed-resource прослеживает закрываемое от объявления до перебора в том же
методе, а ресурс, ушедший в вызовы или коллекции, остаётся вне досягаемости.
Корректность кода проверяет серверная компиляция при деплое. Линтер идёт перед ней и снимает частые ошибки заранее.
Как читать таблицу
- Правило – идентификатор
группа/имя. Группа (часть до/) позволяет включать и выключать правила пачкой. - Уровень –
error(сборка и CI должны падать),warning(нарушено соглашение),info(подсказка, обычно выключена). - Умолч. – ✓ правило входит в набор по умолчанию, – включается явно.
- Область –
файл(правило видит один файл) илипроект(нужен индекс всего проекта: дубли Ид, неизвестные типы, кросс-модульные вызовы). - Что проверяет – одно-два предложения о находке. Ссылка “подробнее” ведёт под таблицу тира: там у правила лежат оговорки, примеры и ответ платформы.
- Ссылка в конце описания – раздел документации платформы, стоящий за правилом. В VS Code код такого правила в панели “Проблемы” открывает этот раздел прямо в редакторе.
Тиры
Правила разбиты на тиры A–D по тому, на что они опираются. Тир – это и есть быстрый фильтр
для --select/--ignore (наряду с группой и идентификатором): --select A,B гоняет только
структуру и текст, --ignore D убирает семантику над stdlib.
Как читать колонки: error · warning · info; ✓ – входит в набор по умолчанию, – включается явно; область – один файл или весь проект.
Тир A – структура и YAML
Файл существует, парсится, у объекта есть уникальный UUID, имя совпадает с файлом.
| Правило | Область | Что проверяет | ||
|---|---|---|---|---|
yaml/valid |
✓ | файл | YAML не парсится | |
yaml/duplicate-key |
✓ | файл | Скалярный ключ задан в одном узле YAML дважды: загрузчик молча оставляет последнее значение, а компилятор отклоняет файл при деплое подробнее | |
yaml/duplicate-import |
✓ | проект | Пространство имён повторяется в секции Импорт элемента: вторая строка ничего не добавляет подробнее доки |
|
yaml/id-uuid |
✓ | файл | Ид не является UUID | |
yaml/id-required |
✓ | файл | У объекта нет Ид | |
yaml/name-matches-file |
✓ | файл | Имя не совпадает с именем файла | |
yaml/id-unique |
✓ | проект | Дубли Ид в проекте | |
yaml/standard-field-length |
✓ | файл | Длина стандартного реквизита сверх лимита платформы (Наименование > 400, Код > 50) – применение отвергает реквизит, и он выпадает из объекта доки |
|
yaml/document-date-required |
✓ | файл | Документ без стандартного реквизита Дата в Реквизиты: реквизит обязателен, и сборка отвергает документ доки |
|
yaml/ref-needs-nullable |
✓ | файл | Ссылочный тип в позиции Тип без ?: у ссылки нет значения по умолчанию, и компиляция падает подробнее доки |
|
yaml/union-needs-nullable |
✓ | файл | Составной тип без пустого значения в позиции Тип (`Строка |
|
yaml/contract-facet-mismatch |
✓ | проект | Ограничения реквизита, который переопределяет свойство контракта сущности, расходятся с ограничениями свойства (длина строки, длины и границы числа) – компиляция падает подробнее | |
yaml/contract-standard-length |
✓ | проект | Длина стандартного реквизита (Наименование, Код, Номер) расходится с МаксимальнаяДлина свойства контракта сущности, которое он переопределяет, – компиляция падает подробнее |
|
yaml/register-entity-contract |
✓ | проект | Регистр называет среди контрактов своих типов тип объекта контракта сущности (Контракты: - <Контракт>.Объект): регистр реализует только контракты типа, и компиляция падает подробнее доки |
|
yaml/report-parameters-alias |
✓ | файл | Параметры запроса отчета под ключом Параметры: метамодель называет его другим написанием ПараметрыЗапроса, а сервер отвергает как неизвестное свойство. Исправление переименовывает ключ подробнее доки |
|
yaml/no-expression-in-literal |
✓ | файл | Выражение =... внутри узла литерального типа (Шрифт: {Тип: АбсолютныйШрифт, Размер: =...}) – платформа принимает здесь только литерал, вычислять нужно весь объект доки |
|
yaml/localization-key-unique |
✓ | файл | Ключ объявлен в словаре ЛокализованныеСтроки дважды: применение отвергает проект целиком подробнее доки |
|
yaml/unused-component |
✓ | проект | Компонент интерфейса нигде не размещён и не создан: ни значением Тип в разметке, ни новый в коде. Мёртвая разметка едет в сборку и в перевод подробнее |
|
yaml/duplicate-subtree |
– | проект | Поддерево разметки повторяет устройство поддерева в другом файле: новую форму завели копированием соседней, и правку теперь вносить в оба подробнее | |
project/identifier |
✓ | файл | Имя или поставщик проекта не идентификатор доки | |
project/presentation |
✓ | файл | Представление проекта не заполнено доки | |
project/version |
✓ | файл | Версия проекта не A.B.C доки | |
structure/xbsl-pair |
✓ | файл | Модуль .xbsl без парного .yaml | |
project/path-matches-descriptor |
✓ | файл | Путь {{поставщик}}/{{имя}} разошёлся с дескриптором – сборка отвергнет проект до компиляции доки |
|
yaml/unknown-component-property |
✓ | файл | Ключ разметки, которого у компонента нет, а у другого компонента ui-схемы есть: применение отвечает Неизвестное свойство подробнее доки |
|
yaml/inline-command-name |
✓ | файл | Имя у команды, объявленной прямо в разметке: применение отвергает узел и откатывает проект подробнее доки |
|
yaml/list-scroll-without-loading |
✓ | файл | Список с Навигация: Отсутствует не догружает хвост: прокрутка по вертикали крутит одну порцию, а список над массивом без своей прокрутки оставляет автоматическую порцию в десять строк подробнее доки |
|
yaml/dynlist-scroll-without-loading |
✓ | проект | То же для динамического списка, чью иерархию решает основная таблица (ИспользуемаяИерархия не задана): над справочником без иерархии, документом или регистром список плоский, и Навигация: Отсутствует теряет хвост подробнее доки |
|
yaml/hierarchy-bare-value |
✓ | файл | Голое Выключено, ПоУмолчанию или Авто в ИспользуемаяИерархия динамического списка: применение отвергает значение, у которого не указан тип. Исправление пишет узел с типом, а Авто убирает подробнее |
|
yaml/compute-permissions-by |
✓ | файл | РасчетРазрешенийПо против настроек доступа сущности: списка нет, а разрешение вычисляется для каждого объекта, или список есть, а так не вычисляется ни одно, – сборка отвергает и то и другое подробнее |
|
yaml/compute-permissions-by-unknown |
✓ | файл | Имя в РасчетРазрешенийПо, которое не поле элемента: реквизит с опечаткой или не объявленный, стандартный реквизит без записи в Реквизиты, табличная часть – сборка отвечает, что реквизит не найден. Вычисляемое поле (ПометкаУдаления, Представление) роняет применение сборки подробнее |
|
yaml/soap-handler-name |
✓ | файл | Обработчик SOAP-сервиса, у которого в Имя буква не латиницей, пробельный символ или знак, который сборка не принимает, либо цифра, дефис или точка в начале: имя становится операцией WSDL-описания, и сборка его отвергает доки |
|
yaml/root-url-cyrillic |
✓ | файл | КорневойUrl HTTP- или SOAP-сервиса с кириллицей: сборка его принимает, но запрос до сервиса не доходит. Быстрое исправление записывает адрес латиницей подробнее |
|
yaml/component-member-unique |
✓ | файл | Имя повторяется среди собственных Свойства и События компонента интерфейса: оба списка – одно пространство имен, и сборка отвергает имя как неуникальное подробнее |
|
yaml/plain-comment |
– | файл | Комментарий # в описании элемента: визуальный редактор пишет файл заново из модели и сохраняет только документирующий комментарий ## в первых строках узла, у которого он есть (элемент, компонент, объявленное свойство, табличная часть и подобные). Автоисправление меняет маркер у блока, который уже стоит на таком месте, и переносит внутрь узла блок, стоящий перед - элемента списка (кроме экземпляра компонента проекта в списке: на нём комментарий ломает сборку); остальное называется вместе с ближайшим узлом, у которого комментарий есть |
|
yaml/doc-comment-misplaced |
– | файл | Блок ## стоит там, где среда разработки его не читает: перед - элемента списка, над отдельным свойством, у узла без документирующего комментария (стандартный реквизит вроде Код и Наименование, команда, поле динамического списка). Он пропадёт так же, как комментарий #. Отдельный случай – экземпляр компонента проекта или библиотеки в списке: с блоком ## на таком узле сервер не применяет проект, и правило называет эту причину |
Подробнее о правилах тира A
yaml/duplicate-key. Проверки схемы читают уже слитый
документ, поэтому потерянное значение больше нигде не всплывает. Помечается второе вхождение и
каждое следующее, со строкой первого. Ключ слияния << и нескалярные ключи правило не судит, а
ключи различает так же, как загрузчик: по тегу и по тексту.
yaml/duplicate-import. Короткое и полное имя своего
проекта – это одно пространство имён, поэтому пара из них тоже считается повтором. IDE платформы
секцию Импорт не проверяет. Исправление снимает лишнюю строку.
yaml/ref-needs-nullable. Так пишут и отдельный
реквизит, и параметр типа компонента: Товары.Ссылка, ПолеВвода<Товары.Ссылка>. Компиляция
отвечает Default value initialization is not supported.
yaml/union-needs-nullable. Значение по умолчанию
платформа строит только для одного типа, а для набора типов без Неопределено сразу отказывается,
какими бы ни были члены. Пробник получил Default value initialization is not supported for types ... на реквизите справочника и его табличной части, на измерении и ресурсе регистра, на поле
структуры и хранимой структуры, на константе, на свойстве компонента интерфейса и на свойстве
контракта сущности. Компилируется состав с пустым значением (Строка|Число|?),
ЗначениеПоУмолчанию рядом с типом, поле структуры с Обязательное: Истина, параметр события и
виртуальной таблицы, свойство контракта типа. У свойства контракта сущности ключа
ЗначениеПоУмолчанию нет, так что там выход один – пустое значение. Три позиции падают со своими
сообщениями, и находка цитирует каждое: параметр записи или удаления (“The type composition of
parameter … must contain “Undefined” type“, ключа значения по умолчанию там тоже нет), параметр
запроса отчета (“Не указано значение по умолчанию для параметра”) и поле ввода вокруг состава,
ПолеВвода<Строка|Число> (“Parameter “ТипДанных” … must have a default value“, заданное полю
Значение не помогает). Параметр записи или удаления требует пустого значения и от одного типа:
второй пробник получил тот же отказ для Булево и для Число. Состав со ссылкой остается правилу
yaml/ref-needs-nullable, как и одиночная ссылка в параметре записи, а yaml/enum-needs-nullable
оставляет параметры записи и удаления этому правилу – у позиции одна находка. Исправление
дописывает |?, у поля ввода – внутри угловых скобок, а после одиночного типа параметра записи
или удаления – ? (Булево?).
yaml/contract-facet-mismatch. Реквизит
переопределяет одноименное свойство реализуемого контракта, реквизит табличной части – реквизит
таблицы контракта, и компилятор сверяет их ограничения. Свойство без ограничения не разрешает его
у реквизита (“Restrictions must not be set for the attribute that overrides entity contract
property”), причем ограничение – это любой ключ группы: Многострочная или КонтрольДлины в
одиночку тоже делают строку ограниченной. Ограниченное свойство требует того же ограничения (“No
restrictions are set …”), и значения должны совпадать (“… must be equal to 50”). Свойство с
ТолькоЧтение: Истина мягче: при свойстве без ограничения реквизит может ограничить себя сам, а
при ограниченном – быть строже, но не шире (“… cannot be greater than 50”). Число, ограниченное
одним ключом, берет для остальных умолчания – целая часть 10, дробная 0, – а граница, которая есть
у свойства и нет у реквизита, – отдельная ошибка. Типы должны совпадать; массив и состав строки с
числом правило не судит. Контракт, у которого есть базовые контракты, получает и их свойства, а
одноименные таблицы собирают свои реквизиты: пробник сверил реквизит со свойством базового
контракта и базового для базового, и сообщение назвало контракт, который свойство объявляет;
свойство, объявленное в наследнике заново, важнее базового. Регистр контракт сущности не
реализует вовсе (“a type contract is expected”, об этом говорит yaml/register-entity-contract),
а у контракта типа нет ограничений для сверки.
Исправление ставит неравную или недостающую длину строки равной длине свойства.
yaml/contract-standard-length. У стандартного
реквизита длина есть всегда: Наименование 150, Код 7, Номер документа 9, если Длина не
говорит иного. Одноименное свойство контракта без МаксимальнаяДлина роняет реализацию с “The
maximum length for property “Наименование” is not set in entity contract“, другая
МаксимальнаяДлина – с “… must be equal to 100”, а свойство только для чтения лишь ограничивает
длину сверху (“… cannot exceed 100”). Числовой код меряется ДлинаЦелойЧасти, и пробник это
подтвердил: без нее – “The integer part for property “Код” is not set“, иначе те же “must be equal”
и “cannot exceed”, а умолчание 7 проходит молча. Свойство базового контракта считается так же.
Исправление ставит Длина у реквизита; недостающую длину в контракте задают вручную либо
объявляют свойство только для чтения с наибольшей длиной, которая нужна реализациям.
yaml/register-entity-contract. Регистр участвует
в контрактах через порождаемые им типы, в разделе
НастройкиТипов: РегистрСведений.Запись: Контракты. Документация называет оба регистра среди
реализаций контракта типа и ни одного – среди реализаций контракта сущности: его реализует только
тип объекта справочника, документа, плана обмена, интегрируемого приложения или хранилища
настроек. Пробник на регистре сведений, который назвал <Контракт>.Объект контракта сущности,
получил “Invalid type of contract …; a type contract is expected”. Контракт ищется по короткому
имени в проекте; имя, общее у двух контрактов, контракт из библиотеки и голое имя без фасета
Объект правило не судит. Исправления нет: реализуйте вместо этого контракт типа или храните
данные в элементе, который может реализовать контракт сущности.
yaml/report-parameters-alias. Метамодель из
дистрибутива называет Параметры вторым написанием свойства ПараметрыЗапроса отчета, и проверка,
которая ей доверяет, считает ключ верным. Сервер так не считает: пробник получил отказ
Неизвестное свойство "Параметры". Английское Parameters у отчета не объявлено вовсе и падает
так же. Исправление переименовывает ключ в написании файла; если в отчете уже есть
ПараметрыЗапроса, два списка сводят вручную.
yaml/localization-key-unique. У секций Строки и
Шаблоны одно пространство имён, и файл перевода судится наравне со словарём. Применение отвечает
“Имя не уникально” и откатывает проект.
yaml/unused-component. code/unused-method такой
компонент не видит: его методы зовёт его же yaml. Употреблением считается значение в yaml или
любое слово модуля, а имя, стоящее ключом словаря локализации, не в счёт. Yaml, который не
разобрался, засчитывается всеми своими словами, словарь перевода не засчитывается вовсе. Точку
входа и ОбластьВидимости: Глобально правило не судит: это публичная поверхность библиотеки. Без
файла-дескриптора проекта среди проверяемых правило молчит, иначе компонент, размещённый снаружи
проверяемого подмножества, выглядел бы мёртвым.
yaml/duplicate-subtree. В слепок поддерева не входят
имена, идентификаторы и тексты. Порог в 40 узлов выведен замером: ниже правило ловит раскладку, а
не копии. Повтор внутри одного файла, источник данных списка и словарь локализованных строк с
его переводами правило не судит, а называет только максимальные группы. По умолчанию выключено: меру одинаковости
выбирает проект.
yaml/unknown-component-property. Пример:
ЗамещающийТекст у Флажка, это свойство ПолеВвода. Имя, которого нет ни у одного компонента,
правило не трогает: документация перечисляет ключи yaml не полностью.
yaml/inline-command-name. Так выглядит и инлайновый
фрагмент командного интерфейса, и команда-свойство. Применение отвечает: “Имя команды разрешено
задавать только в элементах проекта типа фрагмент командного интерфейса”. К команде обращаются
через параметр обработчика, а имя ей даёт только фрагмент, вынесенный отдельным элементом проекта.
yaml/list-scroll-without-loading. Порцию задаёт
РазмерСтраницы, и прокрутка крутит только её: запись находится поиском списка, но не прокруткой.
Лечит Навигация: ПодгрузкаПриПрокрутке. Список над массивом без своей прокрутки правило судит,
пока РазмерСтраницы автоматический (десять строк): страница прокручивает одну порцию, и лечит
размер страницы по пределу данных либо подгрузка со своей прокруткой списка. Источник-дерево и
иерархический динамический список подгружаются при прокрутке при любом значении и не судятся, как и
выражение в Навигации. Динамический список правило судит, когда источник сам объявляет его
плоским: ИспользуемаяИерархия записана типизированным узлом {Тип: РежимИерархии, Значение: Выключено}, как в примерах самой платформы. Список, чью иерархию решает основная таблица, судит
yaml/dynlist-scroll-without-loading, а список, собранный в коде, не судится. Скаляр в
ИспользуемаяИерархия не судится вовсе: на живом сервере голые Выключено, Авто и ПоУмолчанию
уронили применение (“Не указан тип значения” – слово подходит и перечислению, и строке), а
квалифицированное слово применилось даже со значением, которого нет ни в одном перечислении
(РежимИерархии.НетТакогоЗначения), поэтому РежимИерархии.Выключено читается именем иерархии, а
не плоским режимом.
yaml/dynlist-scroll-without-loading.
Проектная половина правила выше. Если ИспользуемаяИерархия не задана, иерархию решает основная
таблица (“Авто интерпретирует запрос к динамическому списку в зависимости от того – поддерживается в
нем иерархичность или нет”), и правило читает ее описание в проекте. Судится список над
справочником, у которого нет ни Иерархический, ни Иерархия, ни ДополнительныеИерархии, ни
ИерархияПоУмолчанию, и над документом, регистром, планом обмена, хранилищем настроек или
интегрируемым приложением: иерархии платформа дает только справочникам. Не судятся таблица вне
проекта, журнал данных, виртуальная таблица, производная таблица справочника (его группы) и имя, под
которым в проекте несколько элементов с разными ответами. Находки и исправление те же, что у
файлового правила; отдельным правилом эта половина вынесена, чтобы редактор по-прежнему проверял
файл на каждое нажатие клавиши, а проект читал при сохранении.
yaml/hierarchy-bare-value. ИспользуемаяИерархия
динамического списка принимает Авто, РежимИерархии или строку – имя иерархии основной таблицы.
Режим, записанный голым словом (Выключено, ПоУмолчанию, Авто), для сервера ни то, ни другое, ни
третье: пробник на живом сервере показал, что применение останавливается с “Не указан тип значения”
на строке свойства – и над справочником с иерархией, и без нее. Слово в кавычках и любое другое слово
читаются именем иерархии и применяются, как и узел с типом {Тип: РежимИерархии, Значение: Выключено} из примеров самой платформы; слово с именем перечисления (РежимИерархии.Выключено)
тоже читается именем, поэтому не лечит. Исправление пишет узел с типом на языке файла, а для Авто
убирает строку – незаданное свойство и значит Авто; свойство внутри однострочного словаря
остается находкой без исправления.
yaml/compute-permissions-by. Сущность, у которой
настройки доступа вычисляют разрешение для каждого объекта (право со значением
РазрешенияВычисляютсяДляКаждогоОбъекта или такое же ПоУмолчанию, когда какое-то право не
указано), читает разрешения объекта по реквизитам из РасчетРазрешенийПо, и сборка проверяет список
с обеих сторон. Если списка нет или он пуст, она отвергает описание с “Attributes for calculating
object access permissions are missing” в начале блока КонтрольДоступа; исключение – стандартные
разрешения хранилища настроек, тогда сборка берет свои реквизиты. Если список есть, а для каждого
объекта не вычисляется ни одно разрешение, ответ другой: “It is not allowed to specify attributes for
calculating access permissions without configuring access permissions calculation for each object” –
на первом реквизите списка. Проба на сервере дала оба ответа для справочника,
документа, хранилища настроек и регистра сведений обоих видов. Правило судит виды, у настроек
доступа которых это свойство вообще есть: справочник, документ, план обмена, хранилище настроек,
интегрируемое приложение и регистры.
yaml/compute-permissions-by-unknown.
Сборка отвечает Attribute "X" is not found на имени в списке. Пробник на сервере дал
такой ответ для реквизита с опечаткой, для Наименование справочника и Номер документа,
не записанных в Реквизиты, для Ид и для табличной части, а принял объявленный
реквизит, измерения, ресурсы и реквизиты регистра, ссылку, Родитель иерархического
справочника и Период периодического регистра. Поля элемента – то, что он объявляет,
служебные поля, которые у него есть без объявления (среди них МоментПометкиУдаления), и
встроенные поля его вида: Код, НомерОтправленного, НомерПринятого и ЭтотУзел плана
обмена, системные реквизиты хранилища настроек (Вариант, Значение, КлючНастройки,
КлючОбъекта, Наименование, Общая, Пользователь) и НастройкиПрямогоПодключения
интегрируемого приложения. Наименование и файлы плана обмена и интегрируемого приложения, а у
второго и код, объявляются так же, как у справочника. Служебный набор взят с запасом, и у него
три исключения: необъявленный Номер документа правило называет, как и ПометкаУдаления
хранилища настроек, у которого ее нет, а ПометкаУдаления и Представление остальных видов –
вычисляемые поля: компилятор их принимает, затем применение сборки падает внутри сервера, и
правило говорит об этом отдельным сообщением.
yaml/root-url-cyrillic. Пробники на сервере
опубликовали HTTP- и SOAP-сервис с КорневойUrl кириллицей рядом с латинскими. Сборка приняла
их все, и приложение заработало; латинские адреса ответили, а запрос на кириллический адрес в
процентной кодировке получил Handler of HTTP request ... not found, в сыром виде он не прошел
дальше фронтового сервера. Имя сервиса и пространство имен SOAP-сервиса кириллицей работали, их
правило не судит. Быстрое исправление записывает адрес латиницей так же, как теперь делает
new-object для кириллического имени сервиса: /ЗадачиПроекта становится /zadachi-proekta.
yaml/component-member-unique. Компонент интерфейса
объявляет собственные свойства и собственные события по имени, и компилятор держит оба списка в одном
пространстве имен: пробник на живом сервере со свойством и событием одного имени получил два отказа –
“Property name X is not unique” у свойства и “Event name X is not unique” у события. Правило читает
Свойства и События верхнего уровня компонента и сообщает о каждом повторе имени после первого,
называя строку первого; разметка под Наследует – другое пространство имен, ее правило не читает.
Исправления нет: какое из двух переименовать, решает автор. add-field такое имя тоже не пишет.
Тир B – текст и соглашения
Кодировка, переводы строк, пробелы, типографика (тире, кавычки, многоточие, знаки не с клавиатуры), слог комментариев, английский текст словаря перевода, длина строки, секреты в исходниках.
Типографика читает и файлы ресурсов проекта – .css, .js, .svg и .html из каталога
Ресурсы. Подсистема отдаёт их браузеру как есть, поэтому проза оттуда доходит до читателя
так же, как проза модуля. Судятся комментарии всех четырёх форматов и текст, который
пользователь видит на экране: <title>, <desc> и <text> в SVG, текстовые узлы
HTML-страницы. Код не трогаем – селекторы, идентификаторы, имена тегов и атрибутов, значения
атрибутов, строковые литералы скрипта и стилей. Комментарии этих файлов читает и группа comment/.
Остальные правила тира смотрят только модуль и описание элемента; файлы словаря перевода читают
translation/english-shape, comment/first-person и comment/emphasis-caps.
| Правило | Область | Что проверяет | ||
|---|---|---|---|---|
security/hardcoded-secret |
✓ | файл | Ключ или пароль литералом в коде | |
typography/em-dash |
– | файл | Длинное тире в комментарии – модуля или файла ресурсов – и в тексте страницы; пишется среднее тире | |
typography/ellipsis |
✓ | файл | Символ многоточия там, где нужны три точки: комментарий, текст SVG или HTML-страницы | |
typography/curly-quotes |
✓ | файл | Кудрявые кавычки везде, где попадутся: комментарий, строковый литерал модуля, текст страницы | |
typography/guillemets-comment |
– | файл | Ёлочки в комментарии, в файле ресурсов тоже; в тексте на экране они уместны и не судятся | |
typography/yo-in-text |
– | файл | Буква “ё” в тексте, который читает пользователь: подпись, запись словаря локализованных строк, текст SVG или HTML-страницы | |
typography/non-keyboard |
✓ | файл | Знак не с клавиатуры в комментарии: стрелка, знак сравнения или умножения; исправление пишет ->, >=, <>, x и подобное, валютный знак – данные и не судится |
|
typography/en-dash-comment |
– | файл | Среднее тире в комментарии – для проекта, который пишет в комментариях кода дефис; исправление ставит дефис | |
comment/doc-marker |
– | файл | Блок // прямо над объявлением (метод, структура, поле, элемент перечисления, константа модуля): среда разработки узнает документирующий комментарий только по маркеру /// и только такой текст показывает в подсказке при наведении, в подсказке сигнатуры и в автодополнении. Автоисправление меняет маркер; о блоке /* ... */ на этом месте правило сообщает без исправления. Рамка //// в прикрепленном блоке тоже вызывает замечание: среда снимает только три слеша. Автоматически выбирать между шапкой и описанием правило не может доки |
|
comment/subjunctive |
– | файл | Частица “бы” в комментарии; замечание просит слово условия, потому что без частицы предположение читается утверждением. Уступительные обороты не судятся | |
comment/first-person |
– | файл | Первое лицо в комментарии: местоимение “мы”, “наш” или глагол вроде “проверяем”, а в английской строке комментария из словаря перевода – “we”, “our”, “I”; комментарий безличен | |
comment/emphasis-caps |
– | файл | Слово прописными ради ударения в комментарии: “НЕ”, “ТОЛЬКО”, приставка “НЕзаполненным”. Ударение набирают словами, а не регистром подробнее | |
comment/dash-condition |
– | файл | Условие в комментарии написано через тире (“склад не задан - берется основной”) вместо слова “если” подробнее | |
comment/doc-tag-unknown |
✓ | файл | Строка блока ///, которая начинается с @, но не тег (@param, @Параметр, аннотация в тексте): среда разработки не покажет ее в подсказке вместе с продолжением. Исправление пишет ключевое слово строчными и заменяет краткие формы @param, @return, @throw, @exception подробнее доки |
|
comment/doc-tag-layout |
✓ | файл | Теги блока /// не на своем месте: тег в первой строке (среда берет его за описание), абзац после последнего тега (приклеится к нему), нет пустой строки между описанием и тегами, порядок тегов не как в разделах подсказки, тег без текста, после имени не дефис. Исправление вставляет пустую строку и ставит дефис подробнее доки |
|
translation/english-shape |
✓ | файл | След механической замены в английском значении словаря перевода: окончание, приклеенное к слову, которое его не принимает (onlies) подробнее |
|
whitespace/trailing |
✓ | файл | Хвостовые пробелы | |
whitespace/mixed-newline |
✓ | файл | Смешанные переводы строк | |
encoding/utf8 |
✓ | файл | Файл не в UTF-8 | |
style/tab-indent |
✓ | файл | Табуляция в отступе доки | |
style/line-length |
✓ | файл | Строка длиннее 120 символов доки |
Подробнее о правилах тира B
comment/emphasis-caps. Правило судит служебное слово,
любое другое слово, которое тот же файл пишет и строчными, однобуквенное слово посреди фразы (“В
котором”), приклеенную приставку и прописные английской строки комментария в словаре перевода.
Аббревиатуры, маски дат и цитату запроса правило не судит. Цитату запроса оно узнает по таблице
ключевых слов языка запросов из данных платформы (раздел query файла terms.json): ключевое
слово, которое проза прописными не выделяет (“ВЫБРАТЬ”, “УБЫВ”), составное (“УПОРЯДОЧИТЬ ПО”)
или начало выражения ВЫБОР либо оператора, меняющего временную таблицу (“ВЫБОР КОГДА”,
“ВСТАВИТЬ В Таблица (”), делает цитатой всю строку, а остальные ключевые слова считаются
синтаксисом, только когда за ними идет код. Так же считаются зарезервированные слова, которых в
таблице нет (литералы ИСТИНА, ЛОЖЬ, НЕОПРЕДЕЛЕНО и слово TEMP): их правило берет из списка
зарезервированных слов в том же файле (раздел query_reserved, таблица из справки платформы), а
литерал после знака сравнения – синтаксис и без кода за ним. Без таблицы или списка правило берет
короткие собственные списки. Исправление возвращает регистр.
comment/dash-condition. Замечание предлагает
формулировку со словом условия. Пояснение к значению правило не судит: там перед состоянием ничего
не названо либо после тире нет глагола.
Правила comment/doc-tag-*. Среда разработки читает блок ///
регулярными выражениями: описание – все до первой строки, начатой с @, затем из остатка
вырезаются теги @параметр, @возвращает, @выбрасывает и @см (и их английские
написания), каждый до следующей такой строки, а имя после @параметр и @выбрасывает
читается классом [A-Za-zА-Яа-я0-9еЁ]. Правила называют места, где такое чтение расходится с
написанным. Они судят только блок с тегами, поэтому включены по умолчанию, в отличие от
остальной группы. Структуру, исключение и конструктор comment/doc-tag-param и
comment/doc-tag-result не судят. comment/doc-tag-target не трогает @см, записанный
фразой, одно слово строчными и слово другого алфавита проекта; comment/unknown-name не
судит имена, на которые указывают эти теги.
translation/english-shape. Правило ловит ещё
страдательный залог с именной группой сразу за ним (“is shadowed the parameter”) и прописные,
которых нет в русском ключе. Судятся только файлы xbsl-translation.
Тир C – структура кода, базовый синтаксис и соглашения по написанию
Баланс блоков и скобок, заголовки циклов и методов, локальные переменные и группа style/ –
соглашения из раздела документации “Рекомендации по написанию кода”. Все правила style/
включены по умолчанию и идут как warning.
| Правило | Область | Что проверяет | ||
|---|---|---|---|---|
code/parse-error |
✓ | файл | Синтаксическая ошибка (полный разбор по грамматике платформы) доки | |
code/statement-no-effect |
✓ | файл | Оператор-выражение, который не является вызовом метода или выбросом исключения: ошибка сборки, даже если внутри есть вызов | |
code/return-mismatch |
✓ | файл | Возврат не по сигнатуре метода (значение в методе-ничто, пустой возврат в типизированном) – компилятор такой код отвергает доки |
|
code/self-assignment |
✓ | файл | Значение присваивается туда же, откуда читается: Х = Х, этот.Поле = этот.Поле, Х -= Х. Компилятор это отвергает, и сборка откатывается подробнее |
|
code/assign-target |
✓ | файл | Левая часть присваивания не может принять значение – вызов метода, приведение, сам этот или цепочка через безопасный доступ ?.; компилятор такое присваивание отвергает доки |
|
code/assign-readonly |
✓ | файл | Присваивание имени, доступному только для чтения: переменной знч или исп, переменной цикла или поймать, константе модуля. Компилятор его отвергает подробнее доки |
|
code/unreachable-statement |
✓ | файл | Код, до которого выполнение не доходит: после возврат, выбросить, прервать или продолжить. Компилятор его отвергает подробнее |
|
code/misplaced-jump |
✓ | файл | прервать или продолжить вне цикла, а также возврат, прервать, продолжить в секции вконце; компилятор такой переход отвергает доки |
|
code/call-arity |
✓ | файл | Локальный вызов не соответствует установленной сигнатуре: число аргументов, неизвестное или повторное имя, позиционный аргумент после именованного либо пропущенный обязательный параметр доки | |
code/brackets |
✓ | файл | Дисбаланс скобок () [] {} | |
code/blocks |
✓ | файл | Дисбаланс блоков и ‘;’ доки | |
code/ternary-and-or |
✓ | файл | Тернарный оператор сразу после это Тип справа от и или или: он принадлежит проверке типа, и строка компилируется не так, как читается подробнее доки |
|
code/query-in-loop |
✓ | файл | Запрос внутри цикла | |
code/param-type-required |
✓ | файл | Параметр без типа и без значения по умолчанию доки | |
code/duplicate-annotation |
✓ | файл | Повторная аннотация у объявления, точный повтор имени без аргументов: компилятор такой модуль отвергает подробнее доки | |
code/duplicate-import |
✓ | проект | Модуль ещё раз импортирует пространство имён: вторая строка ничего не добавляет подробнее доки | |
code/module-var-not-const |
✓ | файл | Объявление пер / знч / исп на уровне модуля – там живёт только константа, выражение вне тела метода компилятор отвергает, и применение откатывает проект доки |
|
code/param-redeclared |
✓ | файл | Объявление знч, пер или исп в теле метода с именем его же параметра: метод вместе с параметрами это одна область видимости, и применение откатывает проект подробнее доки |
|
code/lambda-changes-outer-local |
✓ | файл | Тело лямбды присваивает захваченной локальной переменной или параметру метода: компилятор отвергает проект целиком подробнее доки | |
code/loop-header |
✓ | файл | Неверный заголовок цикла ‘для’ доки | |
code/invalid-string-escape |
✓ | файл | Недопустимая управляющая последовательность в строковом литерале (\', регексные \d) – компилятор отвергает такой литерал; валидны \н \в \т \\ \" \% \$ \ю<код> и латинские написания доки |
|
code/dead-interpolation |
✓ | файл | Удвоенный знак интерполяции перед скобкой: платформа читает пару как экранированный знак, и выражение не вычисляется подробнее доки | |
code/unused-local |
✓ | файл | Переменная знч, пер или исп, которую метод не читает или которой только присваивает: имя занимает место и сбивает при чтении подробнее |
|
code/unused-loop-var |
✓ | файл | Переменная цикла для Х из, которую тело цикла не читает; счётчик для Х = А по Б не проверяется, как и в IDE платформы |
|
code/ref-field-needs-req |
✓ | файл | Поле-ссылка структуры без ‘обз’ доки | |
style/boolean-compare |
✓ | файл | Сравнение булева значения с Истина/Ложь доки | |
style/boolean-ternary |
✓ | файл | Тернарный оператор с ветвями Истина и Ложь: он равен своему условию или его отрицанию, и IDE платформы об этом предупреждает подробнее доки |
|
style/undefined-is |
✓ | файл | Проверка Неопределено оператором ‘это’ доки | |
style/negated-is |
✓ | файл | Отрицание оператора ‘это’ снаружи доки | |
style/semicolon-line |
✓ | файл | ‘;’ не на отдельной строке доки | |
style/wrap-operator |
✓ | файл | Операция в конце перенесённой строки доки | |
style/wrap-comma |
✓ | файл | Запятая в начале перенесённой строки доки | |
style/camel-case |
✓ | файл | Имя не в UpperCamelCase доки | |
style/const-case |
✓ | файл | Константа не БОЛЬШИМИ_БУКВАМИ доки | |
style/exception-prefix |
✓ | файл | Имя исключения без пометки: у русского имени это префикс “Исключение”, у латинского – суффикс Exception | |
style/abbreviation-case |
✓ | файл | Аббревиатура заглавными буквами в имени доки | |
style/enum-name-vid |
✓ | файл | Имя перечисления начинается с “Тип” доки | |
style/collection-literal |
✓ | файл | Ручное наполнение коллекции вместо литерала доки | |
style/constructor-literal |
✓ | файл | Конструктор типа, у которого есть литерал, вызван с одними постоянными аргументами: IDE платформы об этом предупреждает подробнее доки | |
style/redundant-tostring |
✓ | файл | ‘.ВСтроку()’ в конкатенации доки | |
style/interpolation |
✓ | файл | Конкатенация вместо интерполяции доки | |
style/type-colon-space |
✓ | файл | Пробелы вокруг двоеточия типа доки | |
style/union-spaces |
✓ | файл | Пробелы вокруг ‘|’ в составном типе доки | |
style/nullable-shorthand |
✓ | файл | Неопределено в типе без сокращения ‘?’ доки | |
style/redundant-type |
✓ | файл | Избыточная аннотация типа при инициализации доки | |
style/redundant-scope |
✓ | файл | область – единственная инструкция своего блока: она кончается там же, где блок, и ничего не ограничивает подробнее доки |
|
style/optional-params-last |
✓ | файл | Необязательный параметр перед обязательным доки | |
code/resource-bare-name |
✓ | файл | Ресурс{Ресурсы/Имя.svg} – ключ ресурса задается относительно каталога Ресурсы; сам каталог в ключе ломает поиск доки |
|
query/named-parameter |
✓ | файл | Именованный параметр &Имя внутри литерала запроса – значения в литерал передаются интерполяцией (%Имя) доки |
|
code/this-in-static-method |
✓ | файл | Ключевое слово этот в теле статического метода – статический метод общий для всего типа и контекста объекта не имеет, проект компилятор отвергает доки |
|
code/instance-call-from-static |
✓ | файл | Вызов обычного метода того же владельца по голому имени из статического метода – документация запрещает это прямо; вызывайте метод у значения либо сделайте его статическим доки | |
code/close-in-before-close |
✓ | файл | Закрыть() внутри ПередЗакрытием – платформа игнорирует вызов, и форму не закрывает уже ничто |
|
query/no-isnull |
✓ | файл | ЕСТЬNULL( внутри литерала запроса – такой функции в языке запросов нет |
|
style/abstract-name |
✓ | файл | Абстрактное имя переменной (Данные, Элемент, Значение) не говорит о ней ничего подробнее доки |
|
style/single-letter-name |
✓ | файл | Однобуквенное имя переменной, параметра или переменной цикла – по стандарту имен односимвольными бывают только параметры коротких лямбда-выражений ((А, Б) -> А + Б) доки |
|
style/negated-boolean-name |
✓ | файл | Булева переменная названа от отрицания (НеПодключен, НетОшибок): имя образуют от истинного значения признака подробнее доки |
|
style/type-in-name |
✓ | файл | Имя переменной начинается с типа-контейнера (МассивСтруктурИмен, СтруктураОтвета) – тип виден по объявлению и подсказке редактора, в имя его не включают доки |
|
style/numeral-in-const-name |
✓ | файл | Числительное в имени константы (ТАЙМАУТ_ОДНА_МИНУТА) описывает ее значение – константу называют абстрактно (ТАЙМАУТ), чтобы смена значения не ломала имя доки |
|
code/required-field-default |
✓ | файл | Поле структуры или исключения с обз имеет значение по умолчанию, которое компилятор отвергает. Исправление удаляет инициализатор, только если остаётся явно указанный тип. |
|
code/declaration-needs-init |
✓ | файл | Локальная переменная или необязательное поле составного типа без пустого варианта не имеет инициализатора; константа модуля (конст) или переменная исп объявлена без значения. |
|
code/return-use-resource |
✓ | файл | Оператор возврат передаёт ресурс исп, который закрывается при выходе из области видимости, в том числе через приведение типа, выбор непустого значения и условное выражение. |
|
code/duplicate-when |
✓ | файл | Ветвь когда оператора выбор повторяет литерал, элемент перечисления своего файла или явно указанный тип, обработанный выше. |
|
code/duplicate-catch |
✓ | файл | Один тип исключения повторяется в секциях поймать одного оператора попытка. |
|
code/duplicate-declaration |
✓ | файл | Имя объявлено повторно там, где регистр не учитывается, либо у перечисления несколько элементов умолчание; перегрузки с одинаковым написанием и локальные имена соседних областей допустимы. |
|
code/captured-local-write |
✓ | файл | Изменяемая локальная переменная или параметр именованного метода получает присваивание после захвата лямбдой: лямбда увидит уже не то значение подробнее доки | |
comment/doc-tag-param |
✓ | файл | Тег @параметр против сигнатуры метода: имени нет среди параметров или оно написано иначе, параметр описан дважды или не по порядку, имя обрезает сама среда (подчеркивание, точка, строчная “ё”), тег над объявлением без параметров. Параметры метода описываются все или ни одного подробнее доки |
|
comment/doc-tag-result |
✓ | файл | Тег @возвращает у метода без результата или второй такой тег (подсказка склеит тексты); тип в @выбрасывает, который среда обрежет на первой точке; оба тега над объявлением, которое не метод подробнее доки |
Подробнее о правилах тира C
code/self-assignment. Составная форма судится, только
когда файл называет тип операнда: строка, сложенная сама с собой, компилируется законно. Простую
форму снимает исправление.
code/assign-readonly. Правило судит и знч-поле
структуры, в том числе через параметр или локальную переменную, тип которой объявлен в том же
файле структурой или исключением. У локальной переменной исправление меняет знч на пер.
code/unreachable-statement. Выходом считается ещё
вызов метода никогда своего файла и ветвление, у которого выходят все ветви. выбор по всем
элементам перечисления этого файла тоже считается.
code/ternary-and-or. А и Х это Строка ? 1 : 0 читается
как А и (Х это Строка ? 1 : 0) и не компилируется, пока обе ветви не булевы. Обычное А и Б ? 1 : 0 берёт условие целиком, и его правило не судит. Исправление берёт условие в скобки.
code/duplicate-annotation. Аннотации копятся до
ближайшего объявления, и комментарий между ними их не разделяет.
code/duplicate-import. Короткое и полное имя своего
проекта – это одно пространство имён, а регистр букв имена различает. IDE платформы предупреждает
о каждом повторе после первого. Исправление снимает повторную строку.
code/param-redeclared. В ту же область входят и
вложенные блоки: цикл, ветка, попытка. Компилятор отвечает “Переменная с именем X уже
определена”. Переменные цикла и поймать, параметры лямбд и тела полных лямбд правило не судит.
code/lambda-changes-outer-local. Судится пер
или параметр метода либо внешней лямбды, операторы =, +=, -=, *= и /=, краткая и полная
лямбда на любой глубине. Член и элемент захваченного значения менять можно. знч, исп,
переменные цикла и поймать доступны только для чтения, и компилятор отвечает на них другой
ошибкой.
code/dead-interpolation. Так выглядят %%{...} и
$${...}, и в значение уходит текст выражения. Экранируйте первый знак (\%%{...}) или соберите
строку конкатенацией.
code/unused-local. Имена разрешаются по блочным областям,
как в IDE платформы. Исправление снимает имя неиспользуемой переменной исп, и ресурс всё равно
закрывается в конце области видимости.
style/boolean-ternary. Правило судит модуль,
интерполяцию строки и привязку yaml. Исправление записывает условие или отрицание так, как
платформа связывает не.
style/constructor-literal. Пример: новый Дата("9999-12-31"). Так же судится НайтиТип с постоянным именем. Исправление ставит литерал
там, где он хранит то же значение.
style/redundant-scope. IDE платформы об этом
предупреждает. Исправление снимает область и сдвигает её тело на отступ влево.
style/abstract-name. Судится точное имя и имя с числовым
хвостом (Данные1). Перечень: Данные, Элемент, Объект, Строка, Значение, Документ.
Основу внутри длинного имени (ДанныеКлиента) и поля структур правило не трогает: поле структуры
это контракт сериализации.
style/negated-boolean-name. Так было бы Подключен
и ЕстьОшибки. Судится только доказанное Булево: аннотация типа или булев литерал в
инициализации.
code/captured-local-write. Правило судит и запись
перед захватом в цикле, который повторно использует ту же переменную. Запись до захвата, новая
локальная переменная каждой итерации и изменение членов или элементов значения остаются
допустимыми. Автоматической правки нет.
Тир D – семантика над stdlib, формы и метамодель
Требует индекс проекта и данные платформы: неизвестные типы и объекты, значения перечислений, модель выполнения (клиент/сервер), обработчики форм, свойства и запросы.
| Правило | Область | Что проверяет | ||
|---|---|---|---|---|
yaml/choice-needs-static-list |
✓ | файл | ВыборЗначения без статичного СпискаВыбора доки | |
yaml/slot-needs-list |
✓ | файл | Слот, описанный в ui-схеме типом Массив<...>, получил один компонент вместо списка: применение сборки отвергает такую разметку, а линт до сих пор молчал доки |
|
yaml/value-choice-title |
✓ | файл | У ВыборЗначения с явным ВидОтображенияПереключателя: Переключатель задан Заголовок: платформа его не рисует, и поле остаётся без подписи подробнее |
|
code/unknown-type |
✓ | проект | Неизвестный тип | |
code/catch-non-exception |
✓ | файл | Тип в поймать не исключение (stdlib-тип без сигнатуры исключения или локальная структура) – компилятор такой код отвергает доки |
|
code/unknown-member |
✓ | файл | Обращение к отсутствующему члену переменной известного stdlib-типа – простого или дженерика, у которого аргументы типизируют члены, но не называют их (первый шаг цепочки, у опечаток подсказка) | |
code/member-kind-mismatch |
✓ | проект | Метод стандартной библиотеки прочитан как свойство (или наоборот) доки | |
code/unknown-static-member |
✓ | проект | Обращение по имени типа к члену, которого у типа нет (ДатаВремя.Минимальная()): такой вызов не скомпилируется подробнее |
|
yaml/foreign-not-public |
✓ | проект | Ссылка из yaml на элемент чужой подсистемы, у которого ОбластьВидимости не ВПроекте и не Глобально: снаружи своей подсистемы он недоступен, и импорт не поможет подробнее доки |
|
code/foreign-not-public |
✓ | проект | Модуль или запрос называет элемент чужой подсистемы, у которого ОбластьВидимости не ВПроекте и не Глобально: компилятор отвергает обращение на этой строке подробнее доки |
|
code/call-arity-cross |
✓ | проект | Вызов модуля не соответствует установленной сигнатуре по числу или связыванию именованных аргументов; неоднозначные перегрузки и затененные имена модулей не проверяются доки | |
code/missing-return |
✓ | проект | Метод с результатом имеет установленный путь до конца без возврат: по этому пути метод не вернёт ничего подробнее доки |
|
code/unused-return-value |
✓ | файл | Отдельный оператор отбрасывает результат платформенного метода с аннотацией @ПроверятьИспользованиеЗначения: работа метода пропадает впустую подробнее доки |
|
code/ambiguous-type |
✓ | проект | Короткое имя типа в коде относится сразу к нескольким видимым пространствам имён проекта подробнее доки | |
yaml/ambiguous-type |
✓ | проект | Короткое имя типа в YAML относится к нескольким видимым пространствам имён проекта. Имена корня и пакетов имеют равный приоритет; укажите пространство имён типа явно доки | |
code/undefined-name |
✓ | проект | Неизвестное имя в выражении (опечатки вида Адресар вместо Адреса) и в короткой интерполяции строки ("?$format=json" – подстановка имени format, нужен \$) – компилятор такой код отвергает |
|
code/unknown-object-type |
✓ | проект | Неизвестный тип объекта проекта | |
yaml/unknown-type |
✓ | проект | Неизвестный тип в yaml | |
yaml/dynlist-missing-field |
✓ | проект | Нет поля динамического списка доки | |
yaml/dynlist-row-editing |
✓ | проект | Обработчик ПриРедактированииСтроки у списка с плоским динамическим источником: платформа его не вызывает вовсе подробнее доки |
|
yaml/dynlist-joined-table-param |
✓ | файл | Параметр (&Имя) или биндинг (=...) в аргументах либо фильтре присоединённой таблицы динамического списка: он не вычисляется, и список отказывает уже при работе подробнее доки |
|
yaml/dynlist-filter-disabled |
✓ | проект | Отбор динамического списка объявлен с Использовать: Ложь, а парный модуль включает его присваиванием: первый кадр покажет всю таблицу подробнее доки |
|
yaml/dynlist-filter-computed-alias |
✓ | файл | ЭлементФильтра динамического списка назван псевдонимом поля списка, которое не столбец под своим именем, – вычисляемого поля, переименованного столбца, пути по ссылке: фильтр ищет поле среди столбцов таблиц, поэтому молча отбирает по одноименному столбцу или роняет применение сборки подробнее доки |
|
yaml/list-form-needs-dynlist |
✓ | файл | Форма наследует ФормаСписка, а таблица в её содержимом взята по ИсточникДанныхМассив: пункт навигации молча исчезает подробнее доки |
|
yaml/ref-input-auto-commands |
– | файл | Ссылочное ПолеВвода без своего узла Команды: платформа рисует рядом собственную кнопку, которая открывает значение в отдельном окне подробнее доки |
|
yaml/toggle-command-pair |
✓ | файл | Две соседние ОбычныеКоманды с зеркальной Видимость (=X и =не X) изображают одну команду с двумя состояниями, которая у платформы уже есть подробнее доки |
|
yaml/dynlist-column-sort-lost |
– | файл | Колонка таблицы над динамическим списком, чьё значение это вызов: платформа сортирует по полю источника, и заголовок такой колонки сортировать не будет подробнее доки | |
yaml/badge-column-image |
✓ | файл | У СтандартнаяКолонкаТаблицы с Вид: Значок задано Изображение: платформа картинку не показывает подробнее доки |
|
code/unknown-enum-value |
✓ | проект | Неизвестное значение перечисления доки | |
yaml/enum-needs-nullable |
✓ | проект | Перечисление в позиции Тип без ?: значения по умолчанию у него нет, и серверная компиляция падает подробнее доки |
|
yaml/enum-default-value |
✓ | проект | ЗначениеПоУмолчанию поля-перечисления пишется голым именем объявленного значения: запись с именем типа (ВидимостьМетки.Невидимая) или несуществующее имя сборка отвергает доки |
|
yaml/unknown-enum-value |
✓ | файл | Значение свойства компонента вне списка перечисления ui-схемы (ВыравниваниеСодержимогоПоВертикали: Конец – по вертикали значения Конец нет) |
|
yaml/bare-object-value |
✓ | файл | Голое слово в свойстве, принимающем Объект (Значение: Титул) – платформа ждёт литерал в кавычках, выражение с = либо $-ссылку локализованной строки доки |
|
code/unknown-resource |
✓ | проект | Ссылка Ресурс{...} неизвестна, недоступна по видимости или неоднозначна на выбранном приоритете пространства имен доки |
|
form/unknown-handler |
✓ | проект | Обработчик формы не найден в модуле доки | |
form/handler-signature |
✓ | проект | Сигнатура обработчика не совпадает с событием доки | |
code/bound-handler-annotation |
✓ | проект | Аннотация @Обработчик у метода, который парный yaml привязывает к событию, команде или маршруту: аннотация помечает переопределение, и компилятор отвергает её у привязанного метода доки |
|
code/handler-overrides-nothing |
✓ | проект | Аннотация @Обработчик у метода, который парный yaml не привязывает и который не переопределяет ни одного обработчика, объявленного базой модуля в режиме совместимости проекта: компилятор такой метод отвергает. Для компонента интерфейса списки берутся из описаний компонентов в поставке, для остальных модулей (объект, набор записей, запись, запланированное задание, команда) – из провайдеров обработчиков компилятора; модуль, который берет имена обработчиков при сборке из описания самого элемента, не судится, модуль самого элемента с настройками доступа судится по ним, ПриСозданииНаОсновании – по списку СозданиеНаОсновании описания, а модуль проекта – по его виду подробнее доки |
|
code/mandatory-handler-missing |
✓ | проект | Модуль не объявляет обработчик, который требует компилятор: обработчик команды и запланированного задания, расчет параметров работы клиента, обработчик разрешений права на действие, ПриСозданииНаОсновании на каждый тип из СозданиеНаОсновании, обработчики доступа, которые используют настройки, и пару объявленного обработчика навигационной ссылки. Сборка отвергает модуль с “Mandatory handler X is not defined” подробнее доки |
|
code/unknown-form-component |
✓ | файл | Обращение к компоненту, которого нет в разметке формы доки | |
code/server-call-from-handler |
✓ | проект | Серверный метод недоступен клиентскому обработчику доки | |
code/image-binding-server-call |
✓ | проект | Свойство Изображение компонента платформы обращается к серверу напрямую или через клиентские методы подробнее доки |
|
code/computed-property-server-call |
– | проект | Вычисляемые свойства обращаются к доступному с клиента серверному методу без штатного кеша результата подробнее доки | |
code/sequential-server-calls |
– | проект | Клиентский метод на пути открытия обращается к серверу несколько раз подряд там, где один серверный метод с типизированным результатом обошелся бы одним обращением подробнее доки | |
code/resource-read-without-cache |
✓ | проект | Доступный с клиента метод исполняется на сервере и только возвращает текст ресурса, прочитанный без штатного кеша результата подробнее доки | |
code/client-annotation-in-server-module |
✓ | проект | Клиентская аннотация в серверном общем модуле доки | |
code/client-module-in-http-service |
✓ | проект | Клиентский общий модуль в серверном окружении доки | |
code/server-annotation-in-client-module |
✓ | проект | Серверная аннотация в клиентском общем модуле доки | |
code/query-needs-server |
✓ | проект | Блок Запрос{...} в методе клиентского модуля без @НаСервере: на клиенте такого типа нет, и компилятор отвергает сборку подробнее доки |
|
code/local-method-cross-component |
✓ | проект | Кросс-компонентный вызов локального метода доки | |
code/local-method-cross-module |
✓ | проект | Межмодульный вызов локального метода доки | |
naming/yo |
✓ | файл | Буква “ё” в имени доки | |
naming/underscore |
✓ | файл | Подчёркивание в имени доки | |
naming/abbreviation |
✓ | файл | Аббревиатура заглавными буквами в имени доки | |
naming/latin-term |
✓ | файл | Англоязычный термин записан русскими буквами доки | |
naming/enum-vid |
✓ | файл | Имя перечисления со словом “Тип” доки | |
naming/kind-in-name |
✓ | файл | Вид элемента в его имени доки | |
naming/filler-word |
✓ | файл | Слово-пустышка в имени доки | |
naming/module-suffix |
✓ | файл | Постфикс окружения в имени общего модуля доки | |
naming/number |
✓ | файл | Число имени не по виду элемента доки | |
naming/boolean-name |
✓ | файл | Имя булева реквизита доки | |
naming/presentation |
✓ | файл | Представление элемента доки | |
naming/prefix-by-kind |
✓ | файл | Имя вида без обязательного префикса доки | |
code/unknown-ns-object |
✓ | проект | Неизвестный объект в пространстве имён вида | |
query/unknown-table |
✓ | проект | Неизвестная таблица в запросе доки | |
query/in-subquery-composite |
✓ | проект | ‘В’ с подзапросом по составному типу доки | |
yaml/unknown-property |
✓ | файл | Неизвестное свойство объекта | |
code/reserved-name |
✓ | файл | Зарезервированное имя: Тип, type или Type полем структуры или параметром. Применение на сервере отвергает все три подробнее |
|
yaml/builtin-property-name |
✓ | файл | Совпадение со встроенным свойством | |
yaml/auto-bare-value |
✓ | файл | Голое Авто в свойстве, которое принимает Авто или строку (заголовок кнопки, представление фильтра динамического списка): применение отвергает значение, у которого не указан тип подробнее |
|
yaml/property-shadows-module |
✓ | проект | Свойство компонента названо как общий модуль: имя перекрывает модуль во всём компоненте, Модуль.Метод() читается как член значения свойства, и применение падает подробнее доки |
|
yaml/size-needs-no-stretch |
– | файл | Размер без отключения растягивания доки | |
yaml/col-width-needs-no-stretch |
– | файл | Ширина колонки таблицы – число или привязка – без РастягиватьПоГоризонтали: при растягивании число работает как доля свободного места, а не как пиксели подробнее доки |
|
yaml/matrix-group-max-width |
– | файл | Числовая МаксимальнаяШирина у группы с матричной компоновкой: телефон рисует страницу десктопной шириной, и контент уходит за правый край подробнее доки |
|
yaml/card-literal-stretch-weight |
– | файл | Литеральный ВесПриРастягивании у карточки или у группы внутри неё: в мобильной раскладке Safari схлопывает карточку, а Chrome не показывает ничего подробнее доки |
|
code/unused-method |
– | проект | Метод объявлен в проекте и больше нигде не используется: ни вызовом в коде, ни привязкой в yaml, ни именем в строке. Комментарий использованием не считается подробнее | |
code/unused-constant |
– | проект | Константа модуля нигде больше в проекте не упоминается: объявление осталось без дела подробнее | |
code/duplicate-method-body |
– | проект | Тело метода от пяти строк дословно повторяется в другом файле: сравнивается нормализованное тело, и правку придётся вносить в обе копии подробнее | |
yaml/missing-import |
✓ | проект | Ссылка из yaml на публичный элемент чужой подсистемы, пространства имён которого нет в секции Импорт: по короткому имени элемент не находится подробнее доки |
|
code/unused-import |
✓ | проект | Модуль импортирует подсистему или её пакет, а компилятор ни разу не ищет тип в этом пространстве имён подробнее доки | |
code/missing-import |
✓ | проект | Модуль называет публичный элемент чужой подсистемы, а строки импорта его пространства имён нет: компиляция проекта падает на этой строке подробнее доки | |
yaml/wrong-namespace |
✓ | проект | Квалифицированное имя своего проекта в значении yaml ведёт в пространство имён, где элемента с таким именем нет: компилятор отвечает “Неизвестный тип” подробнее доки | |
code/wrong-namespace |
✓ | проект | То же в модуле и запросе: имя своего проекта ведёт в пространство имён, где его элемента нет, и компилятор отвечает “Неизвестный тип” подробнее доки | |
code/package-resources-missing |
✓ | проект | ПакетРесурсов.Текущий() в модуле пакета или корня подсистемы, у которых нет своего каталога Ресурсы: ни один файл не находится, и ломается это только при выполнении подробнее доки |
|
code/resource-replace-absent |
– | проект | Замена строки, которой нет в тексте файла ресурса вне комментариев: замена ничего не меняет, метку переименовали в файле или в коде подробнее | |
code/resource-label-unfilled |
– | проект | Метка файла ресурса, которую полная цепочка замен оставляет на месте: вместо значения на страницу попадает сама метка подробнее | |
yaml/missing-subsystem-usage |
✓ | проект | Элементы и модули подсистемы импортируют другую подсистему, а в описании своей её нет в блоке Использование: применение проекта падает подробнее доки |
|
yaml/computed-binding-assigned |
✓ | проект | Каждый экземпляр компонента связывает свойство вычисляемым выражением, а компонент присваивает это свойство в своём модуле: на присваивании платформа падает подробнее | |
yaml/localization-missing-import |
✓ | проект | Неквалифицированная ссылка $Словарь.Ключ, чей словарь лежит в пространстве имён, которого нет в секции Импорт этого yaml: применение отвергает узел подробнее доки |
|
yaml/presentation-field |
✓ | файл | Поле представления объекта доки | |
yaml/unexpected-type-argument |
✓ | файл | Параметр типа у свойства, которое ui-схема объявляет без параметра: это уже другой тип, и применение сборки его отвергнет подробнее доки | |
yaml/property-since-compat |
✓ | проект | Свойство компонента новее, чем РежимСовместимости проекта (версию появления несет ui-схема) – применение отвергает его как неизвестное. Описание проекта без поддерживаемого режима правило, как и платформа, читает в новейшем режиме доки |
|
query/deletion-mark-immediate |
✓ | проект | Условие с пометкой удаления в запросе к объекту с РежимУдаления: Немедленно – поля пометки у него нет, запрос падает применением доки |
|
code/load-object-unwrap |
✓ | файл | Форс-разворот результата ЗагрузитьОбъект() у ссылки из поля записи или строки табличной части: запись могли удалить физически, и разворот роняет весь обход подробнее доки |
|
yaml/item-id-required |
✓ | файл | Элемент коллекции метаданных (реквизит, табличная часть, элемент перечисления, параметр ключа доступа) без Ид, который объявляет его класс – применение отвечает ID required |
|
code/unknown-row-field |
✓ | проект | Поле строки динамического списка (СтрокаДинамическогоСписка<Форма.Тип>), которого нет среди Поля списка доки |
|
code/row-field-null |
✓ | проект | Поле строки, которое может быть Null, уходит туда, где объявленный тип его не принимает: поле динамического списка через ссылку (Исполнитель.Номер) в типизированное поле структуры или колонка Запрос{...}, прочитанная через ссылку или из присоединённой таблицы внешнего соединения, в поле структуры, параметр, переменную или результат метода (тип с ? тоже не принимает Null). Компилятор отвечает Null cannot be assigned доки |
|
yaml/unknown-attribute-property |
✓ | файл | Ключ, которого класс самого реквизита не объявляет (Длина у обычного реквизита – её объявляет стандартный Код, а у числового есть ДлинаЦелойЧасти) – применение сборки отвергает объект |
|
yaml/empty-group-sized |
✓ | файл | Пустая Группа с Высота/Ширина (числом – всегда; биндингом =... – только без Имя) – рендер выбрасывает узел, зазора не будет |
|
yaml/insert-row-needs-align |
✓ | файл | Горизонтальная группа без ВыравниваниеСодержимогоПоВертикали равняет детей по базовой линии, а вставка КонтейнерHtml, кнопка и картинка эту линию ломают подробнее доки |
|
yaml/component-row-needs-align |
✓ | проект | Та же пара кнопки и картинки, когда соседа рисует компонент проекта: они встают на разную высоту подробнее доки | |
yaml/hint-too-long |
✓ | файл | Подсказка длиннее предела отрисовки – хвост не показывается вовсе |
|
yaml/popup-in-markup |
✓ | проект | ВсплывающийКомпонент размещён в yaml-разметке: содержимое рисуется прямо в строке формы ещё до открытия окна подробнее доки |
|
yaml/date-input-needs-plain-date |
✓ | файл | ПолеВвода<Дата?> – поле ввода даты, допускающей пустое значение, рендер молча не рисует; тип делается непустым, “не задано” – пустая дата доки |
|
yaml/binding-needs-auto |
✓ | проект | Биндинг свойства без пустого значения зовёт метод с nullable-возвратом – клиент регистрирует “Неожиданное значение” на каждом пересчёте; “не задано” – это значение Авто | |
yaml/double-quoted-binding |
✓ | файл | Привязка нестрокового свойства компонента в двойных кавычках: сервер такое значение отвергает, а голое значение или одинарные кавычки компилируются | |
code/client-available-needs-context |
✓ | проект | @ДоступноСКлиента у метода модуля компонента интерфейса, который не статический и без @Контекстный – тип компонента не синглтонный, применение отвергает модификатор доки |
|
code/client-available-unused |
– | проект | Метод объявлен @ДоступноСКлиента, но клиентского места, которое его называет, в проекте нет: аннотация открывает клиенту поверхность, которой никто не пользуется подробнее доки |
|
code/server-module-in-client-context |
✓ | проект | Обращение Модуль.Член(...) к общему модулю с Окружение: Сервер из метода, исполняемого на клиенте: на клиенте такого типа нет подробнее доки |
|
code/component-in-server-context |
✓ | проект | Обращение Компонент.Член(...) к компоненту интерфейса из кода, компилируемого для сервера: тип компонента живёт на клиенте подробнее доки |
|
yaml/delete-current-needs-immediate |
✓ | файл | ПриУдаленииОбъектаПоСсылке: УдалятьТекущий у реквизита элемента, который удаление только помечает: компиляция такую пару отвергает подробнее доки |
|
code/access-context-read-noop |
✓ | проект | Расширение контекста доступа правом Чтения для типа с Чтение: РазрешеноВсем: выдавать нечего, а вызов создаёт впечатление защищённости подробнее доки |
|
code/per-object-permissions-need-common |
✓ | проект | Объект вычисляет разрешения для каждого объекта, но в его модуле нет обработчика ВычислитьРазрешенияДоступа – общий расчет обязателен и при per-object, пусть и возвращает пустой массив. Только без списков обработчиков в данных: с ними тот же обработчик ошибкой называет code/mandatory-handler-missing доки |
|
code/permission-field-not-declared |
✓ | проект | В ВычислитьРазрешенияДоступаДляОбъектов читается поле, которого нет среди РасчетРазрешенийПо, либо объявленное поле берётся через Сущность вместо Запись доки |
|
code/permission-handlers-need-recalc |
✓ | проект | Модуль объявляет обработчик разрешений, а ПересчитатьРазрешенияДоступа этой сущности нигде не вызван: платформа обработчик сама не вызывает, и правка прав молча не действует подробнее доки |
|
code/access-key-handler-flavour |
✓ | проект | Вычисляемому ключу доступа нужен обработчик ПроверитьНаличиеКлючейДоступа в модуле менеджера; ключ с РучнаяВыдача: Истина не принимает этот обработчик доки |
|
code/permission-right-not-computable |
✓ | проект | Обработчик ВычислитьРазрешенияДоступа выдаёт право, не объявленное вычислимым в yaml сущности: сборка применяется, а пересчёт разрешений падает уже при работе подробнее доки |
|
yaml/placeholder-key-in-strings |
✓ | файл | Ключ с подстановкой $0 в секции Строки словаря ЛокализованныеСтроки: секция компилируется в метод без параметров подробнее доки |
|
yaml/localization-ref-to-template |
✓ | проект | Ссылка $Словарь.Ключ указывает на ключ секции Шаблоны: ссылка ищет ключ только в Строки, и применение падает подробнее доки |
|
code/compare-with-localized |
✓ | проект | Локализованное значение (Словарь.Ключ(), Представление()) сравнивается с литералом или со вторым локализованным – на другом языке ветка молча не срабатывает доки |
|
code/url-params-partial-encoding |
– | файл | Вызов метода Url СПараметрамиЗапроса: значение параметра кодируется частично, и значение-адрес приходит обрезанным по первому “&” подробнее доки |
|
code/url-data-scheme |
✓ | файл | Адрес data: литералом в конструкторе Url: конструктор разбирает его как путь, и картинка с таким адресом не рисуется подробнее доки |
|
code/bound-property-assign |
✓ | файл | Свойство, вычисляемое выражением в парной разметке, присваивается из кода: платформа такое присваивание отвергает подробнее | |
yaml/event-needs-importance |
✓ | файл | В описании СобытиеЖурналаСобытий не задана Важность: ее умолчание требует значение в каждом конструкторе, и пропуск роняет применение подробнее доки |
|
yaml/event-property-type |
✓ | файл | Тип свойства СобытиеЖурналаСобытий вне закрытого списка платформы: отказ приходит только серверной компиляцией и стоит деплоя подробнее доки |
|
code/collection-field-needs-req |
✓ | файл | Поле структуры имеет известный платформенный тип без значения по умолчанию и не имеет ни обз, ни допуска Неопределено, ни инициализатора подробнее доки |
|
code/var-needs-init |
✓ | проект | Переменная объявлена одним типом, у которого нет ни конструктора, ни значения по умолчанию (пер Ответ: ОтветHttp) подробнее доки |
|
code/unknown-tabular-member |
✓ | проект | Обращение к члену, которого у коллекции строк табличной части нет: коллекция это Массив<Сущность.Секция> подробнее |
|
code/global-unavailable |
✓ | проект | Вызов глобального имени вне его окружения: Сообщить в серверном модуле, вычисление выражения в клиентском методе без @НаСервере подробнее доки |
|
code/type-unavailable |
✓ | проект | Стандартный тип там, где его нет по документации: серверный Кодировки в клиентском методе и обратный случай доки |
|
code/constant-unavailable |
✓ | файл | Константа модуля в методе, который компилируется для окружения, где ее нет: константа модуля формы без аннотации живет на клиенте, и метод @НаСервере того же модуля ее не видит. Быстрое исправление дает константе недостающую сторону подробнее доки |
|
code/module-type-unavailable |
✓ | файл | Структура, исключение или перечисление модуля в методе, который компилируется для окружения, где этого типа нет: тип модуля формы без аннотации живет на клиенте, и метод @НаСервере того же модуля не может ни объявить, ни создать, ни поймать его, ни прочитать его элемент. Быстрое исправление дает типу недостающую сторону подробнее доки |
|
code/qualified-member-unavailable |
✓ | проект | Модуль.ИМЯ общего модуля обоих окружений, у которого константа, структура или перечисление есть только на одной стороне, в методе, который компилируется для другой подробнее доки |
|
style/shadow-project-name |
✓ | проект | Переменная, параметр или метод с именем элемента проекта: объявление закрывает обращение к элементу из этой области подробнее доки | |
style/shadow-own-property |
✓ | проект | Переменная знч, пер или исп с именем свойства объекта, с которым работает метод: имя разрешается в переменную, и ни чтение, ни присваивание до свойства не доходят подробнее доки |
|
style/redundant-union-member |
✓ | файл | Член составного типа, который уже покрыт другим: повтор, второе пустое значение или член под более широким соседом подробнее доки | |
code/unclosed-resource |
✓ | файл | Закрываемый ресурс, брошенный досрочным выходом из перебора: возврат или прервать в середине оставляет его открытым подробнее доки |
|
code/use-needs-closeable |
✓ | файл | Модификатор исп у типа, который описан каталогом и не наследует Закрываемое – модификатор существует ради автоматического Закрыть(), и компилятор отвергает объявление доки |
|
conventions/untranslated-visible-literal |
✓ | проект | Видимый текст остался кириллическим литералом там, где то же свойство проект уже вынес ссылкой на словарь локализации подробнее | |
conventions/untranslated-code-literal |
– | проект | Видимый текст остался кириллическим литералом в модуле: судится по стоку, куда он попадает подробнее | |
conventions/missing-translation |
– | проект | Токен проекта или кириллическая строка комментария, которых ещё нет в словаре перевода проекта подробнее | |
code/procedure-as-value |
✓ | проект | Результат доказанно разрешенной процедуры используется как значение подробнее | |
code/contract-parameter-name |
✓ | проект | Имя параметра реализации отличается от имени в контракте проекта подробнее | |
conventions/platform-translation-shadow |
✓ | проект | Объявление проекта блокирует платформенный перевод без явной пары в словаре подробнее | |
code/unknown-structure-field |
✓ | проект | Обращение к полю структуры, объявленной в проекте, сверяется с её объявлением: переименованное поле краснеет у потребителя, а не на серверной компиляции подробнее | |
code/redundant-skip-undefined |
✓ | файл | Исключение Неопределено из коллекции, у которой тип элемента его и так не допускает подробнее доки |
|
code/redundant-cast |
✓ | проект | Приведение к типу, который у операнда уже есть: IDE платформы о таком приведении предупреждает подробнее доки | |
code/cast-to-non-null |
✓ | проект | Приведение, которое только отбрасывает Неопределено: у операнда тип Т?, а приведение называет Т, и IDE платформы советует здесь настойчивую операцию подробнее доки |
|
code/redundant-undefined-guard |
✓ | файл | ??, ! или ?. над значением, в типе которого нет Неопределено: защита ничего не проверяет, а значение по умолчанию не используется подробнее доки |
|
code/redundant-type-check |
✓ | проект | Проверка Х это Тип, результат которой решает тип Х: проверка проходит всегда, а это не никогда подробнее доки |
|
comment/unknown-name |
– | проект | Имя в комментарии, которого нет ни в проекте, ни у платформы: метод переименован, объект заменён, опечатка подробнее | |
comment/doc-tag-target |
✓ | проект | Ссылка @см, записанная именем или цепочкой имен, которая никуда не ведет, и тип @выбрасывает, которого нет ни в проекте, ни у технологии; замечание называет, что выбрасывает тело метода подробнее доки |
|
code/deprecated-api |
✓ | проект | Вызов, который привязывается только к устаревшей форме метода платформы: IDE платформы о нём предупреждает подробнее доки | |
code/deprecated-project |
✓ | проект | Использование метода, свойства, конструктора, параметра или значения перечисления проекта, помеченного устаревшим: IDE платформы о нем предупреждает доки | |
code/contract-method-not-abstract |
✓ | проект | Неабстрактный метод, обычный или статический, в модуле контракта сущности – самого контракта, его объекта или строки: эти модули принимают только абстрактные методы, любой другой компилятор отвергает (“Non-abstract method … cannot be defined”) подробнее | |
code/client-pattern-unicode-class |
– | проект | Символьный класс p в литеральном клиентском Образец; включать после проверки отказа целевого клиента подробнее |
Подробнее о правилах тира D
yaml/auto-bare-value. Отказ yaml/hierarchy-bare-value не
особенность иерархии: свойство, чей тип – объединение Авто и строки, не читает голое Авто ни тем,
ни другим. Пробник на живом сервере получил “Не указан тип значения” у заголовка кнопки (свойство
компонента из схемы интерфейса) и у трех членов динамического списка – представления группы фильтра,
элемента фильтра и представления сортировки по возрастанию в настройках автоматического фильтра поля.
Правило обходит разметку с типами: тип узла дает его собственный Тип или тип члена, который
родитель объявляет для ключа (свойство компонента – из схемы интерфейса, прочие члены – из каталога
типов); источник списка берет первый тип-аргумент списка, а значение по умолчанию свойства – тип,
который свойство объявляет. Судится объединение ровно из Авто и Строка: Видимость: Авто у
объединения с булевым – то самое Авто, а ИспользуемаяИерархия остается своему правилу. Слово в
кавычках – текст, компонент проекта правило не типизирует. Исправления нет: что имел в виду автор,
значение по умолчанию или слово как текст, в файле не записано.
yaml/value-choice-title. Подпись кладут отдельной
Надписью рядом с переключателем. Узел без явного вида и узел с тип-аргументом Массив<...>, то
есть группу флажков, правило не судит.
code/unknown-static-member. Тип результата такого
вызова переносится на следующий шаг цепочки. Голое имя читается как тип, только если проект не
придаёт ему другого смысла. Парный yaml модуля учитывается и при проверке одиночного файла.
yaml/foreign-not-public. Ссылкой считается позиция
типа, цель навигации ТипФормы, корень цепочки биндинга =Модуль.Метод(), таблица списка
(динамического списка или настроек ввода ссылки поля) и квалифицированное имя
Подсистема[::Пакет]::Элемент. Квалифицированная запись судится по названной подсистеме или
пакету.
code/foreign-not-public. Судится записанная позиция
типа, корень цепочки Модуль.Метод() и таблица запроса: блока Запрос{...} или .xbql
виртуальной таблицы. Квалифицированная запись Подсистема[::Пакет]::Элемент входит сюда же. Ни
импорт, ни аннотация @ВПроекте на методе не помогают. Модуль проекта не принадлежит ни одной
подсистеме, поэтому всякий непубличный элемент для него чужой.
code/missing-return. Полный выбор по перечислению и
вызов метода с результатом никогда учитываются, а цикл возврата не гарантирует. Проверка проекта
читает перечисления и сигнатуры, а неустановленные случаи правило не угадывает.
code/unused-return-value. Тип приёмника отличает
неизменяемую операцию от изменяющего метода с тем же именем, а короткая лямбда оператором не
считается. Нужны свежие данные экстрактора. Автоматической правки нет.
code/ambiguous-type. Корень подсистемы не имеет приоритета
над пакетами, поэтому пространство указывают явно. Квалификаторы и объявления типов внутри файла
учитываются.
yaml/dynlist-row-editing. Событие объявлено для
узловых строк иерархии. У плоского списка по нажатию открывается автоформа объекта, поэтому
объекту дают свою форму объекта.
yaml/dynlist-joined-table-param. У основной
таблицы такая запись законна, у присоединённой компилятор о ней молчит. В yaml оставляют литерал,
а живое значение присваивают из кода: Источник.ПрисоединенныеТаблицы[i].Аргументы.
yaml/dynlist-filter-disabled. Это гонка первого
показа: платформа рисует список, не дожидаясь кода. Отбор объявляют включённым, с пустым
значением.
yaml/dynlist-filter-computed-alias. Поле
фильтра ищется среди столбцов основной и присоединенных таблиц, а не среди полей списка, хотя
сортировка псевдоним принимает. Путь столбца под другим именем не исключение: на живом сервере
фильтр по псевдониму поля Т.Артикул (АртикулТ) и пути Т.Группа.Наименование (ИмяГруппы)
уронил применение так же, как псевдоним вычисляемого поля, а тот же путь с псевдонимом по имени
существующего столбца применился: поиск нашел собственный столбец таблицы с этим именем. Столбец под
своим именем (Т.Артикул с псевдонимом Артикул) фильтр находит, и правило его не судит; не
судится и путь из двух частей с псевдонимом по последней части, когда у одной из таблиц нет
Псевдоним, – первой частью может быть эта таблица. Для пути столбца в фильтре называют сам путь
(Поле: Т.Артикул, Поле: Т.Группа.Наименование – оба применились). Для отбора по вычисленному
значению нужен ЭлементФильтраВыражение с выражением поля и привязкой Использовать; если нужен
столбец, его называют с псевдонимом таблицы.
yaml/list-form-needs-dynlist. Каркас формы списка
заточен под таблицу динамического списка, а в содержимом нет ни одного типа с
ДинамическийСписок. Таблице дают динамический список либо наследуют обычную форму (Тип: Форма).
yaml/ref-input-auto-commands. У ссылочного поля
Авто разворачивается во фрагмент командного интерфейса. Чаще всего кнопка и нужна, поэтому
правило информационное и выключено, а глушат его пустым фрагментом.
yaml/toggle-command-pair. ПереключаемаяКоманда
несёт представления и изображения обоих состояний, начальное Активна задают литералом, а
состоянием владеет платформа. Общий обработчик пары усиливает картину, но не требуется.
yaml/dynlist-column-sort-lost. Колонку
привязывают к полю либо добавляют поле-представление в сам список. Колонку с ОтключитьСортировку: Истина правило не судит: сортировки у неё нет по объявлению. По умолчанию выключено, потому что
из файла не видно, нужна ли этой колонке сортировка.
yaml/badge-column-image. Значение рисуется
тегами-пилюлями, а картинка задокументирована только для Вид: Картинка. Снимите Вид, и
картинка встанет рядом с текстом значения, либо задайте Вид: Картинка.
yaml/enum-needs-nullable. Судятся оба написания: поле
ввода узнаётся как Edit<...>, это английское написание платформы. InputField написанием не
является, его ловит yaml/unknown-type. Параметр записи или удаления остается правилу
yaml/union-needs-nullable: там пустое значение требуется от любого типа, даже от перечисления с
элементом по умолчанию, и то правило цитирует отказ этого раздела.
code/image-binding-server-call. Методы с
включённым или неизвестным кешем и клиентские варианты исключаются. Изображение передают вместе с
данными либо берут из уже загруженных клиентских данных.
code/query-needs-server. Клиентским считается модуль
формы и общий модуль, у которого Окружение захватывает клиент.
code/reserved-name. Правило судит поле структуры и параметр
метода. Написание с заглавной буквы подтверждено живым применением на сервере.
yaml/property-shadows-module. Применение отвечает
“Неизвестный метод”, и стенд откатывается. Лечение одно: переименовать свойство. Автоисправления
нет, за именем тянутся разметка, парный модуль и обращения снаружи. Судится только общий модуль,
достижимый по короткому имени: своя подсистема, её корень и пакеты, либо пространство имён,
импортированное в yaml компонента. Подсистема даёт модули корня этой подсистемы,
Подсистема::Пакет – модули пакета. Тёзка-справочник или тёзка-компонент это живая идиома.
yaml/col-width-needs-no-stretch. Судятся все
три вида колонок и ширина, заданная привязкой: во время работы она дает число. Колонка выходит
шире заданного, и содержимое уезжает от соседней. Пиксельной
ширине нужна РастягиватьПоГоризонтали: Ложь, доле с гарантированным минимумом –
МинимальнаяШирина. По умолчанию выключено: ширина-как-доля это законная техника, и статически
она от ловушки не отличается.
yaml/matrix-group-max-width. Максимум служит и
располагаемой шириной, поэтому автоматические колонки раскладываются по нему, а не по окну.
Правильный ответ Авто. По умолчанию выключено: страница только для десктопа живёт с максимумом
нормально.
yaml/card-literal-stretch-weight. Вес это
flex с нулевой базой, а в вертикальной колонке, то есть в мобильной раскладке, база относится к
высоте. Safari обрезает карточку скруглением. На телефоне вес снимают биндингом. По умолчанию
выключено: карточка, живущая только в широком ряду, носит вес законно.
code/unused-method. Имя в строковом литерале считается
употреблением: вставка HTML зовёт метод по имени, и такого вызова статически не видно. Комментарий не
считается нигде – ни в модуле, который объявляет метод, ни в парном yaml, ни в чужом элементе; когда имя
нашлось только в комментарии, находка так и говорит. Не судятся обработчик, который платформа зовет по
имени, в любом написании (списки обработчиков из данных и обработчики RLS), модуль объекта, модуль
в паре с HttpСервис и метод, аннотация которого называет вызывающего вне кода проекта (@Обработчик,
@Подписка, @Реализация и прочие) – такая аннотация и есть ответ для метода, который зовёт сама
платформа или контракт. Если вызов всё равно не виден – имя собирается во время работы, клиентская точка
входа оставлена намеренно, – заморозьте находку в списке принятых вместе с причиной (--write-baseline,
затем --baseline). Выключено по умолчанию: на части файлов метод, который зовут снаружи, выглядел бы
мёртвым.
code/unused-constant. Употреблением считаются слова кода,
yaml, строк и комментариев, а словарь перевода не считается. Глобальные константы и константы с
неизвестными аннотациями пропускаются. Правило включают при проверке всего проекта.
code/duplicate-method-body. Нормализация снимает
комментарии, пустые строки и отступы. Платформенный обработчик отделяется по аннотации
@Обработчик, а не по списку имён: одинаковое тело обработчика в каждом объекте нормально. Копии
внутри одного файла правило не судит. По умолчанию выключено: сводить ли две копии в один метод,
решает проектировщик.
yaml/missing-import. Ссылкой считается позиция типа, цель
навигации ТипФормы и корень цепочки биндинга =ЧужойМодуль.Метод(). Нужен Подсистема для
элемента в корне подсистемы и Подсистема::Пакет для элемента пакета: импорт подсистемы её
пакетов не даёт. Импорт в парном модуле разметку не покрывает. Корень биндинга судится после
вычета всего, что объясняет имя само по себе: объявлений этого yaml, парного модуля и неявных имён
платформы. Таблицы парного запроса виртуальной таблицы разрешаются через ту же секцию, и находка
ставится на неё: это .xbql и все элементы списков ИЗ, в том числе после условия соединения.
Квалифицированные и временные таблицы правило не судит. Так же разрешаются таблицы динамического
списка, то есть Таблица его ОсновнаяТаблица и каждой из ПрисоединенныеТаблицы, и
ПрисоединенныеТаблицы настроек ввода ссылки поля; находка ставится на значение таблицы, а
квалифицированная таблица импорта не требует.
code/unused-import. IDE платформы такие импорты показывает.
Считается то, что разрешает компилятор: записанный тип; имя, которое не локальное и не объявлено
модулем или парным yaml; корень цепочки Корень.член, даже если корень это свойство парного yaml;
квалифицированное имя; таблица запроса; значение перечисления в ветке когда; ключ Ресурс{...}
без пространства имён, если файл лежит только в этом пространстве. Считаются и типы, которые
приносят значения: свойства парного yaml, названные в коде, результаты методов и поля других
элементов по цепочке, поля этих структур и колонка запроса, передающая поле как есть. Сама строка
импорта, член после точки и локальная переменная с именем элемента употреблением не считаются,
поэтому импорт Подсистема рядом с импорт Подсистема::Пакет показывается, когда модуль
обращается только к пакету. Ссылка из парного yaml тоже не употребление: у yaml своя секция
импорта. Импорт собственного пространства модуля судится так же. Исправление снимает строку.
code/missing-import. Нужен импорт Подсистема для
элемента в корне подсистемы и импорт Подсистема::Пакет для элемента пакета: импорт подсистемы её
пакетов не даёт. Судятся записанные позиции типа (параметр, переменная, возврат, новый, как,
это, литерал Тип<...>, аргументы обобщённого), корень цепочки Модуль.Метод() и таблицы
блоков Запрос{...}, все элементы списка ИЗ. У корня сначала вычитается всё, что объясняет имя
само по себе: объявления метода и модуля, неявные имена платформы и секции парного yaml. Модуль
проекта не входит ни в одну подсистему, и импорт ему нужен для любого элемента, который он
называет, и в корне подсистемы, и в пакете.
yaml/wrong-namespace. Судится и полное имя
Поставщик::Проект::Подсистема[::Пакет]::Имя, и частичное Подсистема[::Пакет]::Имя, причём
проект объявляет этот элемент в другом месте. Обычная причина это перенос элемента между корнем
подсистемы и пакетом: сгенерированная форма списка хранит тип строки со старым местом. Читаются
все строковые значения элемента и описаний, кроме списков пространств имён (Импорт,
Использование) и ссылок на ресурсы. Имя другого проекта, тип, объявленный в модуле, и цепочка,
которая целиком называет пространство имён, не судятся. Частичное имя судится, когда первый
сегмент это подсистема проекта, которую не называет ни одна объявленная библиотека. Если элемент
лежит в одном месте, у находки есть автоисправление: пространство имён заменяется местом элемента.
Элемент в нескольких местах сообщается со списком мест и без исправления.
code/wrong-namespace. Имя бывает полным и частичным, а
стоять оно может в позиции типа, в вызове или таблицей запроса. О таблице компилятор отвечает, что
она не найдена. Строка импорта и ключ литерала Ресурс{...} не читаются. Автоисправление заменяет
пространство имён, если элемент лежит в одном месте.
code/resource-replace-absent. Выглядит
это как Ресурс{card.css}.ОткрытьПотокЧтения().ПрочитатьКакСтроку().Заменить("{{SIZE}}", Размер),
когда в файле нет {{SIZE}}. Правило ведёт текст одного файла ресурса по цепочке вызовов
Заменить: через локальные значения, обёртки над чтением (по пути, по пути внутри папки или по
параметру типа Ресурс), текстовые помощники и соответствия, которые заполняются по литеральному
списку путей, в том числе через параметры работы клиента. Каждый шаг применяется к файлу, у
которого стёрты комментарии. Сообщение говорит, если строка есть только в комментарии файла или её
уже заменил предыдущий шаг цепочки. Помощник, который служит нескольким файлам, за один из них не
отвечает. Вычисляемый путь, вычисляемая искомая строка и выбор между двумя файлами не судятся.
code/resource-label-unfilled. Метка – это слово
между разделителями, которые цепочка использует в своих строках: {{A}} и {{B}} дают {{ИМЯ}}.
Метка судится, когда цепочка полная, то есть дальше ничего не заменяет ни вызывающий метод, ни
вызываемый, ни переменная. Часть файла (Подстрока, обёртка, которая оставляет внутреннюю часть) и
значение, которое другая ветвь берёт из другого источника, не судятся. Находка стоит там, где текст
выходит из цепочки. Если та же цепочка заменяет строку, которой в файле нет, об этом говорят оба
сообщения: так выглядит переименованная метка.
code/package-resources-missing. Метод отдаёт
ресурсы только своего пространства имён, поэтому у пакета не находятся даже файлы его подсистемы,
а у корня файлы её пакетов. Ответ один: ИсключениеРесурсНеНайден, в том числе у ПолучитьВсе().
В пакете литерал Ресурс{...} файлы подсистемы находит. Каталог ищется на диске, а модуль проекта
правило не судит.
yaml/missing-subsystem-usage. Подсистема::Пакет
считается импортом этой подсистемы, а узнаётся всё только на деплое. Импорт даёт краткие имена, но
саму подсистему вместе с её пакетами разрешает Использование. Подсистема без описания не
судится: объявить использование ей негде. Замечание стоит на описании подсистемы, там же и правка.
yaml/computed-binding-assigned. Платформа
отвечает IllegalStateException. Именованный аргумент присваиванием не считается, а экземпляр из
кода, связь голым путём, литерал или экземпляр без связи делают присваивание законным: правило
срабатывает, только когда вычисляемым связан каждый экземпляр.
yaml/localization-missing-import. Нужен
Подсистема для словаря в корне подсистемы и Подсистема::Пакет для словаря пакета: импорт
подсистемы её пакетов не даёт. Применение отвергает узел как неимпортированное пространство имён.
Словарь своей подсистемы, в корне или в пакете, импорта не требует, импорт в парном модуле
разметку не покрывает, а квалифицированная форма $Подсистема::Словарь.Ключ работает без импорта.
yaml/unexpected-type-argument. Пример:
ДополнительныеКоманды формы принимают ФрагментКомандногоИнтерфейса, а не
ФрагментКомандногоИнтерфейса<ОбычнаяКоманда>. Английское дерево судится так же: ключ, компонент,
свойство и голова типа канонизируются, а аргумент сравнивается с умолчанием имя за именем в любом
написании.
code/load-object-unwrap. Пример записи:
Строка.Сервис!.ЗагрузитьОбъект()!. Физическое удаление даёт РежимУдаления: Немедленно и форма
удаления помеченных. Результат проверяют на Неопределено. Собственную .Ссылка строки запроса
правило не судит.
yaml/insert-row-needs-align. У вставки
КонтейнерHtml базовая линия своя, поэтому элемент со вставкой съезжает вниз: на живом ряду это
50 px. Отвечает ближайший горизонтальный предок, а ряд с уже выровненной внутренней полосой
молчит. У Кнопка базовая линия проходит по надписи, у Картинка по нижнему краю, поэтому кнопка
с надписью рядом с картинкой опускается на 19 px. Лечит ВыравниваниеСодержимогоПоВертикали: Центр. Биндинг Компоновка учитывается в статически горизонтальных ветках. Пара судится, когда
один из двух виден безусловно или оба видны при одних и тех же условиях. Соседей с разными
собственными условиями видимости и ребёнка со своим вертикальным выравниванием правило не судит.
yaml/component-row-needs-align. Компонент
показывает нативную Кнопка или Картинка безусловно либо выбирает между ними по своему
свойству: экземпляр задаёт свойство литералом, а условие сравнивает его прямо или через метод,
который только возвращает это сравнение. На живом ряду кнопка опустилась на 19 px. Ряду задают
ВыравниваниеСодержимогоПоВертикали: Центр. Видимость читается как в
yaml/insert-row-needs-align. Компонент, который статически не прочитать, в паре не участвует, а
ряд, который файловое правило судит само, остаётся за yaml/insert-row-needs-align.
yaml/popup-in-markup. Так же судится проектный компонент,
транзитивно наследующий ВсплывающийКомпонент. Свойства, ограничивающего отрисовку окном, у
платформы нет, а скрытие через Видимость ломает само окно. Окно собирают кодом на каждое
открытие: новый ВсплывающийКомпонент(...), затем ОткрытьВоВсплывающемОкне().
code/client-available-unused. Клиентским местом
считается модуль клиентского окружения, клиентский метод серверного модуля, yaml и строковый
литерал. По умолчанию выключено, как code/unused-method: клиентский вызов бывает не виден
статически.
code/server-module-in-client-context.
Клиентским местом здесь считается компонент интерфейса, команда и клиентский общий модуль.
code/component-in-server-context. Серверным
считается метод @НаСервере где угодно и метод без аннотации в серверном или клиент-серверном
модуле. Серверная компиляция отвечает “Переменная X не определена”.
yaml/delete-current-needs-immediate.
Пометка это РежимУдаления: ПометкаУдаления, и она же умолчание. Свойство есть не у каждого
вида: у регистра его нет, и файл регистра правило не судит. Строку Action УдалятьТекущий cannot apply to object with a "DeletionMark" говорит компилятор, в справке её нет.
code/access-context-read-noop. Читать такой тип
и так разрешено всем. Если право в списке одно, снимается вся строка, а если есть другие, то
только Чтение.
code/handler-overrides-nothing. Обработчики модуля компонента интерфейса перечисляет описание каждого компонента в поставке, и компонент наследует обработчики своих баз. У остальных модулей такого описания нет: их обработчики объявляет код компилятора, по классу-провайдеру на вид элемента, и экстрактор читает этот код до термов, из которых собраны имена. Так, модуль объекта справочника переопределяет ПередЗаписью, ПослеЗаписи, ПередУдалением, ПослеУдаления, ПриЗаполнении, ПриСозданииКопии и – по одному на каждый тип, который описание перечисляет в СозданиеНаОсновании, – ПриСозданииНаОсновании, набор записей регистра – ПередЗаписью и ПослеЗаписи, модуль запланированного задания – Обработчик, модуль ключа доступа – ПроверитьНаличиеКлючейДоступа, а модуль самого элемента с настройками доступа (справочника, документа, регистра, HTTP-сервиса и других) – ВычислитьРазрешенияДоступа. Модуль сопоставляется элементу по имени файла: Склады.yaml составляет пару со Склады.xbsl (модуль самого элемента) и со Склады.Объект.xbsl, Склады.НаборЗаписей.xbsl, Склады.Запись.xbsl. Некоторые модули берут имена обработчиков из описания самого элемента при сборке проекта: операции обработки, операции клиента SOAP из его WSDL. Обработчиком там может быть любое имя, и такой модуль не судится. Модуль самой сущности тоже берет так одно имя – обработчик RLS, но судится. Какие обработчики RLS он объявляет, говорит вид (ВычислитьРазрешенияДоступаДляОбъектов у справочника, ВычислитьКлючиДоступаДляЧтения и ВычислитьКлючиДоступаДляИзменения у регистра накопления и периодического регистра сведений), а какие из них и ВычислитьРазрешенияДоступа сборка использует, говорят настройки доступа (КонтрольДоступа): ВычислитьРазрешенияДоступа – когда какое-то разрешение РазрешенияВычисляются или РазрешенияВычисляютсяДляКаждогоОбъекта, обработчик RLS – когда какое-то РазрешенияВычисляютсяДляКаждогоОбъекта, и ни один – при стандартных разрешениях хранилища настроек. Обработчик, который элемент объявляет, а настройки не включают, сборка отвергает своим сообщением – Handler "X" is not used in this project item, и находка его цитирует. Модуль HTTP-сервиса, SOAP-сервиса и обработки объявляет один ВычислитьРазрешенияДоступа и судится по тем же настройкам КонтрольДоступа; в режиме ниже того, в котором у обработки появились настройки доступа, сборка их не читает, и обработчик не судится. Справочник, документ, план обмена или интегрируемое приложение, описание которого не перечисляет ни одного типа в СозданиеНаОсновании, ПриСозданииНаОсновании не объявляет, и находка называет это свойство. Модуль, для которого компилятор не объявляет ничего, – общий модуль, журнал данных, фрагмент командного интерфейса, глобальное клиентское событие – тоже судится: там отвергается любое имя. Файл модуля у локализованных строк не судится: сборка его вовсе не компилирует, и проба на сервере ничего написанного в нем не заметила. Модуль проекта (Проект.xbsl рядом с описанием проекта) переопределяет ВычислитьСистемныеРазрешенияДоступа в приложении и ничего – в библиотеке и расширении (ВидПроекта). Вид, которого нет в данных, не судится, а без списков правило молчит.
code/mandatory-handler-missing. Провайдеры обработчиков компилятора помечают часть обработчиков обязательными (required), и модуль, который такой обработчик не объявляет, сборка отвергает с Mandatory handler "X" is not defined – на первой строке модуля, а если модуля у элемента нет совсем, на первой строке описания. Экстрактор сохраняет эту пометку в данных, и проба на сервере дала такой ответ для каждого источника, который читает правило. Обязательны везде, где объявлены: Обработчик обычной команды и команды с компонентом (у переключаемой команды он не обязателен), Обработчик запланированного задания, ВычислитьПараметрыРаботыКлиента, ПослеПодключения параметра самостоятельной регистрации и ВычислитьРазрешенияДоступа права на действие. ПриСозданииНаОсновании модуля объекта обязателен на каждый тип из СозданиеНаОсновании: модуль, где перегрузок меньше, чем типов в списке, сборка тоже отвергает, а перегрузки считаются, только пока ни одна из них не принимает объединение типов. Обработчики доступа обязательны ровно тогда, когда их используют настройки доступа, – провайдер контроля доступа строит каждый с одним значением для enabled и required: ВычислитьРазрешенияДоступа – когда какое-то право вычисляется, обработчик RLS – когда какое-то вычисляется для каждого объекта. Обработчик, построенный с requiredHandlers, требует пару: модуль, который объявляет ВычислитьВнешнююНавигационнуюСсылку, обязан объявить и ВычислитьСсылкуПоВнешнейНавигационнойСсылке, и наоборот. На метод с именем обязательного обработчика без аннотации @Обработчик сборка отвечает иначе – Handler method "X" is not marked with annotation @Обработчик: находка цитирует этот ответ, а исправление ставит аннотацию. Ключ доступа не судится: ключ с ручной выдачей (РучнаяВыдача) в новых режимах обработчика не объявляет. Не судятся и модуль с синтаксической ошибкой, и модуль, который есть на диске, но не попал в проверку, и настройки, которые не читаются, а без списков в данных правило молчит.
code/permission-handlers-need-recalc.
Обработчики это ВычислитьРазрешенияДоступа и родня. Пересчёт с получателем не-сущностью,
документированный цикл, глушит правило. Виды без метода пересчёта, то есть право-элементы, не
судятся.
code/permission-right-not-computable.
Судится и ...ДляОбъектов. Вычислимость объявляют РазрешенияВычисляются и
РазрешенияВычисляютсяДляКаждогоОбъекта, явно или через ПоУмолчанию. Пересчёт отвечает, что
право не указано как вычислимое. Права собираются только из конструкторов новый РазрешениеДоступа(...) в обоих пространствах, Сущность.Право.* и HttpСервисПраво.*,
транзитивно по вызовам проекта: делегирование в общий модуль прав видно, а находка привязывается к
сущности. КонтекстДоступа.Дополнить не считается, недовыдача законна, виды без контроля доступа
не судятся.
yaml/placeholder-key-in-strings. Вызов с
аргументом падает на применении с ответом “Неизвестный метод”.
yaml/localization-ref-to-template.
Применение отвечает “Не удалось найти локализованную строку”, и стенд откатывается. Ключ шаблонов,
на который никто не ссылается, правило не судит: из кода его зовут законно.
code/url-params-partial-encoding. Знаки “&” и
“=” внутри значения остаются разделителями. Строку собирают самим объектом параметров и клеят к
базовому адресу. По умолчанию выключено: видны ли “&” в значениях, статически не решается.
code/url-data-scheme. Конструктор вставляет слэш
после схемы и кодирует “;” и “,” как символы пути, браузер отвечает на такой адрес
ERR_INVALID_URL, а строку свойство Изображение не принимает. Картинку отдают адресом
HTTP-сервиса проекта или ресурсом. Адрес data в переменной правило не прослеживает.
code/bound-property-assign. Выглядит это так:
Высота: =Общее.ЭтоУзкийЭкран()?820:528. В попытка/поймать отказ не виден. Связь с данными, то
есть голый путь, правило не трогает: она двунаправленная по устройству.
yaml/event-needs-importance. Умолчание это
ИзКонструктора. Пропуск хотя бы в одном месте записи роняет применение на строке конструктора.
Явное Важность: ИзКонструктора объявляет выбор и снимает предупреждение.
yaml/event-property-type. Перечисление проекта туда
положить нельзя. Список берётся из метамодели (EventLogEventProperty.Тип), а ? и квалификация
Стд:: терпятся. Вариантные значения пишут строковыми кодами, а перечень допустимых кодов кладут
в Описание свойства.
code/collection-field-needs-req. Так выглядят
ПозицияВТексте и ЧитаемыйМассив<Строка>. Скалярные значения по умолчанию, неизвестные типы и
локальные тёзки платформенных типов замечаний не вызывают.
code/var-needs-init. Компиляция отвечает “не имеет
конструктора и значения по умолчанию”. Перечисление, аннотация, одиночка и имя, перекрытое типом
проекта, пропускаются.
code/unknown-tabular-member. Судится
Объект.Секция.Член в модуле формы объекта, голое имя секции и этот.Секция в модулях сущности.
Привычное из другой платформы Количество() здесь зовётся Размер(). Секцию затеняет одноимённый
модуль, а реквизиты правило не судит.
code/global-unavailable. Применение отвечает “Метод
недоступен в текущем окружении”. Сообщить живёт только на клиенте, вычисление выражения только
на сервере. @НаКлиенте и @НаСервере переопределяют окружение модуля, а доступность имён
берётся из строк “Доступность” пакетов глобального контекста.
code/constant-unavailable. Константа существует
в окружении, которое называют ее аннотации, а без них – в окружении своего модуля, и метод
компилируется для окружений своих аннотаций или модуля. Применение отвечает
Variable "X" is not defined с меткой той стороны, где константы нет. Один проект-пробник
проверил все сочетания в форме, команде и общем модуле обоих окружений: метод @НаСервере
(один, с @ДоступноСКлиента или с @Контекстный), метод с обеими аннотациями и метод без
аннотаций в модуле обоих окружений получили отказ на голом имени, на имени внутри лямбды
и на короткой интерполяции %ИМЯ, а зеркальный случай – константа @НаСервере в
клиентском методе – тоже. Окружение модуля берется из yaml рядом с ним, поэтому правило
остается файловым. Общий модуль только клиентского окружения не проверяется: @НаСервере
он отвергает сам. Быстрое исправление ни одну сторону не отнимает: константа клиентского
модуля без аннотации получает @НаСервере @НаКлиенте, с аннотацией – недостающую рядом со
своей, и исправленный так пробник скомпилировался.
code/module-type-unavailable. Структура,
исключение или перечисление модуля существует там же, где существовала бы константа: в
окружении, которое называют его аннотации, а без них – в окружении модуля. Метод, который
компилируется для другой стороны, получает Type "X" is unavailable in the current environment
везде, где называет этот тип, – в переменной, параметре и результате, конструкторе,
выбросить, ветке поймать, проверке типа, аргументе обобщенного типа, лямбде, – а на
элементе перечисления, прочитанном как значение, в коде или внутри %{...}, –
Variable "X" is not defined. Проекты-пробники проверили это в форме, команде и общем модуле
обоих окружений, зеркальный случай тоже. Быстрое исправление добавляет недостающую аннотацию,
и исправленный так проект скомпилировался. Его нет, если поле типа не существовало бы на другой
стороне – клиентский тип вроде Компонент, тип проекта, вызов в начальном значении: структуру,
расширенную так, компилятор отверг на этом поле.
code/qualified-member-unavailable.
Другой модуль обращается к константе, структуре или перечислению общего модуля по полному
имени. В общем модуле обоих окружений объявление с аннотацией одной стороны существует только на
ней, и метод, который компилируется для другой, получает отказ: Unknown property "Модуль.ИМЯ" для константы или элемента перечисления, прочитанного как значение, и
Type "Модуль.Имя" is unavailable in the current environment в позиции типа. Пробник проверил
это для серверного общего модуля, HTTP-сервиса, формы, команды, самого объявляющего модуля и
интерполяции %{Модуль.ИМЯ}. Объявление без аннотации видимости вне своего модуля падает
сначала на видимости, и правило его не трогает.
style/shadow-project-name. Пример: знч Склады при
справочнике Склады. Платформенные имена параметров обработчиков с именами проекта не
пересекаются.
style/shadow-own-property. IDE платформы о такой
переменной предупреждает. Свойства берутся у владельца метода. У компонента это объявленные
свойства и события, свойства типа платформы, от которого он наследует, и Компоненты. В модуле
объекта справочника, документа и обработки это реквизиты, табличные части, ссылка, метка версии и
пометка удаления. У набора записей это фильтр, у запланированного задания параметры и свойства
задания, у структуры поля. Статические методы, параметры, переменные цикла и поймать не судятся,
а серверный метод компонента видит только свойства с признаком Контекстное.
style/redundant-union-member. Так выглядят
Строка|Строка, Строка|Неопределено|? и Массив<Строка>|ЧитаемыйМассив<Строка>, то есть член
под Объект или под базовым типом каталога с теми же аргументами. IDE платформы об этом
предупреждает, а функциональный тип не судится. Исправление записывает объединение без таких
членов.
При наличии свежих данных обобщенных типов контракт с ковариантным параметром покрывает более
широкие аргументы, и контракт для чтения, и изменяемый (ИзменяемыйМассив<Объект> покрывает
Массив<Строка>), а вложенные формулы баз подставляются. Конкретные Массив, Соответствие,
Множество и Коллекция сохраняют параметры инвариантными; без новых данных сохраняется
сравнение точных аргументов.
code/unclosed-resource. Выглядит это как знч Выборка = Запрос{...}.Выполнить(). Полный проход платформа закрывает сама, а незакрытый ресурс пишет в
журнал событий. Объявление через исп закрывает ресурс на любом пути выхода. Ресурс, пришедший
параметром, закрытый вручную и возвращённый вызывающему, оставлены автору.
conventions/untranslated-visible-literal.
Намерение считается в разрезе вида элемента, поэтому свойство-тёзка другого вида не судится. На
проекте, у которого в дескрипторе меньше двух языков локализации, правило молчит.
conventions/untranslated-code-literal.
Стоком считается аргумент платформенного вызова сообщения, свойство события журнала или то же
самое через метод, пробрасывающий свой параметр. Разметка, чистая интерполяция и одиночные слова
пропускаются. На проекте с менее чем двумя языками локализации правило молчит.
conventions/missing-translation. Находка одна,
на первое вхождение в файле. Правило молчит, пока рядом с проектом или выше не лежит словарь
xbsl-translation (см. xbsl translate).
code/unknown-structure-field. Тип берётся из
объявления переменной (Модуль.Структура, голое имя структуры своего модуля), из конструктора
новый и из элемента коллекции в для X из Список. Имя, объявленное в методе ещё чем-нибудь,
тёзка stdlib-типа, второй шаг цепочки и латинские написания члена не судятся.
code/redundant-skip-undefined. У перебираемой
коллекции исправление заменяет метод на ВМассив(), сохраняя создание массива. Последовательности
достаётся только предупреждение.
code/redundant-cast. Так выглядит Найдена!.Ссылка как Товары.Ссылка над запросом, читающим ссылку того же справочника, и объединение ссылок,
приведённое к контракту сущности, который реализуют оба. Если типы совпадают, исправление убирает
приведение вместе со скобками вокруг одиночного операнда. Приведение к более широкому типу
называется без исправления: этот тип может быть нужен объявлению или перегрузке.
code/cast-to-non-null. Обычно это реквизит с ?,
прочитанный запросом, результат Соответствие.ПолучитьИлиНеопределено(...) или метода с
результатом Т?. Исправление ставит ! вместо приведения. Тип операнда берётся по объявлениям, у
колонки запроса по списку выборки и yaml таблицы. Условие, проверенное перед приведением, тип не
сужает, а операнд, который вывод не называет, не судится.
code/redundant-undefined-guard. IDE платформы о
ней предупреждает. Тип берётся из объявления, из компонента парной разметки вроде
ПолеВвода<Число> или из аргумента обобщённого типа, как у
СобытиеПриИзменении<Строка>.НовоеЗначение. Исправление убирает !, а ?? ... убирает, если
умолчание не расширяет тип.
code/redundant-type-check. Каждый тип выражения
совпадает с одним из проверяемых или относится к нему: это база из каталога (Массив<Строка>
подходит под ЧитаемыйМассив<Строка>) и контракт сущности, который реализует элемент проекта. IDE
платформы о такой проверке предупреждает. Колонка строки запроса типизируется по списку ВЫБРАТЬ
так же, как у правил приведений: поле, выбор, арифметика, количество. Поле через ссылку и поле
левого соединения могут быть Null, а .ЗаменитьNull(...) этот Null убирает.
comment/unknown-name. Падежная форма известного имени,
закомментированный код и цепочка другой системы не судятся. Не судится и имя, рядом с которым,
в пределах двух слов, названа другая система: 1С:Предприятие, БСП, БТС или система, которую
проект объявил ключом --other-system. Сообщение подсказывает, как назвать систему, если ее
имени рядом нет.
code/deprecated-api. Так выглядят
ОбъектноеХранилище.ЗагрузитьИзБайт(...) и ОбъектноеХранилище.Загрузить(Поток, Размер) рядом с
текущей Загрузить("файл", Байты). Перегрузки выбираются по режиму совместимости проекта, по
аргументам и по их известным типам. Описание проекта без поддерживаемого режима правило, как и
платформа, читает в новейшем режиме. Сообщение называет замену, если ее называет документация.
code/contract-method-not-abstract. Контракт сущности порождает тип
контракта, тип объекта <Контракт>.Объект и тип строки для каждой своей табличной части, и у
каждого может быть модуль: <Контракт>.xbsl, <Контракт>.Объект.xbsl и
<Контракт>.<ТабличнаяЧасть>.xbsl. Пробники скомпилировали в каждом обычный метод и получили
“Non-abstract method … cannot be defined”, так же – статический метод во всех трех и обработчик с
телом в модуле объекта; абстрактный метод без тела проходит. Статический метод правило советует
вынести из модуля. Модуль связывается с yaml своего контракта по файлам проверки, модуль строки –
по табличной части, которую объявляет yaml. Если yaml не разбирается, модули контракта правило не
трогает.
Подробнее о группах
Запросы: В с подзапросом по составному типу (правило query/in-subquery-composite)
Стандарт платформы “Использование выражения В с подзапросом для выражений составного типа”:
на большинстве СУБД такой вариант реализован неэффективно, и условие пишется через СУЩЕСТВУЕТ.
Правило – предупреждение, стандарт обязателен:
ГДЕ Т.Значение В (ВЫБРАТЬ Ф.Значение ИЗ Фильтры КАК Ф) // предупреждение
ГДЕ СУЩЕСТВУЕТ (ВЫБРАТЬ 1 ИЗ Фильтры КАК Ф ГДЕ Ф.Значение = Т.Значение) // так
Составным считается тип поля с двумя и более альтернативами в yaml (Строка|Число|?): ? – не
тип, а допустимость Неопределено, и Массив<Строка|Число> тоже не составной. Под сомнение
ставится только поле, тип которого известен наверняка: Алиас.Поле или Таблица.Поле, где алиас
однозначен в пределах блока, а поле нашлось в yaml таблицы; список значений (В (1, 2, &Коды))
стандарта не касается. Правило понимает и английские формы (IN, NOT, SELECT).
Свойства проекта (правила project/)
Четыре правила по стандарту “Заполнение свойств проекта”: Поставщик и Имя – идентификаторы,
образованные от представлений (каждое слово с прописной буквы: КабинетСотрудника,
НовыеЭлементарныеТехнологии); Представление и ПредставлениеПоставщика заполнены – это
официальное название проекта и название компании-разработчика; Версия – три числа A.B.C
(семантическое версионирование), а не 1.0.
Имена элементов проекта (правила naming/)
Двенадцать правил по стандарту платформы “Имена элементов проекта” – он обязателен в новом коде,
поэтому все они предупреждения. Проверяются описания (.yaml): имя самого элемента и имена его
реквизитов, измерений, ресурсов, табличных частей и значений перечисления.
Число имени сверяется с видом элемента: справочники, документы, регистры и табличные части
именуются во множественном числе, перечисления и структуры – в единственном (naming/number).
Для русского имени это разбор морфологический, а не по окончаниям: Номенклатура единственного
числа стандарту не противоречит, а Задачи и Партии без падежа читаются как родительный падеж
единственного. Нужен набор [morph] (pip install "xbsl[morph]"), без него русские имена молчат.
Английское имя в переведённом дереве судится по последнему слову, суффиксной эвристикой с
перечнем неправильных множественных, и отдельный набор ему не нужен. Несчисляемые слова и
неоднозначные хвосты остаются нерешёнными.
Остальное: буква ё и подчёркивания в именах, аббревиатура одним словом (Ндс, а не НДС),
англоязычный термин оригиналом (Xml, а не Хмл), Вид вместо Тип у перечислений, вид
элемента внутри его имени (ОтчетЗависшиеЗадачи), слова-пустышки (Управление, Менеджер),
постфикс окружения у общего модуля (ОбменДаннымиКлиентИСервер – окружение задаётся свойством),
булев реквизит через отрицание (НетОшибок вместо Успешно), незаполненное Представление и
обязательные префиксы отдельных видов (КлючДоступа, ПравоНа, Навигация). У справочника,
документа и других видов, где Представление верхнего уровня называет реквизит, заголовки
задаются в разделе интерфейса, и нужны оба: Интерфейс.Список.Представление для списка и
Интерфейс.Объект.Представление для объекта. У регистра сведений Представление верхнего уровня
нет, и заголовки нужны списку и записи (Интерфейс.Запись.Представление), у регистра накопления и
журнала данных – только списку. Набор констант в Представление верхнего уровня называет
константу, а заголовок у него – заголовок записи, у периодического набора еще и списка. У
устаревшего элемента представление и каждый заголовок начинаются с пометки на языке проекта:
(не используется), если ключи описаний русские, и (not used), если английские, как в
переведенном дереве. Пометка другого языка не засчитывается. Устаревшим считается элемент, имя
которого начинается с префикса стандарта Устарело или Deprecated перед следующим словом имени,
а переведенное дерево сохраняет префикс в английском имени, что бы ни написала пара словаря.
Соглашения по написанию кода (правила style/)
Тридцать два правила по документации платформы (“Соглашения по написанию кода”, “Идиомы
языка”) и стандарту разработки “Имена переменных и констант”: оформление и переносы
выражений, именование, описание типов и сигнатуры, литералы коллекций, интерполяция строк,
проверки булевых значений и Неопределено.
Из стандарта имён переменных и констант проверяется доказуемая по токенам часть: абстрактные
имена, однобуквенные имена вне лямбд, кириллические и латинские аббревиатуры не одним словом,
булевы имена от отрицания, тип-контейнер в имени, числительные в именах констант и тень имён
элементов проекта. Остаются на авторе и ревью: избыточные слова в имени, сокращения за
пределами регистра аббревиатур, числа вместо уточнения при осмысленной основе (Этап1 против
Данные1 различаются только смыслом) и абстрактность имени константы за пределами
числительных (роль НАЧАЛЬНЫЙ_ЭТАП против значения ЭТАП_ПРИЕМА_АНКЕТА токенам не видна).
Пять правил группы выходят за пределы токенов: они читают разобранный модуль и повторяют
предупреждения IDE платформы. style/constructor-literal находит конструктор, который заменяется
литералом типа, style/boolean-ternary – тернарный оператор с ветвями Истина и Ложь,
style/redundant-scope – область, которая единственная инструкция своего блока, а
style/redundant-union-member – член составного типа, который покрывает другой. style/shadow-own-property читает ещё парный yaml и каталог типов платформы,
поэтому переменная с именем свойства, которое компонент наследует, например Заголовок у Группа,
находится так же, как переменная с именем объявленного свойства.
Все тридцать два правила включены по умолчанию (warning): чистый код им уже соответствует, и
они защищают от регресса. Флаги выбора правил принимают группу целиком:
xbsl путь/к/исходникам --select style # только эти правила
xbsl путь/к/исходникам --ignore style # всё, кроме них
Блоки Запрос{ ... } (отдельный DSL) и строковые литералы (HTML/CSS/SVG вставок) из этих проверок
исключены. Не проверяются и остаются на авторе с ревью: кратность отступа четырём, идиомы
коллекций, Строки.Соединить() при массовой конкатенации, идиомы ?. / ?? и выбор вместо
цепочки иначе если.
Семантика кода (правила code/)
Самая большая группа – девяносто восемь правил, шестьдесят из них ошибки. Это то, что компилятор
отвергнет или что платформа выполнит не так, как читается: неизвестное имя или член типа, число
аргументов вызова, окружение (клиентский код в серверном методе и наоборот), обращение к
экземпляру через тип, неперехваченное не-исключение, незакрытый ресурс, обход по коллекции при
её изменении, а также обходы платформенных ловушек, у которых нет иного признака, кроме формы
кода. Сюда же входят предупреждения IDE платформы: неиспользуемая переменная или импорт, лишнее
приведение, защита от Неопределено или проверка это, исход которых уже решили типы. Часть
правил проектные (--stdin их не гоняет): им нужны парный yaml и имена объектов.
Описания элементов (правила yaml/)
Шестьдесят четыре правила по описаниям (.yaml): обязательные и уникальные Ид, известные ключи
и типы, ссылки на компоненты, обработчики и локализованные строки, требования платформы к типам
полей (ссылка и перечисление допускают пустое значение), настройки динамических списков и форм,
а также ловушки вёрстки, которые применяются без ошибки, но рисуются не так, как задумано.
Шесть правил – info и выключены: они говорят “так работает платформа”, а не “здесь ошибка”.
Соглашения проекта (правила conventions/)
Правила о том, о чём договорился проект, а не о том, чего требует платформа. В базовом наборе
живёт семья двуязычного проекта: conventions/untranslated-visible-literal (включено по
умолчанию) сообщает про видимый текст, оставшийся кириллическим литералом там, где то же
свойство проект уже ведёт через словарь локализации, а conventions/untranslated-code-literal
и conventions/missing-translation (оба выключены) расширяют это на литералы модулей и словарь
перевода – обязана ли каждая читаемая человеком строка приходить из словаря, каждый проект
решает сам, и базовый набор этого не навязывает.
Группа заодно и точка расширения: надстройка проекта регистрирует под conventions/ свои
правила-соглашения (запрет номеров задач в комментариях, внутренних отсылок и подобное) и сама
решает их severity и включённость – см. Расширение.
Что работает на самом деле, показывает xbsl --list-rules; таблица выше описывает только базовый
набор.
Мелкие группы
typography/– типографские символы в прозе и комментариях: длинное тире, символ многоточия, кудрявые кавычки, ёлочки в комментариях, знак не с клавиатуры (стрелка, знак сравнения) и – для проекта, который пишет в комментариях кода дефис, – среднее тире в комментарии; а также буква “ё” в тексте, который читает пользователь. Группа читает и файлы ресурсов проекта (.css,.js,.svg,.html);comment/– слог комментария: частица “бы”, первое лицо, служебное слово прописными ради ударения и условие через тире;comment/unknown-nameсверяет с проектом имена, которые называет комментарий;comment/doc-markerи правилаcomment/doc-tag-*сверяют документирующий комментарий объявления с тем, что покажет среда разработки. Группа читает комментарии модулей, описаний элементов и файлов ресурсов (правило имён – модулей и описаний элементов), а первое лицо и капс ударения – и в английских строках словаря перевода; по умолчанию группа выключена, кроме правилcomment/doc-tag-*; проект, у которого комментарии безличны, включает ее ключом--enable comment;translation/– английский текст словаря перевода:translation/english-shapeчитает значения файловxbsl-translation, текст которыхxbsl translate --strictне судит;whitespace/– хвостовые пробелы и смешанные переводы строк;encoding/– файл не в UTF-8;structure/– парностьИмя.yamlиИмя.xbsl;security/– секрет в исходниках (токен, пароль, ключ);form/– обработчик формы, которого нет в модуле, и обработчик, сигнатура которого противоречит событию компонента (проектные правила);query/– запросы: неизвестная таблица,ЕСТЬNULL, именованный параметр, немедленная пометка удаления и стандарт проВс подзапросом (разобран выше).
Включение и выключение
--select и --ignore принимают идентификатор правила, группу (часть до /, напр. style)
или букву тира A/B/C/D. Плагин может переопределить severity правила (группа
entry-points xbsl.severity); XBSL_NO_PLUGINS=1 отключает плагины и возвращает встроенные
значения из этой таблицы.
Проверяет вызовы методов проекта в выражениях, в том числе из другого модуля. Неизвестные цели, неоднозначные перегрузки и самостоятельные вызовы процедур пропускает. Автоматического исправления нет.
Сравнивает имена только для однозначного контракта сервиса проекта и согласованных сигнатур. В режиме совместимости от 8.0 сообщает об ошибке, в более раннем режиме предупреждает. Описание проекта без поддерживаемого режима (режим не указан, значение не называет режим, режим ниже самого старого поддерживаемого) правило, как и платформа, читает в новейшем режиме; без описания проекта в проверке не судит. Автоматического исправления нет.
conventions/platform-translation-shadow.
Работает только в проектах со словарем перевода. Называет кириллическое объявление, которое переводчик считает проектным именем, если оно подавляет известный перевод платформы и не имеет подходящей явной пары tokens. Локальные переменные и параметры пропускает. Добавьте пару в словарь; переименование необязательно и автоматически не выполняется. Объявления ASCII не входят в этот набор переводчика, поэтому в полностью переведенном английском дереве находок этого правила нет.
code/client-pattern-unicode-class. Правило выключено по умолчанию. Включайте его через --select code/client-pattern-unicode-class или конфигурацию правил только после проверки, что ваш целевой клиент отвергает символьный класс \p. Версия данных языка не определяет возможности клиентского движка. Проверяется только литеральный первый аргумент новый Образец(...)/new Pattern(...) в модуле с доказанным клиентским окружением, включая клиентскую часть общего модуля. Методы с @НаСервере/@OnServer, динамические и интерполированные шаблоны, строки другого назначения и экранированный текст пропускаются. Класс \P и другие классы не проверяются. Исправление не предлагается автоматически: замена Unicode-класса на ASCII меняет принимаемый набор символов. Проверяйте выбранную замену в собственном клиенте; успешная серверная компиляция не подтверждает клиентское выполнение.