Smart1Spec Документация
Studio
СправочникИзучающий Spec1C

Грамматика

Грамматика поддерживаемого языка Spec1C в нотации EBNF и правила, которые грамматика не передаёт.

Перед чтением

На этой странице

Грамматика описывает тексты, которые принимает разбор Studio. Ссылка «Синтаксис» в заголовке этапа Spec1C открывает эту страницу.

Назначение#

Здесь собраны все поддерживаемые конструкции в одном формальном описании. Грамматика описывает только то, что реально обрабатывает текущая версия Studio. Конструкции, которых в ней нет, разбор пропускает — даже если редактор их подсвечивает (см. Неподдерживаемые конструкции).

Разбор в Studio не строит полное дерево текста: он ищет каждую конструкцию по образцу. Поэтому грамматика ниже — точное описание того, какие строки будут распознаны, а не того, какой текст будет отвергнут. Нераспознанный текст не вызывает ошибки.

Обозначения#

ЗаписьСмысл
"report"слово или знак, как написано
A BA, затем B
A | BA или B
[ A ]A необязательно
{ A }A ноль или более раз
EOLконец строки — конструкция должна занимать строку целиком
(* … *)пояснение

Грамматика#

EBNF
File          = "spec1c" "{" Script "}" | Script ;
Script        = { Item } ;                          (* порядок свободный *)
Item          = Report | Title | Target | Section
              | Params | Data | PeriodField
              | Show | IncludeList | Balance | Turnovers
              | Layout | Format | View ;

Report        = "report" ReportId ;
Title         = "title" ":" String ;
Target        = "target" ":" ( "ordinary" | "managed" ) ;
Section       = "section" ":" Number ;

Params        = "params" "{" { ParamDecl } "}" ;
ParamDecl     = Name ":" "bool" "=" ( "true" | "false" ) EOL
              | "КаталогВыгрузки" ":" "Path" "=" String ;

Data          = "data" "{" { DataLine } "}" ;
DataLine      = Binding | Fields | Join | Rows | PeriodField ;
Binding       = SourceId "=" MetaPath EOL ;
Fields        = "fields" ":" Name { "," Name } EOL ;
Join          = "|>" JoinKind SourceId "on" SourceId "." Name "==" SourceId "." Name ;
JoinKind      = "left_join" | "inner_join" | "right_join" ;
Rows          = "rows" "=" RestOfLine ;
PeriodField   = "where" [ SourceId "." ] Name [ "between" RestOfLine ]
              | "filter" "period" "on" [ SourceId "." ] Name ;

Show          = "show" ( "attributes" | "structure" ) MetaPath ;
IncludeList   = "include" "list" MetaPath "in" "form" Ref "as" Name ;
Balance       = "balance" MetaPath "at" Ref "by" NameList "into" Ref ;
Turnovers     = "turnovers" MetaPath "for" Ref "by" NameList "into" Ref ;
NameList      = Name { "," Name } ;

Layout        = "layout" ":" "maket" String ;
Format        = "format" ":" "xlsx" ;
View          = "view" "{" AnyText "}" ;          (* контейнер, тело не разбирается *)

MetaPath      = MetaKind "." Name { "." Name } ;
MetaKind      = "Справочник" | "Документ" | "РегистрСведений" | "РегистрНакопления"
              | "РегистрБухгалтерии" | "Перечисление" | "Обработка" | "Отчет" ;
Ref           = Name { "." Name } ;                (* например epf.ДатаКонПериода *)

SourceId      = LatinLetter { LatinLetter | Digit | "_" } ;
ReportId      = Letter { Letter | Digit | "_" } ;
Name          = Letter { Letter | Digit | "_" } ;
Letter        = LatinLetter | CyrillicLetter | "_" ;
String        = '"' { AnyCharExceptQuote } '"' ;
Number        = Digit { Digit } ;
Comment       = "//" RestOfLine ;                  (* удаляется до разбора *)

Правила, которые грамматика не передаёт#

  1. Минимальное содержание. Текст должен содержать report или хотя бы одно из: источник в data, show, include list, balance, turnovers. Иначе ошибка «не найден report и источники data». Пустой текст — ошибка «пустой Spec1C».
  2. Нет data — предупреждение. Если блока data { } нет, разбор выдаёт предупреждение «нет блока data { }», но не ошибку.
  3. Учитывается первое вхождение. Из нескольких report, title, target, section, layout, блоков params и data учитывается первое. Все show, include list, balance, turnovers и соединения учитываются.
  4. Блок заканчивается на первой }. Внутри params и data не должно быть фигурных скобок — даже в строке или в /* … */.
  5. fields относится к последней привязке выше, и только к привязкам с видами Справочник, Документ, РегистрСведений, РегистрНакопления. Подробно — Структура файла и вложенность.
  6. Поле периода. Сначала ищется в data, затем во всём тексте; where имеет приоритет над filter period on. Префикс источник. и всё после between отбрасываются.
  7. |>: присоединяемый источник определяется по условию on, а не по имени после вида соединения. Подробно — Разрешение имён.
  8. /* … */ допускается только внутри строки fields.
  9. Регистр букв. Ключевые слова — строчными; подробности — Лексическая структура.

Полный пример#

Spec1C
spec1c {
  report contracts
    title:  "Договоры и изменения условий"
    target: ordinary
    section: 1

  params {
    ТолькоДействующиеНаКонец : bool = true
    ВыгружатьXLSX            : bool = false
  }

  data {
    contracts = Справочник.КлиентскиеДоговора
      fields: Ссылка, Код, ДатаДоговора

    amendments = РегистрСведений.ДокументыИзменяющиеУсловияДоговора
      fields: Договор, Период

    rows = contracts
      |> left_join amendments on amendments.Договор == contracts.Ссылка

    where ДатаДоговора between ПериодT
  }

  view {
    layout: maket "м_Договоры"
    format: xlsx
  }

  show attributes Справочник.КлиентскиеДоговора
}

Пример разбирается без ошибок. Что из него попадает в модель и в код — в Модель спецификации и Соответствие конструкций и BSL; другие готовые спецификации — в Библиотека примеров.

Ограничения#

  • Грамматика описывает распознаваемые строки. Текст вне грамматики не вызывает ошибки — он пропускается.
  • Вложенных блоков внутри params и data нет.
  • Типы параметров, кроме bool и Path для КаталогВыгрузки, в грамматику не входят: такие строки разбираются как текст и теряются (см. Типы и значения).
  • Конструкции compute, form { }, select … into, output … mapping, refs, find, calls, template: не входят в грамматику (Неподдерживаемые конструкции).
  • Полный список ограничений — Ограничения реализации.

См. также

Сверено с продуктом: 27.10.2026

Нашли неточность? Напишите на [email protected] и укажите адрес страницы.

Smart1Spec · документация описывает текущую версию сервиса.