Грамматика
Грамматика поддерживаемого языка Spec1C в нотации EBNF и правила, которые грамматика не передаёт.
Перед чтением
- Лексическая структура Справочник
На этой странице
Грамматика описывает тексты, которые принимает разбор Studio. Ссылка «Синтаксис» в заголовке этапа Spec1C открывает эту страницу.
Назначение#
Здесь собраны все поддерживаемые конструкции в одном формальном описании. Грамматика описывает только то, что реально обрабатывает текущая версия Studio. Конструкции, которых в ней нет, разбор пропускает — даже если редактор их подсвечивает (см. Неподдерживаемые конструкции).
Разбор в Studio не строит полное дерево текста: он ищет каждую конструкцию по образцу. Поэтому грамматика ниже — точное описание того, какие строки будут распознаны, а не того, какой текст будет отвергнут. Нераспознанный текст не вызывает ошибки.
Обозначения#
| Запись | Смысл |
|---|---|
"report" | слово или знак, как написано |
A B | A, затем B |
A | B | A или B |
[ A ] | A необязательно |
{ A } | A ноль или более раз |
EOL | конец строки — конструкция должна занимать строку целиком |
(* … *) | пояснение |
Грамматика#
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 ; (* удаляется до разбора *)Правила, которые грамматика не передаёт#
- Минимальное содержание. Текст должен содержать
reportили хотя бы одно из: источник вdata,show,include list,balance,turnovers. Иначе ошибка «не найден report и источники data». Пустой текст — ошибка «пустой Spec1C». - Нет
data— предупреждение. Если блокаdata { }нет, разбор выдаёт предупреждение «нет блока data { }», но не ошибку. - Учитывается первое вхождение. Из нескольких
report,title,target,section,layout, блоковparamsиdataучитывается первое. Всеshow,include list,balance,turnoversи соединения учитываются. - Блок заканчивается на первой
}. Внутриparamsиdataне должно быть фигурных скобок — даже в строке или в/* … */. fieldsотносится к последней привязке выше, и только к привязкам с видамиСправочник,Документ,РегистрСведений,РегистрНакопления. Подробно — Структура файла и вложенность.- Поле периода. Сначала ищется в
data, затем во всём тексте;whereимеет приоритет надfilter period on. Префиксисточник.и всё послеbetweenотбрасываются. |>: присоединяемый источник определяется по условиюon, а не по имени после вида соединения. Подробно — Разрешение имён./* … */допускается только внутри строкиfields.- Регистр букв. Ключевые слова — строчными; подробности — Лексическая структура.
Полный пример#
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