⟨/⟩ Nts/55_Backend/Calc/NtsCalc.cs

2156 строк · в начало

using System;
using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.Backend.Calc
{
    /// <summary>
    /// Методика расчёта нормативного расхода автомобильного топлива. Единственный источник
    /// алгоритмов расчёта в модуле ЭНТС; за основу взята «Методика определения эталонов
    /// потребления ГСМ транспортными средствами». Расчёт разбит на общий контур (вход, слагаемые,
    /// поправочные коэффициенты, условия эксплуатации ТС) и тонкие ветки категорий ТС.
    /// </summary>
    public class DOC_NtsCalc : ISdaidDocument, IHasStructuralLinks, IFolder<NtsBackendFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<DOC_InputModel>(),
            Rel.Uses<DOC_NtsCalcErrors>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_WinterAllowance>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModification>(),
        };

        public static string _refName = "Методика расчёта расхода топлива";

        public string Name => "Методика расчёта нормативного расхода топлива";

        public string Description =>
            @"Расчёт нормативного расхода автомобильного топлива: слагаемые расхода, поправочные коэффициенты к норме, условия эксплуатации ТС и ветки категорий ТС.";

        public string Version => "0.4";
        public string Status => "draft";
        public string[] Comments => new string[0];

        public static string Body = $$"""
        Исходные данные всех секций — параметры {{SdaidAnchors.RefTo<DOC_InputModel>()}}.
        Обозначения величин в формулах совпадают с колонкой «Обозначение» модели входных данных.

        Расчёт устроен в два слоя:

        - **Общий контур** — одинаков для всех категорий: выбор категории по виду ТС
          (`fuel.category_by_kind`), базовая норма (`fuel.base_norm`) и эталонная норма
          (`fuel.reference_norm`), пробег (`fuel.mileage`),
          слагаемые расхода (`fuel.q_mileage`, `fuel.q_transport`, `fuel.q_trailer`,
          `fuel.q_trips`, `fuel.q_equipment`) и поправочные коэффициенты к норме (`fuel.cf_*`,
          `fuel.correction_factor_winter`, `fuel.correction_factor_summer`).
        - **Ветки категорий** — тонкие: задают расход для условий эксплуатации ТС (в зимний период, в летний период, за пригородной зоной) от своего набора слагаемых. Городской
          режим (`fuel.q_urban`) и итог (`fuel.normative_consumption`) — общие.
        - **Эталонный расход** (`fuel.reference_consumption`) — та же ветка категории ТС, что и
          нормативный расход, выполненная повторно с заменой входа: $H_s$ (`fuel.base_norm`)
          заменяется на $H_{эт}$ (`fuel.reference_norm`). Отдельного набора формул нет — секция
          только называет замену входа.

        Слагаемые дают расход в литрах за отчётный пробег; расход для условий эксплуатации
        получается применением к норме поправочного коэффициента.

        Базовая норма (`fuel.base_norm`) — среднее минимума и максимума базовых норм
        отобранных для ТС модификаций
        (справочник {{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModification>()}}).
        Зимняя надбавка по климатическому району выбирается из справочника
        {{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_WinterAllowance>()}} по субъекту РФ
        эксплуатации ТС (по ПМЭС, иначе по МЭС).

        ## Статусы и ошибки

        Расчёт выполняется для всех загруженных ТС. Результат калькулятора — справочник
        {{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_CalculationStatus>()}}: «Не выполнен» —
        расчёт ещё не выполнялся; после расчёта — «Успешно выполнен» или «Выполнен с ошибкой». Коды,
        условия и тексты ошибок — в {{SdaidAnchors.RefTo<DOC_NtsCalcErrors>()}}. Итоговый статус
        обработки ТС вычисляется отдельно, по результату расчёта, статусу подбора и способу подбора.
        """;

        public static string OpenQuestions = $"""
        ## Открытые вопросы

        Открытые вопросы методики собраны в эпике: {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.OQ_Calc>()}.
        """;
    }

    /// <summary>Секция методики: fuel.category_by_kind.</summary>
    public class FuelCategoryByKind : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.category_by_kind";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 100;
        public string Number => "";
        public string Name => "Выбор способа расчёта для вида ТС";

        public string Body => $"""
        `methodSectionId: fuel.category_by_kind`

        По **коду** вида ТС (параметр `VehicleKind` модели входных данных
        {SdaidAnchors.RefTo<DOC_InputModel>()} — значение `VehicleKind.Code`
        {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleKind>()}, не наименование)
        определяется категория ТС (ветка). Сопоставление перенесено с наименования на код один в
        один, без изменения состава веток — коды `mobile001`-`mobile033` берутся из справочника
        {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleKind>()} как есть, остальные —
        коды, довнесённые в справочник там же, где АИС код не передаёт (`tractor`, `snowmobile` и
        т. п.):

        - `mobile001`, `mobile002`, `brigade_car` → `PassengerCar` (`fuel.passenger_car`);
        - `mobile003`, `mobile004` → `Bus` (`fuel.bus`);
        - `mobile005`, `mobile006`, `mobile007`, `mobile008`, `mobile011`, `mobile012`,
          `domestic_passenger_and_cargo_vehicles` → `CargoCar` (`fuel.truck`);
        - `mobile009`, `mobile010` → `DumpTruck` (`fuel.dump_truck`);
        - `mobile016`, `mobile017`, `mobile022`, `mobile023`, `mobile025`, `mobile026`,
          `mobile030`, `tracked_swamp_vehicle`, `all_terrain_vehicle`, `bulldozer`, `snowmobile`,
          `tractor` → `SpecCar` (`fuel.special_vehicle`).

        Коды вне этого перечня (например, медицинский автотранспорт, автомобили-эвакуаторы,
        часть видов спецтехники, `chipper_machine`) — ветка не определена; это предсуществующий
        пробел методики, не входит в состав этой секции.

        **Правила валидации:**

        - параметр `VehicleKind` модели входных данных задан (и код записи непуст) и входит в
          перечисленные коды;
        - вид ТС не задан → «Вид ТС не определён»;
        - вид ТС задан, но методика для его кода не определена → «Методика не определена».
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.base_norm.</summary>
    public class FuelBaseNorm : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.base_norm";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 150;
        public string Number => "";
        public string Name => "Базовая норма расхода топлива, л/100 км";

        public string Body => $$$"""
        `methodSectionId: fuel.base_norm`

        Базовая норма $H_s$, л/100 км — расход топлива конкретной модели в снаряжённом состоянии
        без груза при стандартных условиях. Базовые нормы отобранных для ТС модификаций — параметр
        `BaseConsumptionRates` модели входных данных {{{SdaidAnchors.RefTo<DOC_InputModel>()}}}. Для ТС
        отбираются модификации справочника «Марка, модель и модификация ТС»; в отобранной группе
        берутся минимум и максимум базовых норм, базовая норма — их среднее:

        $$H_s = \frac{H_{max} + H_{min}}{2}$$

        где:

        - $H_s$ — базовая норма расхода топлива, л/100 км;
        - $H_{max}$ — максимальная базовая норма в отобранной группе, л/100 км;
        - $H_{min}$ — минимальная базовая норма в отобранной группе, л/100 км.

        В расчёте сохраняются $H_{min}$, $H_{max}$ и $H_s$.

        **Правила валидации:**

        - отобрана хотя бы одна модификация сопоставленного вида ТС; базовая норма каждой отобранной модификации $> 0$;
        - нет норм по сопоставленному виду ТС → «Базовая норма не определена».
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.reference_norm.</summary>
    public class FuelReferenceNorm : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.reference_norm";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 151;
        public string Number => "";
        public string Name => "Эталонная норма расхода топлива, л/100 км";

        public string Body => $$$"""
        `methodSectionId: fuel.reference_norm`

        Эталонная норма $H_{эт}$, л/100 км — минимальная базовая норма **всей базовой группы**
        ТС (вид ТС + вид топлива), а не только отобранных для ТС модификаций: параметр
        `ReferenceGroupConsumptionRates` модели входных данных
        {{{SdaidAnchors.RefTo<DOC_InputModel>()}}}. Базовая группа и её сужение по виду топлива —
        {{{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationGroupSelection>()}}},
        раздел «Базовая группа».

        $$H_{эт} = \min(H_i),\ i \in \text{БазоваяГруппа}$$

        где:

        - $H_{эт}$ — эталонная норма расхода топлива, л/100 км;
        - БазоваяГруппа — все модификации вида ТС с установленной нормой, мягко суженные по виду
          топлива (та же группа, что в `fuel.base_norm`, но без ограничения отбором пользователя).

        В отличие от $H_s$, $H_{эт}$ не меняется при изменении отбора («Отфильтрованные»/
        «Отобранные» в окне подбора) — только при пересборке самой базовой группы (смена вида ТС
        или вида топлива ТС).

        **Правила валидации:** базовая группа непуста → $H_{эт}$ определена; норма каждой строки
        базовой группы $> 0$ (то же условие, что у `fuel.base_norm`, для той же базовой группы);
        пустая базовая группа → эталонная норма не определена (та же ошибка, что и у
        `fuel.base_norm`, — «Базовая норма не определена» относится к обеим величинам, раз они
        используют одну и ту же базовую группу).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.mileage.</summary>
    public class FuelMileage : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.mileage";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 160;
        public string Number => "";
        public string Name => "Пробег, км";

        public string Body => $$"""
        `methodSectionId: fuel.mileage`

        Пробег, км — расчётный показатель: вызывающая сторона расчёта передаёт в
        {{SdaidAnchors.RefTo<DOC_InputModel>()}} исходные данные (`InputModel.Mileage`), секция сама
        выводит из них $S$. Карточка ТС это поле не задаёт и всегда получает эталон (удельный
        расход) — 100 км; реальный пробег передаётся, например, при формировании отчёта.

        $$S = \begin{cases} InputModel.Mileage, & InputModel.Mileage > 0 \\ 100, & InputModel.Mileage = \text{null} \end{cases}$$

        где:

        - $S$ — пробег, км.

        **Правила валидации:**

        - `InputModel.Mileage > 0` или `InputModel.Mileage` не передан (`null`); иначе — ошибка
          (передан некорректный пробег — см. {{SdaidAnchors.RefTo<DOC_NtsCalcErrors>()}}).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>
    /// Секция методики: группа «Поправочные коэффициенты» — общий контур надбавок к базовой
    /// норме. Собирает в один раздел отдельные коэффициенты и суммарные коэффициенты периодов.
    /// </summary>
    public class FuelCorrectionFactors : ISdaidDocumentSection
    {
        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 200;
        public string Number => "";
        public string Name => "Поправочные коэффициенты";

        public string Body => """
        Общий контур надбавок к базовой норме. Здесь собраны отдельные поправочные коэффициенты
        (климатический район, срок эксплуатации, климат-контроль, кондиционер, прогрев,
        пригородная зона) и суммарные коэффициенты периодов, которые их складывают, — зимнего и летнего.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.cf_climate_region.</summary>
    public class FuelCfClimateRegion : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.cf_climate_region";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 210;
        public string Number => "";
        public string Name => "Поправочный коэффициент на климатический район $D_{район}$";

        public string Body => $$"""
        `methodSectionId: fuel.cf_climate_region`

        $D_{район}$ — параметр `ClimateRegionAllowance` модели входных данных
        {{SdaidAnchors.RefTo<DOC_InputModel>()}}: предельная величина зимней надбавки, заданная
        для субъекта РФ, в котором эксплуатируется ТС, %.

        где:

        - $D_{район}$ — поправочный коэффициент на климатический район, %.

        Субъект РФ определяется по ПМЭС, к которому привязано ТС, а если ТС привязано к МЭС — по МЭС.

        **Правила валидации:** субъект РФ определён; для субъекта есть строка справочника.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.cf_operation_years.</summary>
    public class FuelCfOperationYears : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.cf_operation_years";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 220;
        public string Number => "";
        public string Name => "Поправочный коэффициент на срок эксплуатации $D_{эксп}$";

        public string Body => """
        `methodSectionId: fuel.cf_operation_years`

        Срок эксплуатации, лет:

        $$t_{эксп} = Год(ReportDate) - Год(StartDate)$$

        $$D_{эксп} = \begin{cases} 10, & t_{эксп} > 8 \\ 5, & 5 < t_{эксп} \le 8 \\ 0, & t_{эксп} \le 5 \end{cases}$$

        где:

        - $D_{эксп}$ — поправочный коэффициент на срок эксплуатации, %;
        - $t_{эксп}$ — срок эксплуатации, лет;
        - $ReportDate$ — отчётная дата (дата расчёта); $StartDate$ — дата начала эксплуатации ТС.

        **Правила валидации:** `StartDate` и `ReportDate` заданы; `StartDate < ReportDate`.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.cf_climate_control.</summary>
    public class FuelCfClimateControl : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.cf_climate_control";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 230;
        public string Number => "";
        public string Name => "Поправочный коэффициент при использовании климат-контроля $D_{клим}$";

        public string Body => """
        `methodSectionId: fuel.cf_climate_control`

        $$D_{клим} = 7\ \%$$

        где:

        - $D_{клим}$ — поправочный коэффициент при использовании климат-контроля, %.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.cf_air_conditioner.</summary>
    public class FuelCfAirConditioner : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.cf_air_conditioner";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 240;
        public string Number => "";
        public string Name => "Поправочный коэффициент при использовании кондиционера $D_{конд}$";

        public string Body => """
        `methodSectionId: fuel.cf_air_conditioner`

        $$D_{конд} = 7\ \%$$

        где:

        - $D_{конд}$ — поправочный коэффициент при использовании кондиционера, %.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.cf_warm_up.</summary>
    public class FuelCfWarmUp : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.cf_warm_up";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 250;
        public string Number => "";
        public string Name => "Поправочный коэффициент на прогрев в зимний период $D_{прогрев}$";

        public string Body => """
        `methodSectionId: fuel.cf_warm_up`

        $$D_{прогрев} = 10\ \%$$

        где:

        - $D_{прогрев}$ — поправочный коэффициент на прогрев в зимний период, %.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.cf_suburb.</summary>
    public class FuelCfSuburb : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.cf_suburb";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 260;
        public string Number => "";
        public string Name => "Поправочный коэффициент к норме при работе за пригородной зоной, %";

        public string Body => """
        `methodSectionId: fuel.cf_suburb`

        $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, %; применяется как
        **снижение** нормы (дороги общего пользования за пределами пригородной зоны, равнинная
        слабохолмистая местность):

        $$D^{загор} = -15\ \%$$

        где:

        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (снижение).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.correction_factor_winter.</summary>
    public class FuelCorrectionFactorWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.correction_factor_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 270;
        public string Number => "";
        public string Name => "Поправочный коэффициент к норме в зимний период, %";

        public string Body => """
        `methodSectionId: fuel.correction_factor_winter`

        $$D^{зима} = D_{район} + D_{эксп} + D_{клим} + D_{прогрев} + D_{нас} + D_{ост} + D_{пон} + D_{спец} + D_{чс} + D_{прос}$$

        где:

        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, %;
        - $D_{район}$ — поправочный коэффициент на климатический район, % (секция `fuel.cf_climate_region`);
        - $D_{эксп}$ — поправочный коэффициент на срок эксплуатации, % (секция `fuel.cf_operation_years`);
        - $D_{клим}$ — поправочный коэффициент при использовании климат-контроля, % (секция `fuel.cf_climate_control`);
        - $D_{прогрев}$ — поправочный коэффициент на прогрев в зимний период, % (секция `fuel.cf_warm_up`);
        - $D_{нас}$ — поправочный коэффициент на численность населения, % (вводится в модуле);
        - $D_{ост}$ — поправочный коэффициент на частые технологические остановки, % (вводится в модуле);
        - $D_{пон}$ — поправочный коэффициент при движении с пониженной скоростью, % (вводится в модуле);
        - $D_{спец}$ — поправочный коэффициент при работе специальных автомобилей, % (вводится в модуле);
        - $D_{чс}$ — поправочный коэффициент при работе в условиях ЧС, % (вводится в модуле);
        - $D_{прос}$ — поправочный коэффициент при вынужденном простое, % (вводится в модуле).

        **Правила валидации:** $D_{нас}, D_{ост}, D_{пон}, D_{спец}, D_{чс}, D_{прос} \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.correction_factor_summer.</summary>
    public class FuelCorrectionFactorSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.correction_factor_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelCorrectionFactors);
        public int Order => 280;
        public string Number => "";
        public string Name => "Поправочный коэффициент к норме в летний период, %";

        public string Body => """
        `methodSectionId: fuel.correction_factor_summer`

        $$D^{лето} = D_{эксп} + D_{клим} + D_{конд} + D_{нас} + D_{ост} + D_{пон} + D_{спец} + D_{чс} + D_{прос}$$

        где:

        - $D^{лето}$ — поправочный коэффициент к норме в летний период, %;
        - $D_{эксп}$ — поправочный коэффициент на срок эксплуатации, % (секция `fuel.cf_operation_years`);
        - $D_{клим}$ — поправочный коэффициент при использовании климат-контроля, % (секция `fuel.cf_climate_control`);
        - $D_{конд}$ — поправочный коэффициент при использовании кондиционера, % (секция `fuel.cf_air_conditioner`);
        - $D_{нас}, D_{ост}, D_{пон}, D_{спец}, D_{чс}, D_{прос}$ — ручные надбавки, % (вводятся в модуле; перечислены в секции `fuel.correction_factor_winter`).

        **Правила валидации:** $D_{нас}, D_{ост}, D_{пон}, D_{спец}, D_{чс}, D_{прос} \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.g_cargo — масса груза.</summary>
    public class FuelGCargo : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.g_cargo";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 290;
        public string Number => "";
        public string Name => "Масса груза, т";

        public string Body => $$"""
        `methodSectionId: fuel.g_cargo`

        Масса груза $G_{гр}$, т — расчётный параметр от грузоподъёмности:

        $$G_{гр} = 0{,}5 \cdot q$$

        где:

        - $G_{гр}$ — масса груза, т;
        - $q$ — грузоподъёмность ТС, т — параметр `CargoCapacity` модели входных данных
          {{SdaidAnchors.RefTo<DOC_InputModel>()}}.

        **Правила валидации:** $q \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.s_cargo — пробег с грузом.</summary>
    public class FuelSCargo : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.s_cargo";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelMileage);
        public int Order => 161;
        public string Number => "";
        public string Name => "Пробег с грузом, км";

        public string Body => """
        `methodSectionId: fuel.s_cargo`

        Пробег с грузом $S_{гр}$, км — доля от пробега:

        $$S_{гр} = 0{,}8 \cdot S$$

        где:

        - $S_{гр}$ — пробег с грузом, км;
        - $S$ — пробег, км (секция `fuel.mileage`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.s_special_to_work — пробег к месту работы и обратно.</summary>
    public class FuelSSpecialToWork : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.s_special_to_work";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelMileage);
        public int Order => 162;
        public string Number => "";
        public string Name => "Пробег к месту работы и обратно, км";

        public string Body => """
        `methodSectionId: fuel.s_special_to_work`

        Пробег к месту работы и обратно $S'$, км — доля от пробега:

        $$S' = 0{,}3 \cdot S$$

        где:

        - $S'$ — пробег к месту работы и обратно, км;
        - $S$ — пробег, км (секция `fuel.mileage`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.s_special_on_work — пробег при выполнении специальной работы при передвижении.</summary>
    public class FuelSSpecialOnWork : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.s_special_on_work";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelMileage);
        public int Order => 163;
        public string Number => "";
        public string Name => "Пробег при выполнении специальной работы при передвижении, км";

        public string Body => """
        `methodSectionId: fuel.s_special_on_work`

        Пробег при выполнении специальной работы при передвижении $S''$, км — доля от пробега:

        $$S'' = 0{,}7 \cdot S$$

        где:

        - $S''$ — пробег при выполнении специальной работы при передвижении, км;
        - $S$ — пробег, км (секция `fuel.mileage`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.w — объём транспортной работы.</summary>
    public class FuelW : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.w";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 294;
        public string Number => "";
        public string Name => "Объём транспортной работы, т·км";

        public string Body => """
        `methodSectionId: fuel.w`

        Объём транспортной работы $W$, т·км:

        $$W = G_{гр} \cdot S_{гр}$$

        где:

        - $W$ — объём транспортной работы, т·км;
        - $G_{гр}$ — масса груза, т (секция `fuel.g_cargo`);
        - $S_{гр}$ — пробег с грузом, км (секция `fuel.s_cargo`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_trailer — норма на дополнительную массу прицепа.</summary>
    public class FuelHTrailer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_trailer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 300;
        public string Number => "";
        public string Name => "Норма расхода топлива на дополнительную массу прицепа, л/100 т·км";

        public string Body => $$"""
        `methodSectionId: fuel.h_trailer`

        Норма расхода топлива на дополнительную массу прицепа (полуприцепа) $H_g$, л/100 т·км —
        расчётный параметр по виду топлива — параметр `FuelType` модели входных данных
        {{SdaidAnchors.RefTo<DOC_InputModel>()}}:

        $$H_g = \begin{cases} 2, & \text{FuelType} = \text{«бензин»} \\ 1{,}3, & \text{FuelType} = \text{«дизельное топливо»} \end{cases}$$

        где:

        - $H_g$ — норма расхода топлива на дополнительную массу прицепа, л/100 т·км;
        - `FuelType` — вид основного топлива ТС; допустимые значения: бензин, дизельное топливо.

        **Правила валидации:** `FuelType` задан и один из {бензин, дизельное топливо}.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_transport — норма на транспортную работу.</summary>
    public class FuelHTransport : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_transport";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 305;
        public string Number => "";
        public string Name => "Норма расхода топлива на транспортную работу, л/100 т·км";

        public string Body => $$"""
        `methodSectionId: fuel.h_transport`

        Норма расхода топлива на транспортную работу $H_w$, л/100 т·км — расчётный параметр по виду
        топлива — параметр `FuelType` модели входных данных {{SdaidAnchors.RefTo<DOC_InputModel>()}}:

        $$H_w = \begin{cases} 2, & \text{FuelType} = \text{«бензин»} \\ 1{,}3, & \text{FuelType} = \text{«дизельное топливо»} \end{cases}$$

        где:

        - $H_w$ — норма расхода топлива на транспортную работу, л/100 т·км;
        - `FuelType` — вид основного топлива ТС; допустимые значения: бензин, дизельное топливо.

        **Правила валидации:** `FuelType` задан и один из {бензин, дизельное топливо}.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_z — дополнительная норма расхода на каждую ездку с грузом.</summary>
    public class FuelHZ : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_z";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 308;
        public string Number => "";
        public string Name => "Дополнительная норма расхода топлива на каждую ездку с грузом, л/100 км";

        public string Body => """
        `methodSectionId: fuel.h_z`

        Дополнительная норма расхода топлива на каждую ездку с грузом $H_z$, л/100 км — постоянная
        методики:

        $$H_z = 0{,}25$$

        где:

        - $H_z$ — дополнительная норма расхода топлива на каждую ездку с грузом, л/100 км.

        **Правила валидации:** нет — постоянная методики.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    // ─────────────────────────────── Слагаемые расхода ───────────────────────────────

    /// <summary>Секция методики: fuel.q_mileage — расход на пробег.</summary>
    public class FuelQMileage : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_mileage";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 310;
        public string Number => "";
        public string Name => "Нормативный расход на пробег, л";

        public string Body => """
        `methodSectionId: fuel.q_mileage`

        Слагаемое «расход на пробег» — из базовой нормы на пробег:

        $$Q_{пробег} = 0{,}01 \cdot H_s \cdot S$$

        где:

        - $Q_{пробег}$ — нормативный расход на пробег, л;
        - $H_s$ — базовая норма расхода топлива, л/100 км (секция `fuel.base_norm`);
        - $S$ — пробег, км (секция `fuel.mileage`).

        Присутствует в ветках лёгковых автомобилей, автобусов и грузовых. В ветке самосвалов не
        применяется: самосвал считает пробег по норме автомобиля-самосвала ($0{,}01 \cdot H_{sanc} \cdot S$)
        внутри секций `fuel.dump_truck_q_*` (норма — `fuel.h_sanc`).

        **Правила валидации:** нет — входы $H_s$ и $S$ посчитаны в секциях `fuel.base_norm` и `fuel.mileage`.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_transport — расход на транспортную работу.</summary>
    public class FuelQTransport : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_transport";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 320;
        public string Number => "";
        public string Name => "Нормативный расход на транспортную работу, л";

        public string Body => """
        `methodSectionId: fuel.q_transport`

        Слагаемое «расход на транспортную работу» — из нормы на транспортную работу и объёма
        транспортной работы:

        $$Q_{трансп} = 0{,}01 \cdot H_w \cdot W$$

        где:

        - $Q_{трансп}$ — нормативный расход на транспортную работу, л;
        - $H_w$ — норма расхода топлива на транспортную работу, л/100 т·км (секция `fuel.h_transport`);
        - $W$ — объём транспортной работы, т·км (секция `fuel.w`);

        Присутствует в грузовых и специальных автомобилях.

        **Правила валидации:** нет — входы $H_w$ и $W$ посчитаны в секциях `fuel.h_transport` и `fuel.w`.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_trailer — расход на массу прицепа.</summary>
    public class FuelQTrailer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_trailer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 330;
        public string Number => "";
        public string Name => "Нормативный расход на массу прицепа, л";

        public string Body => """
        `methodSectionId: fuel.q_trailer`

        Слагаемое «расход на дополнительную массу прицепа (полуприцепа)»:

        $$Q_{прицеп} = 0{,}01 \cdot H_g \cdot G_{пр} \cdot S$$

        где:

        - $Q_{прицеп}$ — нормативный расход на массу прицепа, л;
        - $H_g$ — норма расхода топлива на дополнительную массу прицепа, л/100 т·км (секция `fuel.h_trailer`);
        - $G_{пр}$ — собственная масса прицепа (полуприцепа), т;
        - $S$ — пробег, км (секция `fuel.mileage`).

        Присутствует в грузовых.

        **Правила валидации:** $G_{пр} \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_trips — расход на ездки с грузом.</summary>
    public class FuelQTrips : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_trips";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 340;
        public string Number => "";
        public string Name => "Нормативный расход на ездки с грузом, л";

        public string Body => """
        `methodSectionId: fuel.q_trips`

        Слагаемое «расход на каждую ездку с грузом» (самосвалы):

        $$Q_{ездки} = H_z \cdot Z$$

        где:

        - $Q_{ездки}$ — нормативный расход на ездки с грузом, л;
        - $H_z$ — дополнительная норма расхода топлива на каждую ездку с грузом, л;
        - $Z$ — количество ездок с грузом за смену, шт.

        **Правила валидации:** $Z \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_equipment — расход на работу оборудования.</summary>
    public class FuelQEquipment : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_equipment";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 350;
        public string Number => "";
        public string Name => "Нормативный расход на работу оборудования, л";

        public string Body => """
        `methodSectionId: fuel.q_equipment`

        Слагаемое «расход на работу отопителя»:

        $$Q_{обор} = H_{от} \cdot T$$

        где:

        - $Q_{обор}$ — нормативный расход на работу отопителя, л;
        - $H_{от}$ — норма расхода топлива на работу отопителя, л/ч;
        - $T$ — время работы отопителя, ч.

        Присутствует в автобусах. Расход на работу специального оборудования считается в ветке
        специальных автомобилей (`fuel.special_stop_q_*`).

        **Правила валидации:** $H_{от} \ge 0$; $T \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    // ─────────────────────────────── Ветки категорий ───────────────────────────────

    /// <summary>Секция методики: fuel.passenger_car — ветка «Легковые автомобили».</summary>
    public class FuelPassengerCar : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.passenger_car";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 400;
        public string Number => "";
        public string Name => "Легковые автомобили";

        public string Body => """
        `methodSectionId: fuel.passenger_car`

        Ветка «Легковые автомобили». Расход для условий эксплуатации ТС (в зимний период, в летний период, за пригородной зоной) — `fuel.q_winter`, `fuel.q_summer`, `fuel.q_suburban`; норма —
        расход на пробег (`fuel.q_mileage`). Городской режим и итог — общие секции `fuel.q_urban`,
        `fuel.normative_consumption`.

        **Правила валидации:** вид ТС отнесён к категории `PassengerCar` (секция `fuel.category_by_kind`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.bus — ветка «Автобусы».</summary>
    public class FuelBus : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.bus";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 500;
        public string Number => "";
        public string Name => "Автобусы";

        public string Body => """
        `methodSectionId: fuel.bus`

        Ветка «Автобусы». Расход для условий эксплуатации ТС (в зимний период, в летний период, за
        пригородной зоной) — `fuel.bus_q_winter`, `fuel.bus_q_summer`, `fuel.bus_q_suburban`: к
        расходу на пробег (`fuel.q_mileage`) добавляется расход на работу отопителя
        (`fuel.q_equipment`) **вне поправочного коэффициента**. Городской режим и итог — общие
        секции `fuel.q_urban`, `fuel.normative_consumption`.

        **Правила валидации:** вид ТС отнесён к категории `Bus` (секция `fuel.category_by_kind`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.bus_q_suburban.</summary>
    public class FuelBusQSuburban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.bus_q_suburban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelBus);
        public int Order => 530;
        public string Number => "";
        public string Name => "Нормативный расход за пригородной зоной, л";

        public string Body => """
        `methodSectionId: fuel.bus_q_suburban`

        Нормативный расход за пригородной зоной — расход на пробег с пригородным коэффициентом плюс
        работа отопителя (вне коэффициента):

        $$Q^{загор} = Q_{пробег} \cdot (1 + 0{,}01 \cdot D^{загор}) + Q_{обор}$$

        где:

        - $Q^{загор}$ — нормативный расход за пригородной зоной, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (секция `fuel.cf_suburb`);
        - $Q_{обор}$ — нормативный расход на работу отопителя, л (секция `fuel.q_equipment`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.bus_q_winter.</summary>
    public class FuelBusQWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.bus_q_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelBus);
        public int Order => 540;
        public string Number => "";
        public string Name => "Нормативный расход в зимний период, л";

        public string Body => """
        `methodSectionId: fuel.bus_q_winter`

        Нормативный расход в зимний период — расход на пробег с зимним коэффициентом плюс работа
        отопителя (вне коэффициента):

        $$Q^{зима} = Q_{пробег} \cdot (1 + 0{,}01 \cdot D^{зима}) + Q_{обор}$$

        где:

        - $Q^{зима}$ — нормативный расход в зимний период, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, % (секция `fuel.correction_factor_winter`);
        - $Q_{обор}$ — нормативный расход на работу отопителя, л (секция `fuel.q_equipment`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.bus_q_summer.</summary>
    public class FuelBusQSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.bus_q_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelBus);
        public int Order => 550;
        public string Number => "";
        public string Name => "Нормативный расход в летний период, л";

        public string Body => """
        `methodSectionId: fuel.bus_q_summer`

        Нормативный расход в летний период — расход на пробег с летним коэффициентом плюс работа
        отопителя (вне коэффициента):

        $$Q^{лето} = Q_{пробег} \cdot (1 + 0{,}01 \cdot D^{лето}) + Q_{обор}$$

        где:

        - $Q^{лето}$ — нормативный расход в летний период, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $D^{лето}$ — поправочный коэффициент к норме в летний период, % (секция `fuel.correction_factor_summer`);
        - $Q_{обор}$ — нормативный расход на работу отопителя, л (секция `fuel.q_equipment`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.truck — ветка «Грузовые».</summary>
    public class FuelTruck : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.truck";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 600;
        public string Number => "";
        public string Name => "Грузовые бортовые автомобили, автопоезда, тягачи и фургоны";

        public string Body => """
        `methodSectionId: fuel.truck`

        Ветка «Грузовые бортовые, тягачи, фургоны, грузопассажирские». Расчёт — сумма расхода на
        пробег (`fuel.q_mileage`), на транспортную работу (`fuel.q_transport`) и на массу прицепа
        (`fuel.q_trailer`); поправочный коэффициент $(1 + 0{,}01 \cdot D)$ применяется ко всей
        сумме. Расход для условий эксплуатации ТС (в зимний период, в летний период, за пригородной
        зоной) — `fuel.truck_q_winter`, `fuel.truck_q_summer`, `fuel.truck_q_suburban`; городской
        режим и итог — общие секции `fuel.q_urban`, `fuel.normative_consumption`.

        **Правила валидации:** вид ТС отнесён к категории `CargoCar` (секция `fuel.category_by_kind`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.truck_q_suburban.</summary>
    public class FuelTruckQSuburban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.truck_q_suburban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelTruck);
        public int Order => 610;
        public string Number => "";
        public string Name => "Нормативный расход за пригородной зоной, л";

        public string Body => """
        `methodSectionId: fuel.truck_q_suburban`

        Нормативный расход за пригородной зоной — сумма слагаемых ветки с пригородным коэффициентом:

        $$Q^{загор} = (Q_{пробег} + Q_{трансп} + Q_{прицеп}) \cdot (1 + 0{,}01 \cdot D^{загор})$$

        где:

        - $Q^{загор}$ — нормативный расход за пригородной зоной, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $Q_{трансп}$ — нормативный расход на транспортную работу, л (секция `fuel.q_transport`);
        - $Q_{прицеп}$ — нормативный расход на массу прицепа, л (секция `fuel.q_trailer`);
        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (секция `fuel.cf_suburb`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.truck_q_winter.</summary>
    public class FuelTruckQWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.truck_q_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelTruck);
        public int Order => 620;
        public string Number => "";
        public string Name => "Нормативный расход в зимний период, л";

        public string Body => """
        `methodSectionId: fuel.truck_q_winter`

        Нормативный расход в зимний период — сумма слагаемых ветки с зимним коэффициентом:

        $$Q^{зима} = (Q_{пробег} + Q_{трансп} + Q_{прицеп}) \cdot (1 + 0{,}01 \cdot D^{зима})$$

        где:

        - $Q^{зима}$ — нормативный расход в зимний период, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $Q_{трансп}$ — нормативный расход на транспортную работу, л (секция `fuel.q_transport`);
        - $Q_{прицеп}$ — нормативный расход на массу прицепа, л (секция `fuel.q_trailer`);
        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, % (секция `fuel.correction_factor_winter`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.truck_q_summer.</summary>
    public class FuelTruckQSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.truck_q_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelTruck);
        public int Order => 630;
        public string Number => "";
        public string Name => "Нормативный расход в летний период, л";

        public string Body => """
        `methodSectionId: fuel.truck_q_summer`

        Нормативный расход в летний период — сумма слагаемых ветки с летним коэффициентом:

        $$Q^{лето} = (Q_{пробег} + Q_{трансп} + Q_{прицеп}) \cdot (1 + 0{,}01 \cdot D^{лето})$$

        где:

        - $Q^{лето}$ — нормативный расход в летний период, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $Q_{трансп}$ — нормативный расход на транспортную работу, л (секция `fuel.q_transport`);
        - $Q_{прицеп}$ — нормативный расход на массу прицепа, л (секция `fuel.q_trailer`);
        - $D^{лето}$ — поправочный коэффициент к норме в летний период, % (секция `fuel.correction_factor_summer`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.dump_truck — ветка «Самосвалы и самосвальные автопоезда».</summary>
    public class FuelDumpTruck : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.dump_truck";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 700;
        public string Number => "";
        public string Name => "Самосвалы и самосвальные автопоезда";

        public string Body => """
        `methodSectionId: fuel.dump_truck`

        Ветка «Самосвалы и самосвальные автопоезда». Расчёт — норма расхода автомобиля-самосвала
        (автопоезда) `fuel.h_sanc` на пробег (`0,01 · H_{sanc} · S`) с поправочным коэффициентом
        $(1 + 0{,}01 \cdot D)$, плюс расход на каждую ездку с грузом (`fuel.q_trips`) вне
        коэффициента. Расход для условий эксплуатации ТС (в зимний период, в летний период, за
        пригородной зоной) — `fuel.dump_truck_q_winter`, `fuel.dump_truck_q_summer`,
        `fuel.dump_truck_q_suburban`; городской режим и итог — общие секции `fuel.q_urban`,
        `fuel.normative_consumption`.

        **Правила валидации:** вид ТС отнесён к категории `DumpTruck` (секция `fuel.category_by_kind`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_sanc — норма расхода автомобиля-самосвала (автопоезда).</summary>
    public class FuelHSanc : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_sanc";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelDumpTruck);
        public int Order => 710;
        public string Number => "";
        public string Name => "Норма расхода автомобиля-самосвала (автопоезда), л/100 км";

        public string Body => $$"""
        `methodSectionId: fuel.h_sanc`

        Норма расхода топлива автомобиля-самосвала (самосвального автопоезда) $H_{sanc}$, л/100 км —
        базовая норма плюс надбавка на транспортную работу (собственную массу самосвального прицепа и
        половину его грузоподъёмности):

        $$H_{sanc} = H_s + H_w \cdot (G_{пр} + 0{,}5 \cdot q)$$

        где:

        - $H_{sanc}$ — норма расхода топлива автомобиля-самосвала (автопоезда), л/100 км;
        - $H_s$ — базовая норма расхода топлива, л/100 км (секция `fuel.base_norm`);
        - $H_w$ — норма расхода топлива на транспортную работу автомобиля-самосвала, л/100 т·км — параметр `DumpTruckTransportWorkConsumptionRate` модели входных данных {{SdaidAnchors.RefTo<DOC_InputModel>()}} (вводится в модуле);
        - $G_{пр}$ — собственная масса самосвального прицепа (полуприцепа), т; при его отсутствии 0;
        - $q$ — грузоподъёмность самосвального прицепа (полуприцепа), т; при его отсутствии 0.

        **Правила валидации:** $H_w \ge 0$; $G_{пр} \ge 0$; $q \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.dump_truck_q_winter — расход самосвалов в зимний период.</summary>
    public class FuelDumpQWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.dump_truck_q_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelDumpTruck);
        public int Order => 720;
        public string Number => "";
        public string Name => "Нормативный расход в зимний период, л";

        public string Body => """
        `methodSectionId: fuel.dump_truck_q_winter`

        Нормативный расход в зимний период — норма автомобиля-самосвала на пробег с зимним
        коэффициентом плюс расход на ездки (вне коэффициента):

        $$Q^{зима} = 0{,}01 \cdot H_{sanc} \cdot S \cdot (1 + 0{,}01 \cdot D^{зима}) + Q_{ездки}$$

        где:

        - $Q^{зима}$ — нормативный расход в зимний период, л;
        - $H_{sanc}$ — норма расхода топлива автомобиля-самосвала (автопоезда), л/100 км (секция `fuel.h_sanc`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, % (секция `fuel.correction_factor_winter`);
        - $Q_{ездки}$ — нормативный расход на ездки с грузом, л (секция `fuel.q_trips`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.dump_truck_q_summer — расход самосвалов в летний период.</summary>
    public class FuelDumpQSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.dump_truck_q_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelDumpTruck);
        public int Order => 730;
        public string Number => "";
        public string Name => "Нормативный расход в летний период, л";

        public string Body => """
        `methodSectionId: fuel.dump_truck_q_summer`

        Нормативный расход в летний период — норма автомобиля-самосвала на пробег с летним
        коэффициентом плюс расход на ездки (вне коэффициента):

        $$Q^{лето} = 0{,}01 \cdot H_{sanc} \cdot S \cdot (1 + 0{,}01 \cdot D^{лето}) + Q_{ездки}$$

        где:

        - $Q^{лето}$ — нормативный расход в летний период, л;
        - $H_{sanc}$ — норма расхода топлива автомобиля-самосвала (автопоезда), л/100 км (секция `fuel.h_sanc`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $D^{лето}$ — поправочный коэффициент к норме в летний период, % (секция `fuel.correction_factor_summer`);
        - $Q_{ездки}$ — нормативный расход на ездки с грузом, л (секция `fuel.q_trips`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.dump_truck_q_suburban — расход самосвалов за пригородной зоной.</summary>
    public class FuelDumpQSuburban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.dump_truck_q_suburban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelDumpTruck);
        public int Order => 740;
        public string Number => "";
        public string Name => "Нормативный расход за пригородной зоной, л";

        public string Body => """
        `methodSectionId: fuel.dump_truck_q_suburban`

        Нормативный расход за пригородной зоной — норма автомобиля-самосвала на пробег с
        пригородным коэффициентом плюс расход на ездки (вне коэффициента):

        $$Q^{загор} = 0{,}01 \cdot H_{sanc} \cdot S \cdot (1 + 0{,}01 \cdot D^{загор}) + Q_{ездки}$$

        где:

        - $Q^{загор}$ — нормативный расход за пригородной зоной, л;
        - $H_{sanc}$ — норма расхода топлива автомобиля-самосвала (автопоезда), л/100 км (секция `fuel.h_sanc`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (секция `fuel.cf_suburb`);
        - $Q_{ездки}$ — нормативный расход на ездки с грузом, л (секция `fuel.q_trips`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_vehicle — ветка «Специальные и специализированные автомобили».</summary>
    public class FuelSpecialVehicle : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_vehicle";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 800;
        public string Number => "";
        public string Name => "Специальные и специализированные автомобили";

        public string Body => """
        `methodSectionId: fuel.special_vehicle`

        Ветка «Специальные и специализированные автомобили». Норма расхода специального автомобиля
        на пробег считается с учётом транспортной работы (секция `fuel.h_sc`). Расчёт ведётся по двум
        периодам работы:

        - **период передвижения** — расход на пробег по норме `fuel.h_sc`: пробег делится на пробег
          к месту работы и обратно ($S' = 0{,}3 \cdot S$) и пробег при выполнении специальной работы
          при передвижении ($S'' = 0{,}7 \cdot S$); режимы — `fuel.special_move_q_winter`,
          `fuel.special_move_q_summer`, `fuel.special_move_q_suburban` и `fuel.special_move`;
        - **период стоянки** — к расходу на пробег добавляется работа специального оборудования;
          режимы — `fuel.special_stop_q_winter`, `fuel.special_stop_q_summer`,
          `fuel.special_stop_q_suburban` и `fuel.special_stop`.

        Итог ветки — нормативный расход (секция `fuel.special_normative`): среднее периодов
        передвижения и стоянки.

        Поправочные коэффициенты ветки отличаются от общего контура: для специальных автомобилей
        зимний коэффициент — сумма районного и специального, летний — только специальный
        (`fuel.special_correction_factor_winter`, `fuel.special_correction_factor_summer`),
        коэффициент за пригородной зоной — общий (`fuel.cf_suburb`).

        **Правила валидации:** вид ТС отнесён к категории `SpecCar` (секция `fuel.category_by_kind`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_correction_factor_winter — зимний коэффициент спец-ветки.</summary>
    public class FuelSpecialCorrectionFactorWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_correction_factor_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialVehicle);
        public int Order => 806;
        public string Number => "";
        public string Name => "Поправочный коэффициент к норме в зимний период, %";

        public string Body => $$"""
        `methodSectionId: fuel.special_correction_factor_winter`

        Для специальных автомобилей зимний коэффициент — районный плюс специальный:

        $$D^{зима} = D_{район} + D_{спец}$$

        где:

        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, %;
        - $D_{район}$ — поправочный коэффициент на климатический район, % — параметр `ClimateRegionAllowance` модели входных данных {{SdaidAnchors.RefTo<DOC_InputModel>()}};
        - $D_{спец}$ — поправочный коэффициент при работе специальных автомобилей, % — параметр `SpecialVehicleAllowance` модели входных данных.

        **Правила валидации:** $D_{спец} \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_correction_factor_summer — летний коэффициент спец-ветки.</summary>
    public class FuelSpecialCorrectionFactorSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_correction_factor_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialVehicle);
        public int Order => 807;
        public string Number => "";
        public string Name => "Поправочный коэффициент к норме в летний период, %";

        public string Body => $$"""
        `methodSectionId: fuel.special_correction_factor_summer`

        Для специальных автомобилей летний коэффициент — только специальный:

        $$D^{лето} = D_{спец}$$

        где:

        - $D^{лето}$ — поправочный коэффициент к норме в летний период, %;
        - $D_{спец}$ — поправочный коэффициент при работе специальных автомобилей, % — параметр `SpecialVehicleAllowance` модели входных данных {{SdaidAnchors.RefTo<DOC_InputModel>()}}.

        **Правила валидации:** $D_{спец} \ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_sc — норма специального автомобиля на пробег с учётом транспортной работы.</summary>
    public class FuelHSc : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_sc";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialVehicle);
        public int Order => 850;
        public string Number => "";
        public string Name => "Норма специального автомобиля на пробег с учётом транспортной работы, л/100 км";

        public string Body => """
        `methodSectionId: fuel.h_sc`

        Норма расхода специального автомобиля на пробег с учётом транспортной работы $H_{sc}$, л/100 км —
        базовая норма плюс транспортная работа:

        $$H_{sc} = H_s + H_w \cdot \frac{W}{100}$$

        где:

        - $H_{sc}$ — норма специального автомобиля на пробег с учётом транспортной работы, л/100 км;
        - $H_s$ — базовая норма расхода топлива, л/100 км (секция `fuel.base_norm`);
        - $H_w$ — норма расхода топлива на транспортную работу, л/100 т·км (секция `fuel.h_transport`);
        - $W$ — объём транспортной работы, т·км (секция `fuel.w`).

        **Правила валидации:** нет — входы $H_s$, $H_w$ и $W$ посчитаны в секциях `fuel.base_norm`, `fuel.h_transport` и `fuel.w`.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_s_special_work — норма расхода топлива при выполнении специальной работы во время передвижения.</summary>
    public class FuelHSSpecialWork : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_s_special_work";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelHSc);
        public int Order => 851;
        public string Number => "";
        public string Name => "Норма расхода топлива на пробег при выполнении специальной работы во время передвижения, л/100 км";

        public string Body => """
        `methodSectionId: fuel.h_s_special_work`

        Норма расхода топлива на пробег при выполнении специальной работы во время передвижения
        $H_s''$, л/100 км — равна норме специального автомобиля на пробег:

        $$H_s'' = H_{sc}$$

        где:

        - $H_s''$ — норма расхода топлива на пробег при выполнении специальной работы во время передвижения, л/100 км;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.h_special_equipment — норма на работу специального оборудования.</summary>
    public class FuelHSpecialEquipment : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.h_special_equipment";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialVehicle);
        public int Order => 860;
        public string Number => "";
        public string Name => "Норма расхода топлива на работу специального оборудования, л/ч";

        public string Body => $$$"""
        `methodSectionId: fuel.h_special_equipment`

        Норма расхода топлива на работу специального оборудования $H_т$, л/ч — среднее норм расхода
        топлива на час работы (летней и зимней) — параметры `ConsumptionRatePerHourSummer` и `ConsumptionRatePerHourWinter`
        модели входных данных {{{SdaidAnchors.RefTo<DOC_InputModel>()}}}:

        $$H_т = \frac{H_т^{лето} + H_т^{зима}}{2}$$

        где:

        - $H_т$ — норма расхода топлива на работу специального оборудования, л/ч;
        - $H_т^{лето}$ — норма расхода топлива на час работы, летняя, л/ч — параметр `ConsumptionRatePerHourSummer` модели входных данных;
        - $H_т^{зима}$ — норма расхода топлива на час работы, зимняя, л/ч — параметр `ConsumptionRatePerHourWinter` модели входных данных.

        **Правила валидации:** нормы расхода топлива на час работы (летняя и зимняя) $\ge 0$.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_equipment_time — время работы специального оборудования.</summary>
    public class FuelSpecialEquipmentTime : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_equipment_time";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialVehicle);
        public int Order => 861;
        public string Number => "";
        public string Name => "Время работы специального оборудования, ч";

        public string Body => """
        `methodSectionId: fuel.special_equipment_time`

        Время работы специального оборудования $T$, ч — постоянная методики:

        $$T = 1$$

        где:

        - $T$ — время работы специального оборудования, ч.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_move_q_winter — период передвижения в зимний период.</summary>
    public class FuelSpecialMoveQWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_move_q_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialMoveQUrban);
        public int Order => 822;
        public string Number => "";
        public string Name => "Нормативный расход за период передвижения в зимний период, л";

        public string Body => """
        `methodSectionId: fuel.special_move_q_winter`

        Нормативный расход за период передвижения в зимний период:

        $$Q_{движ}^{зима} = 0{,}01 \cdot (H_{sc} \cdot S' + H_s'' \cdot S'') \cdot (1 + 0{,}01 \cdot D^{зима})$$

        где:

        - $Q_{движ}^{зима}$ — нормативный расход за период передвижения в зимний период, л;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`);
        - $H_s''$ — норма расхода топлива на пробег при выполнении специальной работы во время передвижения, л/100 км (секция `fuel.h_s_special_work`);
        - $S'$ — пробег к месту работы и обратно, км (секция `fuel.s_special_to_work`);
        - $S''$ — пробег при выполнении специальной работы при передвижении, км (секция `fuel.s_special_on_work`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, % (секция `fuel.special_correction_factor_winter`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_move_q_summer — период передвижения в летний период.</summary>
    public class FuelSpecialMoveQSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_move_q_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialMoveQUrban);
        public int Order => 823;
        public string Number => "";
        public string Name => "Нормативный расход за период передвижения в летний период, л";

        public string Body => """
        `methodSectionId: fuel.special_move_q_summer`

        Нормативный расход за период передвижения в летний период:

        $$Q_{движ}^{лето} = 0{,}01 \cdot (H_{sc} \cdot S' + H_s'' \cdot S'') \cdot (1 + 0{,}01 \cdot D^{лето})$$

        где:

        - $Q_{движ}^{лето}$ — нормативный расход за период передвижения в летний период, л;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`);
        - $H_s''$ — норма расхода топлива на пробег при выполнении специальной работы во время передвижения, л/100 км (секция `fuel.h_s_special_work`);
        - $S'$ — пробег к месту работы и обратно, км (секция `fuel.s_special_to_work`);
        - $S''$ — пробег при выполнении специальной работы при передвижении, км (секция `fuel.s_special_on_work`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $D^{лето}$ — поправочный коэффициент к норме в летний период, % (секция `fuel.special_correction_factor_summer`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_move_q_suburban — период передвижения за пригородной зоной.</summary>
    public class FuelSpecialMoveQSuburban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_move_q_suburban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialMove);
        public int Order => 824;
        public string Number => "";
        public string Name => "Нормативный расход за период передвижения за пригородной зоной, л";

        public string Body => """
        `methodSectionId: fuel.special_move_q_suburban`

        Нормативный расход за период передвижения за пригородной зоной:

        $$Q_{движ}^{загор} = 0{,}01 \cdot (H_{sc} \cdot S' + H_s'' \cdot S'') \cdot (1 + 0{,}01 \cdot D^{загор})$$

        где:

        - $Q_{движ}^{загор}$ — нормативный расход за период передвижения за пригородной зоной, л;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`);
        - $H_s''$ — норма расхода топлива на пробег при выполнении специальной работы во время передвижения, л/100 км (секция `fuel.h_s_special_work`);
        - $S'$ — пробег к месту работы и обратно, км (секция `fuel.s_special_to_work`);
        - $S''$ — пробег при выполнении специальной работы при передвижении, км (секция `fuel.s_special_on_work`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (секция `fuel.cf_suburb`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_move_q_urban — городской расход периода передвижения.</summary>
    public class FuelSpecialMoveQUrban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_move_q_urban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialMove);
        public int Order => 821;
        public string Number => "";
        public string Name => "Нормативный расход в городском режиме за период передвижения, л";

        public string Body => """
        `methodSectionId: fuel.special_move_q_urban`

        Городской нормативный расход за период передвижения — среднее зимнего и летнего расхода:

        $$Q_{движ}^{гор} = \frac{Q_{движ}^{зима} + Q_{движ}^{лето}}{2}$$

        где:

        - $Q_{движ}^{гор}$ — городской расход периода передвижения, л;
        - $Q_{движ}^{зима}$ — нормативный расход за период передвижения в зимний период, л (секция `fuel.special_move_q_winter`);
        - $Q_{движ}^{лето}$ — нормативный расход за период передвижения в летний период, л (секция `fuel.special_move_q_summer`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_move — средний расход за период передвижения.</summary>
    public class FuelSpecialMove : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_move";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialNormative);
        public int Order => 820;
        public string Number => "";
        public string Name => "Нормативный расход за период передвижения, л";

        public string Body => """
        `methodSectionId: fuel.special_move`

        Нормативный расход за период передвижения — среднее городского и пригородного
        расхода периода передвижения:

        $$Q_{движ} = \frac{Q_{движ}^{гор} + Q_{движ}^{загор}}{2}$$

        где:

        - $Q_{движ}$ — нормативный расход за период передвижения, л;
        - $Q_{движ}^{гор}$ — городской расход периода передвижения, л (секция `fuel.special_move_q_urban`);
        - $Q_{движ}^{загор}$ — расход за пригородной зоной периода передвижения, л (секция `fuel.special_move_q_suburban`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_stop_q_winter — период стоянки в зимний период.</summary>
    public class FuelSpecialStopQWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_stop_q_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialStopQUrban);
        public int Order => 832;
        public string Number => "";
        public string Name => "Нормативный расход за период стоянки в зимний период, л";

        public string Body => """
        `methodSectionId: fuel.special_stop_q_winter`

        Нормативный расход за период стоянки в зимний период — расход на пробег плюс работа
        оборудования:

        $$Q_{стоян}^{зима} = (0{,}01 \cdot H_{sc} \cdot S + H_т \cdot T) \cdot (1 + 0{,}01 \cdot D^{зима})$$

        где:

        - $Q_{стоян}^{зима}$ — нормативный расход за период стоянки в зимний период, л;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $H_т$ — норма расхода топлива на работу специального оборудования, л/ч (или литры на выполненную операцию) (секция `fuel.h_special_equipment`);
        - $T$ — время работы специального оборудования, ч (секция `fuel.special_equipment_time`);
        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, % (секция `fuel.special_correction_factor_winter`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_stop_q_summer — период стоянки в летний период.</summary>
    public class FuelSpecialStopQSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_stop_q_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialStopQUrban);
        public int Order => 833;
        public string Number => "";
        public string Name => "Нормативный расход за период стоянки в летний период, л";

        public string Body => """
        `methodSectionId: fuel.special_stop_q_summer`

        Нормативный расход за период стоянки в летний период — расход на пробег плюс работа оборудования:

        $$Q_{стоян}^{лето} = (0{,}01 \cdot H_{sc} \cdot S + H_т \cdot T) \cdot (1 + 0{,}01 \cdot D^{лето})$$

        где:

        - $Q_{стоян}^{лето}$ — нормативный расход за период стоянки в летний период, л;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $H_т$ — норма расхода топлива на работу специального оборудования, л/ч (или литры на выполненную операцию) (секция `fuel.h_special_equipment`);
        - $T$ — время работы специального оборудования, ч (секция `fuel.special_equipment_time`);
        - $D^{лето}$ — поправочный коэффициент к норме в летний период, % (секция `fuel.special_correction_factor_summer`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_stop_q_suburban — период стоянки за пригородной зоной.</summary>
    public class FuelSpecialStopQSuburban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_stop_q_suburban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialStop);
        public int Order => 834;
        public string Number => "";
        public string Name => "Нормативный расход за период стоянки за пригородной зоной, л";

        public string Body => """
        `methodSectionId: fuel.special_stop_q_suburban`

        Нормативный расход за период стоянки за пригородной зоной — расход на пробег плюс работа
        оборудования:

        $$Q_{стоян}^{загор} = (0{,}01 \cdot H_{sc} \cdot S + H_т \cdot T) \cdot (1 + 0{,}01 \cdot D^{загор})$$

        где:

        - $Q_{стоян}^{загор}$ — нормативный расход за период стоянки за пригородной зоной, л;
        - $H_{sc}$ — норма специального автомобиля на пробег, л/100 км (секция `fuel.h_sc`);
        - $S$ — пробег, км (секция `fuel.mileage`);
        - $H_т$ — норма расхода топлива на работу специального оборудования, л/ч (или литры на выполненную операцию) (секция `fuel.h_special_equipment`);
        - $T$ — время работы специального оборудования, ч (секция `fuel.special_equipment_time`);
        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (секция `fuel.cf_suburb`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_stop_q_urban — городской расход периода стоянки.</summary>
    public class FuelSpecialStopQUrban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_stop_q_urban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialStop);
        public int Order => 831;
        public string Number => "";
        public string Name => "Нормативный расход в городском режиме за период стоянки, л";

        public string Body => """
        `methodSectionId: fuel.special_stop_q_urban`

        Городской нормативный расход за период стоянки — среднее зимнего и летнего расхода:

        $$Q_{стоян}^{гор} = \frac{Q_{стоян}^{зима} + Q_{стоян}^{лето}}{2}$$

        где:

        - $Q_{стоян}^{гор}$ — городской расход периода стоянки, л;
        - $Q_{стоян}^{зима}$ — нормативный расход за период стоянки в зимний период, л (секция `fuel.special_stop_q_winter`);
        - $Q_{стоян}^{лето}$ — нормативный расход за период стоянки в летний период, л (секция `fuel.special_stop_q_summer`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_stop — средний расход за период стоянки.</summary>
    public class FuelSpecialStop : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_stop";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialNormative);
        public int Order => 830;
        public string Number => "";
        public string Name => "Нормативный расход за период стоянки, л";

        public string Body => """
        `methodSectionId: fuel.special_stop`

        Нормативный расход за период стоянки — среднее городского и пригородного расхода
        периода стоянки:

        $$Q_{стоян} = \frac{Q_{стоян}^{гор} + Q_{стоян}^{загор}}{2}$$

        где:

        - $Q_{стоян}$ — нормативный расход за период стоянки, л;
        - $Q_{стоян}^{гор}$ — городской расход периода стоянки, л (секция `fuel.special_stop_q_urban`);
        - $Q_{стоян}^{загор}$ — расход за пригородной зоной периода стоянки, л (секция `fuel.special_stop_q_suburban`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.special_normative — итог ветки специальных автомобилей.</summary>
    public class FuelSpecialNormative : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.special_normative";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelSpecialVehicle);
        public int Order => 805;
        public string Number => "";
        public string Name => "Нормативный расход, л";

        public string Body => """
        `methodSectionId: fuel.special_normative`

        Нормативный расход специального автомобиля — среднее периодов передвижения и стоянки:

        $$Q_н = \frac{Q_{движ} + Q_{стоян}}{2}$$

        где:

        - $Q_н$ — нормативный расход, л;
        - $Q_{движ}$ — нормативный расход за период передвижения, л (секция `fuel.special_move`);
        - $Q_{стоян}$ — нормативный расход за период стоянки, л (секция `fuel.special_stop`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    // ───────────────────── Условия эксплуатации, городской режим и итог ─────────────────────

    /// <summary>Секция методики: fuel.normative_consumption — результат ветки.</summary>
    public class FuelQNormative : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.normative_consumption";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 360;
        public string Number => "";
        public string Name => "Нормативный расход, л";

        public string Body => """
        `methodSectionId: fuel.normative_consumption`

        Итоговый нормативный расход, л — среднее городского режима и расхода за пригородной зоной:

        $$Q_н = \frac{Q^{гор} + Q^{загор}}{2}$$

        где:

        - $Q_н$ — нормативный расход, л;
        - $Q^{гор}$ — нормативный расход в городском режиме, л (секция `fuel.q_urban`);
        - $Q^{загор}$ — нормативный расход за пригородной зоной, л (секция ветки: `fuel.q_suburban`, `fuel.bus_q_suburban`, …).

        Ветка специальных и специализированных автомобилей считает итог иначе — среднее периодов
        передвижения и стоянки (секция `fuel.special_normative`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.reference_consumption — эталонный расход.</summary>
    public class FuelReferenceConsumption : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.reference_consumption";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 361;
        public string Number => "";
        public string Name => "Эталонный расход, л";

        public string Body => """
        `methodSectionId: fuel.reference_consumption`

        Эталонный расход $Q_{эт}$, л — результат той же ветки категории ТС, что и нормативный
        расход (`fuel.normative_consumption` / `fuel.special_normative`), с единственной заменой
        входа: везде, где ветка использует базовую норму $H_s$ (секция `fuel.base_norm`) —
        начиная с `fuel.q_mileage` и, для самосвалов и спецавтомобилей, прямо в норме на пробег
        (`fuel.h_sanc`, `fuel.h_sc`) — подставляется эталонная норма $H_{эт}$ (секция
        `fuel.reference_norm`). Ни одна формула веток не переписывается — секция только называет
        замену входа; результат вычисляется тем же алгоритмом второй раз.

        где:

        - $Q_{эт}$ — эталонный расход, л;
        - $H_{эт}$ — эталонная норма расхода топлива, л/100 км (секция `fuel.reference_norm`).

        **Правила валидации:** те же, что у `fuel.normative_consumption`/`fuel.special_normative`,
        плюс отдельное условие по входу — $H_{эт}$ определена (см. `fuel.reference_norm`); если
        базовая группа пуста, $H_{эт}$ и $Q_{эт}$ не определены одновременно с $H_s$ и $Q_н$ (одна
        и та же ошибка «Базовая норма не определена»).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_urban.</summary>
    public class FuelQUrban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_urban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(object);
        public int Order => 370;
        public string Number => "";
        public string Name => "Нормативный расход в городском режиме, л";

        public string Body => """
        `methodSectionId: fuel.q_urban`

        Нормативный расход в городском режиме — среднее зимнего и летнего расходов:

        $$Q^{гор} = \frac{Q^{зима} + Q^{лето}}{2}$$

        где:

        - $Q^{гор}$ — нормативный расход в городском режиме, л;
        - $Q^{зима}$ — нормативный расход в зимний период, л (секция ветки: `fuel.q_winter`, `fuel.bus_q_winter`, …);
        - $Q^{лето}$ — нормативный расход в летний период, л (секция ветки: `fuel.q_summer`, `fuel.bus_q_summer`, …).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_suburban.</summary>
    public class FuelQSuburban : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_suburban";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelPassengerCar);
        public int Order => 430;
        public string Number => "";
        public string Name => "Нормативный расход за пригородной зоной, л";

        public string Body => """
        `methodSectionId: fuel.q_suburban`

        Нормативный расход за пригородной зоной — расход на пробег с пригородным коэффициентом:

        $$Q^{загор} = Q_{пробег} \cdot (1 + 0{,}01 \cdot D^{загор})$$

        где:

        - $Q^{загор}$ — нормативный расход за пригородной зоной, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $D^{загор}$ — поправочный коэффициент к норме при работе за пригородной зоной, % (секция `fuel.cf_suburb`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_winter.</summary>
    public class FuelQWinter : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_winter";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelPassengerCar);
        public int Order => 440;
        public string Number => "";
        public string Name => "Нормативный расход в зимний период, л";

        public string Body => """
        `methodSectionId: fuel.q_winter`

        Нормативный расход в зимний период — расход на пробег с зимним коэффициентом:

        $$Q^{зима} = Q_{пробег} \cdot (1 + 0{,}01 \cdot D^{зима})$$

        где:

        - $Q^{зима}$ — нормативный расход в зимний период, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $D^{зима}$ — поправочный коэффициент к норме в зимний период, % (секция `fuel.correction_factor_winter`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Секция методики: fuel.q_summer.</summary>
    public class FuelQSummer : ISdaidDocumentSection
    {
        /// <summary>Идентификатор секции методики; тот же идентификатор стоит в XML-doc калькулятора.</summary>
        public static string MethodSectionId = "fuel.q_summer";

        public Type Document => typeof(DOC_NtsCalc);
        public Type Parent => typeof(FuelPassengerCar);
        public int Order => 450;
        public string Number => "";
        public string Name => "Нормативный расход в летний период, л";

        public string Body => """
        `methodSectionId: fuel.q_summer`

        Нормативный расход в летний период — расход на пробег с летним коэффициентом:

        $$Q^{лето} = Q_{пробег} \cdot (1 + 0{,}01 \cdot D^{лето})$$

        где:

        - $Q^{лето}$ — нормативный расход в летний период, л;
        - $Q_{пробег}$ — нормативный расход на пробег, л (секция `fuel.q_mileage`);
        - $D^{лето}$ — поправочный коэффициент к норме в летний период, % (секция `fuel.correction_factor_summer`).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }
}