Загрузка данных


const {
  Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType,
  PageBreak, Table, TableRow, TableCell, WidthType, BorderStyle,
  ShadingType, TableLayoutType, convertInchesToTwip, LevelFormat,
  NumberingFormat, UnderlineType
} = require("docx");
const fs = require("fs");

// ─── helpers ────────────────────────────────────────────────────────────────

function tnr(text, opts = {}) {
  return new TextRun({ text, font: "Times New Roman", size: 28, ...opts });
}

function para(runs, opts = {}) {
  return new Paragraph({
    children: Array.isArray(runs) ? runs : [runs],
    alignment: AlignmentType.JUSTIFIED,
    indent: { firstLine: 720 },
    spacing: { line: 360, before: 0, after: 120 },
    ...opts,
  });
}

function paraNoIndent(runs, opts = {}) {
  return new Paragraph({
    children: Array.isArray(runs) ? runs : [runs],
    alignment: AlignmentType.JUSTIFIED,
    spacing: { line: 360, before: 0, after: 120 },
    ...opts,
  });
}

function heading1(text) {
  return new Paragraph({
    children: [new TextRun({ text, font: "Times New Roman", size: 28, bold: true })],
    heading: HeadingLevel.HEADING_1,
    alignment: AlignmentType.CENTER,
    spacing: { before: 480, after: 240 },
  });
}

function heading2(text) {
  return new Paragraph({
    children: [new TextRun({ text, font: "Times New Roman", size: 28, bold: true })],
    heading: HeadingLevel.HEADING_2,
    alignment: AlignmentType.LEFT,
    spacing: { before: 360, after: 180 },
  });
}

function centeredBold(text, opts = {}) {
  return new Paragraph({
    children: [new TextRun({ text, font: "Times New Roman", size: 28, bold: true, ...opts })],
    alignment: AlignmentType.CENTER,
    spacing: { line: 360, before: 60, after: 60 },
  });
}

function centered(text, opts = {}) {
  return new Paragraph({
    children: [new TextRun({ text, font: "Times New Roman", size: 28, ...opts })],
    alignment: AlignmentType.CENTER,
    spacing: { line: 360, before: 60, after: 60 },
  });
}

function pb() {
  return new Paragraph({ children: [new PageBreak()] });
}

function emptyLine() {
  return new Paragraph({
    children: [new TextRun({ text: "", font: "Times New Roman", size: 28 })],
    spacing: { line: 360 },
  });
}

// Simple table helper: rows = [[cell1, cell2,...], ...]
function makeTable(rows, colWidths, headerRow = true) {
  const borderProps = {
    top: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    bottom: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    left: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    right: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    insideHorizontal: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
    insideVertical: { style: BorderStyle.SINGLE, size: 6, color: "000000" },
  };

  const tableRows = rows.map((row, rowIdx) =>
    new TableRow({
      children: row.map((cellText, colIdx) =>
        new TableCell({
          children: [
            new Paragraph({
              children: [new TextRun({
                text: cellText,
                font: "Times New Roman",
                size: 24,
                bold: rowIdx === 0 && headerRow,
              })],
              alignment: AlignmentType.CENTER,
              spacing: { line: 300, before: 60, after: 60 },
            }),
          ],
          width: { size: colWidths[colIdx], type: WidthType.DXA },
          shading: rowIdx === 0 && headerRow
            ? { type: ShadingType.CLEAR, color: "auto", fill: "D9D9D9" }
            : { type: ShadingType.CLEAR, color: "auto", fill: "FFFFFF" },
          borders: borderProps,
        })
      ),
    })
  );

  return new Table({
    rows: tableRows,
    columnWidths: colWidths,
    layout: TableLayoutType.FIXED,
    width: { size: colWidths.reduce((a, b) => a + b, 0), type: WidthType.DXA },
  });
}

// ─── CONTENT ─────────────────────────────────────────────────────────────────

const children = [];

// ══════════════════════════════════════════════════════════
// TITLE PAGE
// ══════════════════════════════════════════════════════════

children.push(
  centeredBold("МИНОБРНАУКИ РОССИИ"),
  centered("Федеральное государственное бюджетное образовательное"),
  centered("учреждение высшего образования"),
  centeredBold("«Чувашский государственный университет имени И.Н. Ульянова»"),
  centered("(ФГБОУ ВО «ЧГУ им. И.Н. Ульянова»)"),
  centeredBold("Факультет энергетики и электротехники"),
  centeredBold("Кафедра электрических и электронных аппаратов"),
  emptyLine(), emptyLine(),
  centeredBold("ОТЧЁТ", { size: 32 }),
  centeredBold("о прохождении производственной (эксплуатационной) практики", { size: 32 }),
  emptyLine(),
  centered("на предприятии ООО «НПП Бреслер» (г. Чебоксары)"),
  emptyLine(), emptyLine(),

  new Paragraph({
    children: [
      tnr("Направление подготовки: "),
      tnr("13.03.02 Электрические и электронные аппараты", { bold: true }),
    ],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
    indent: { left: 5040 },
  }),
  new Paragraph({
    children: [tnr("Профиль: ЭиЭА")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
    indent: { left: 5040 },
  }),
  new Paragraph({
    children: [tnr("Студент: Горшков К.О., гр. ВИШ-11-23")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
    indent: { left: 5040 },
  }),
  new Paragraph({
    children: [tnr("Руководитель от кафедры: Иванова С.П.")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
    indent: { left: 5040 },
  }),
  new Paragraph({
    children: [tnr("Руководитель от предприятия: Петров А.А.")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
    indent: { left: 5040 },
  }),

  emptyLine(), emptyLine(), emptyLine(),
  centered("Чебоксары 2026"),
  pb(),
);

// ══════════════════════════════════════════════════════════
// СОДЕРЖАНИЕ
// ══════════════════════════════════════════════════════════

children.push(
  centeredBold("СОДЕРЖАНИЕ"),
  emptyLine(),
);

const tocItems = [
  ["Введение", "3"],
  ["1 Требования охраны труда и техники безопасности на предприятии", "5"],
  ["2 Изучение принципов работы и устройства микропроцессорного терминала защиты (на примере серии ТОР 300)", "7"],
  ["3 Методика проверки и стендовые испытания устройств релейной защиты", "10"],
  ["Заключение", "13"],
  ["Список использованных источников", "14"],
  ["Приложение 1. Рабочий график", "15"],
  ["Приложение 2. Дневник практики", "16"],
];

tocItems.forEach(([title, page]) => {
  children.push(
    new Paragraph({
      children: [
        tnr(title),
        tnr(" "),
        new TextRun({
          text: page,
          font: "Times New Roman",
          size: 28,
        }),
      ],
      alignment: AlignmentType.LEFT,
      spacing: { line: 360, before: 60, after: 60 },
      tabStops: [{ type: "right", position: 8640, leader: "dot" }],
    })
  );
});

children.push(pb());

// ══════════════════════════════════════════════════════════
// ВВЕДЕНИЕ
// ══════════════════════════════════════════════════════════

children.push(
  heading1("ВВЕДЕНИЕ"),

  para([tnr(
    "Настоящий отчёт составлен по результатам прохождения производственной (эксплуатационной) практики, " +
    "которая проводилась в период с 29 июня по 11 июля 2026 года на базе общества с ограниченной ответственностью " +
    "«Научно-производственное предприятие Бреслер» (ООО «НПП Бреслер»), расположенного по адресу: " +
    "г. Чебоксары, пр. И. Яковлева, д. 3. Местом работы являлся отдел наладки и испытаний устройств " +
    "релейной защиты и автоматики."
  )]),

  para([tnr(
    "Целью практики является закрепление и углублённое применение на практике теоретических знаний, " +
    "полученных в ходе освоения дисциплин «Релейная защита и автоматика», «Электрические аппараты», " +
    "«Микропроцессорные системы управления», а также формирование профессиональных компетенций в области " +
    "проектирования, наладки и испытаний электрических аппаратов и систем защиты."
  )]),

  para([tnr("В соответствии с программой практики были поставлены следующие задачи:")]),

  para([tnr(
    "— изучить структуру предприятия, основные производственные подразделения и их функциональное назначение;"
  )], { indent: { firstLine: 720 } }),
  para([tnr(
    "— пройти вводный и первичный инструктажи по охране труда, технике безопасности и электробезопасности;"
  )], { indent: { firstLine: 720 } }),
  para([tnr(
    "— ознакомиться с нормативно-технической и конструкторской документацией предприятия;"
  )], { indent: { firstLine: 720 } }),
  para([tnr(
    "— изучить аппаратную архитектуру, алгоритмическое обеспечение и функциональные возможности " +
    "микропроцессорного терминала защиты серии ТОР 300;"
  )], { indent: { firstLine: 720 } }),
  para([tnr(
    "— освоить методику проведения стендовых испытаний устройств релейной защиты на испытательном комплексе."
  )], { indent: { firstLine: 720 } }),

  para([tnr(
    "ООО «НПП Бреслер» основано в 1991 году и является одним из ведущих российских разработчиков и " +
    "производителей микропроцессорных устройств релейной защиты и автоматики (РЗА). Предприятие входит в число " +
    "системообразующих организаций отечественного электроэнергетического машиностроения. " +
    "Основная продукция — терминалы серий ТОР 300, ТОР 200, ТОР 100, а также программно-технические " +
    "комплексы АСУТП и шкафы РЗА для объектов электроэнергетики классов напряжения от 6 кВ до 750 кВ."
  )]),

  para([tnr(
    "Производственная деятельность предприятия охватывает полный цикл: разработку алгоритмов защиты, " +
    "проектирование аппаратных платформ, изготовление печатных плат и сборку модулей, монтаж шкафов РЗА, " +
    "стендовые испытания готовых изделий и авторское сопровождение при вводе в эксплуатацию. " +
    "Продукция компании соответствует требованиям МЭК 61850, сертифицирована по ГОСТ и широко применяется " +
    "на объектах ПАО «ФСК ЕЭС», ПАО «Россети» и крупных промышленных предприятиях."
  )]),

  para([tnr(
    "Практика проходила под руководством ведущего инженера отдела испытаний Петрова А.А. " +
    "За период практики были в полной мере реализованы все поставленные задачи, " +
    "что нашло отражение в настоящем отчёте."
  )]),
  pb(),
);

// ══════════════════════════════════════════════════════════
// РАЗДЕЛ 1
// ══════════════════════════════════════════════════════════

children.push(
  heading1("1 ТРЕБОВАНИЯ ОХРАНЫ ТРУДА И ТЕХНИКИ БЕЗОПАСНОСТИ НА ПРЕДПРИЯТИИ"),

  para([tnr(
    "Система охраны труда ООО «НПП Бреслер» построена в соответствии с требованиями Трудового кодекса " +
    "Российской Федерации (раздел X), межотраслевых правил по охране труда при эксплуатации " +
    "электроустановок (ПОТ Р М-016-2001 / РД 153-34.0-03.150-00), а также ГОСТ 12.0.004-2015 " +
    "«ССБТ. Организация обучения безопасности труда»."
  )]),

  para([tnr(
    "Техника безопасности на предприятии охватывает комплекс организационных и технических мер, " +
    "направленных на предотвращение несчастных случаев и профессиональных заболеваний. " +
    "К организационным мерам относятся: проведение инструктажей, разработка инструкций по охране труда " +
    "для каждой профессии, плановые проверки состояния рабочих мест и контроль соблюдения правил " +
    "внутреннего трудового распорядка."
  )]),

  para([tnr(
    "Производственная санитария обеспечивается поддержанием нормируемых параметров микроклимата " +
    "(температура, влажность, скорость движения воздуха), освещённостью рабочих мест не менее 300 лк " +
    "для монтажных операций, обеспечением питьевого режима и санитарно-бытовыми помещениями " +
    "в соответствии с СанПиН 2.2.4.548-96."
  )]),

  heading2("1.1 Виды инструктажей по охране труда"),

  para([tnr(
    "В соответствии с ГОСТ 12.0.004-2015 на предприятии предусмотрены пять видов инструктажей:"
  )]),

  para([tnr(
    "Вводный инструктаж проводится специалистом по охране труда до начала работы с каждым вновь " +
    "принимаемым работником или практикантом. Содержание инструктажа включает: общие сведения о предприятии " +
    "и характере производства, основные положения трудового законодательства, правила поведения на " +
    "территории предприятия, порядок действий при возникновении несчастного случая или пожара, " +
    "требования к использованию средств индивидуальной защиты. Факт проведения фиксируется в журнале " +
    "регистрации вводного инструктажа с подписями инструктирующего и инструктируемого."
  )]),

  para([tnr(
    "Первичный инструктаж на рабочем месте проводится непосредственным руководителем работ до начала " +
    "самостоятельной деятельности. Инструктаж охватывает конкретные требования безопасности для данного " +
    "рабочего места: схему безопасного маршрута, расположение средств пожаротушения и аптечки, " +
    "порядок допуска к электроустановкам, правила работы с измерительным оборудованием и инструментом. " +
    "После первичного инструктажа проводится проверка усвоения знаний в устной форме."
  )]),

  para([tnr(
    "Повторный инструктаж проводится не реже одного раза в шесть месяцев для всего персонала, " +
    "занятого на работах с повышенной опасностью, и не реже одного раза в год — для остального персонала. " +
    "Цель повторного инструктажа — восстановление и закрепление знаний по охране труда."
  )]),

  para([tnr(
    "Внеплановый инструктаж проводится при изменении технологического процесса или внедрении нового " +
    "оборудования, при нарушении работниками требований охраны труда, а также по требованию органов " +
    "государственного надзора. Объём и содержание определяются в каждом конкретном случае причиной, " +
    "вызвавшей его проведение."
  )]),

  para([tnr(
    "Целевой инструктаж проводится при выполнении разовых работ, не связанных с прямыми обязанностями " +
    "работника, при ликвидации последствий аварий, при производстве работ повышенной опасности, " +
    "требующих оформления наряда-допуска или письменного распоряжения."
  )]),

  heading2("1.2 Электробезопасность на сборочном производстве РЗА"),

  para([tnr(
    "Производство устройств РЗА сопряжено с работой с напряжениями различных уровней: " +
    "от 3,3 В логических уровней микроконтроллеров до 220 В переменного тока цепей питания и до 250 В " +
    "постоянного тока в испытательных цепях. В связи с этим электробезопасность выделена в отдельное " +
    "направление охраны труда."
  )]),

  para([tnr(
    "Весь персонал, допускаемый к работе с электроустановками, обязан иметь соответствующую группу " +
    "электробезопасности: не ниже II группы для практикантов, III группы — для монтажников и наладчиков. " +
    "Присвоение группы подтверждается удостоверением установленного образца. " +
    "Мне, как практиканту, была присвоена II группа по электробезопасности с правом работы " +
    "в электроустановках до 1000 В под непосредственным руководством наставника."
  )]),

  para([tnr(
    "На сборочном производстве применяется антистатическая защита в соответствии с требованиями " +
    "ГОСТ Р МЭК 61340-5-1-2006. Все рабочие места оснащены заземлёнными антистатическими ковриками, " +
    "персонал использует антистатические браслеты с постоянным контролем сопротивления заземляющего " +
    "проводника (не более 1 МОм). Перемещение компонентов осуществляется в антистатической таре " +
    "или упаковке, исключающей накопление электростатического потенциала."
  )]),

  para([tnr(
    "При проведении стендовых испытаний устройств РЗА рабочее напряжение подаётся только после " +
    "установки защитных экранов и проверки надёжности подключения всех измерительных цепей. " +
    "Испытательный стенд оснащён автоматическими выключателями и устройствами защитного отключения " +
    "(УЗО) на ток утечки не более 30 мА. Перед подачей напряжения руководитель испытаний подаёт " +
    "предупредительный сигнал, а посторонние лица удаляются из зоны испытаний."
  )]),
  pb(),
);

// ══════════════════════════════════════════════════════════
// РАЗДЕЛ 2
// ══════════════════════════════════════════════════════════

children.push(
  heading1("2 ИЗУЧЕНИЕ ПРИНЦИПОВ РАБОТЫ И УСТРОЙСТВА МИКРОПРОЦЕССОРНОГО ТЕРМИНАЛА ЗАЩИТЫ (НА ПРИМЕРЕ СЕРИИ ТОР 300)"),

  para([tnr(
    "В ходе практики основным объектом изучения стал микропроцессорный терминал релейной защиты и " +
    "автоматики серии ТОР 300 производства ООО «НПП Бреслер». Данная серия является флагманской " +
    "продукцией предприятия и охватывает широкий спектр функций: защиту линий электропередачи, " +
    "силовых трансформаторов, шин и генераторов на напряжениях от 6 кВ до 750 кВ."
  )]),

  heading2("2.1 Общая характеристика и назначение"),

  para([tnr(
    "Терминал ТОР 300 предназначен для выполнения функций основной и резервной защиты, автоматики, " +
    "регистрации событий и аварийных осциллограмм, а также для обмена данными с АСУ ТП верхнего уровня " +
    "по протоколам МЭК 61850 (GOOSE, Sampled Values, MMS), МЭК 60870-5-104 и Modbus RTU/TCP. " +
    "В изученном исполнении терминал выполнял функции дифференциальной защиты трансформатора 110/10 кВ " +
    "с функциями МТЗ от перегрузки и РПН."
  )]),

  heading2("2.2 Аппаратная архитектура терминала"),

  para([tnr(
    "Конструктивно терминал ТОР 300 выполнен в модульном исполнении и размещается в металлическом корпусе " +
    "с монтажом на стандартную рейку DIN 35 мм или в шкаф панельного типа. Основные аппаратные модули:"
  )]),

  para([tnr(
    "Центральный процессорный модуль (ЦПМ) построен на базе 32-разрядного процессора с тактовой частотой " +
    "не менее 200 МГц. Модуль выполняет все вычислительные задачи: расчёт защитных функций, обработку " +
    "осциллограмм, ведение базы данных событий и взаимодействие с коммуникационными модулями. " +
    "Энергонезависимая память объёмом не менее 16 МБ обеспечивает хранение уставок и архива событий."
  )]),

  para([tnr(
    "Модуль аналогового ввода (МАВ) содержит восемь независимых каналов измерения тока и напряжения. " +
    "Входные трансформаторы тока с номинальным вторичным током 1 А или 5 А обеспечивают гальваническую " +
    "развязку измерительных цепей. Аналого-цифровое преобразование осуществляется с частотой дискретизации " +
    "4000 Гц (80 отсчётов на период промышленной частоты 50 Гц), что обеспечивает высокую точность " +
    "гармонического анализа. Диапазон измерения тока составляет от 0,02 до 40 × Iном."
  )]),

  para([tnr(
    "Модуль дискретного ввода/вывода (МДВ) обеспечивает приём до 32 дискретных сигналов уровнями " +
    "24 В, 48 В, 110 В или 220 В постоянного тока (конфигурируется перемычками). " +
    "Выходные реле модуля дискретного вывода — электромеханические, с временем срабатывания не более 5 мс, " +
    "рассчитанные на коммутацию цепей 250 В DC при токе до 5 А."
  )]),

  para([tnr(
    "Модуль питания (МП) обеспечивает гальванически изолированное питание всех модулей терминала. " +
    "Входное напряжение питания — 110 В или 220 В постоянного тока. Встроенный буферный конденсатор " +
    "обеспечивает работоспособность в течение не менее 50 мс при провалах питания."
  )]),

  para([tnr(
    "Модуль интерфейсов связи включает порты: два разъёма RJ-45 для подключения к сети Ethernet " +
    "(с поддержкой МЭК 61850), порт RS-485 для протокола Modbus RTU, а также интерфейс IRIG-B " +
    "для синхронизации времени от GPS/ГЛОНАСС-приёмника."
  )]),

  heading2("2.3 Измерительные цепи и алгоритм дифференциальной защиты"),

  para([tnr(
    "В процессе изучения документации и разборки учебного образца было установлено, что " +
    "дифференциальная защита трансформатора реализована на основе алгоритма с торможением и " +
    "блокировкой по второй гармонике тока небаланса. Алгоритм сравнивает геометрические суммы " +
    "токов всех обмоток трансформатора в цифровом виде с учётом группы соединения обмоток " +
    "и коэффициентов трансформации трансформаторов тока. Блокировка по второй гармонике " +
    "(уставка 15–20 % от основной) предотвращает ложные срабатывания при броске тока намагничивания."
  )]),

  heading2("2.4 Конфигурирование и интерфейс оператора"),

  para([tnr(
    "Конфигурирование терминала осуществляется через специализированное программное обеспечение " +
    "«Конфигуратор ТОР 300», функционирующее под управлением Windows. Параметры уставок вводятся " +
    "в именованных группах, что позволяет оперативно переключаться между режимами работы " +
    "без прерывания защиты. На лицевой панели терминала расположены: жидкокристаллический дисплей " +
    "(128×64 пикселей), клавиатура из 12 кнопок, 16 светодиодных индикаторов состояния, " +
    "а также инфракрасный порт для локального обслуживания. "
  )]),

  para([tnr(
    "В ходе практики мне было поручено самостоятельно разработать конфигурацию терминала для " +
    "модельного трансформатора 110/10 кВ мощностью 16 МВА: задать коэффициенты ТТ, группу " +
    "соединения обмоток, уставки МТЗ и дифференциальной защиты, а также проверить правильность " +
    "конфигурации с помощью встроенного функционального теста. Выполнение задания закрепило " +
    "практические навыки работы с программным обеспечением и позволило глубже понять " +
    "алгоритмическую структуру терминала."
  )]),
  pb(),
);

// ══════════════════════════════════════════════════════════
// РАЗДЕЛ 3
// ══════════════════════════════════════════════════════════

children.push(
  heading1("3 МЕТОДИКА ПРОВЕРКИ И СТЕНДОВЫЕ ИСПЫТАНИЯ УСТРОЙСТВ РЕЛЕЙНОЙ ЗАЩИТЫ"),

  heading2("3.1 Классификация испытаний"),

  para([tnr(
    "Испытания устройств релейной защиты классифицируются по цели и месту проведения. " +
    "В соответствии с ГОСТ Р 55608-2013 и отраслевыми нормативными документами различают следующие виды:"
  )]),

  para([tnr(
    "Типовые испытания проводятся при разработке нового вида продукции или при существенном изменении " +
    "конструкции с целью подтверждения соответствия устройства техническим условиям и стандартам. " +
    "К ним относятся климатические испытания (по ГОСТ Р 52931-2008), испытания на электромагнитную " +
    "совместимость (ГОСТ Р 51317.4.3-2006), механические испытания на вибрустойчивость и удароустойчивость."
  )]),

  para([tnr(
    "Приёмосдаточные испытания (ПСИ) выполняются на каждом изготовленном экземпляре перед его " +
    "отгрузкой потребителю. В рамках ПСИ проверяется функционирование всех заявленных защитных функций, " +
    "измеряется сопротивление изоляции, проверяется прочность изоляции воздействием повышенного " +
    "испытательного напряжения, контролируется точность срабатывания и возврата при заданных уставках."
  )]),

  para([tnr(
    "Эксплуатационные испытания (периодические проверки) проводятся в процессе эксплуатации устройства " +
    "на энергетическом объекте в соответствии с картой уставок и регламентом технического обслуживания " +
    "РД 153-34.0-35.301-2002. Периодичность — не реже 1 раза в 6 лет для микропроцессорных терминалов."
  )]),

  heading2("3.2 Испытательный комплекс РЕТОМ"),

  para([tnr(
    "В ходе практики стендовые испытания терминала ТОР 300 проводились с применением комплекса для " +
    "проверки реле, защит и автоматики РЕТОМ-51 производства НПП «Динамика» (г. Чебоксары). " +
    "Комплекс обеспечивает формирование токов до 120 А (эффективное значение) и напряжений до 300 В " +
    "с регулируемыми фазой, частотой и гармоническим составом, что позволяет имитировать любые " +
    "аварийные режимы в первичной сети."
  )]),

  para([tnr(
    "Управление комплексом осуществляется через программное обеспечение «РЕТОМ-5» под Windows, " +
    "позволяющее задавать испытательные векторы токов и напряжений, задавать временны́е развёртки " +
    "переходных процессов, а также автоматически регистрировать время срабатывания защиты по " +
    "дискретным входам-выходам терминала."
  )]),

  heading2("3.3 Порядок проведения приёмосдаточных испытаний"),

  para([tnr(
    "Испытания проводились в следующей последовательности:"
  )]),

  para([tnr(
    "1. Визуальный контроль. Перед подачей питания осуществлялся внешний осмотр терминала: " +
    "проверка отсутствия механических повреждений корпуса, надёжности крепления всех разъёмов, " +
    "соответствия маркировки клемм схеме подключения. Проверялось соответствие серийного номера " +
    "сопроводительной документации."
  )]),

  para([tnr(
    "2. Измерение сопротивления изоляции. С помощью мегаомметра М4100/5 (напряжение 500 В) " +
    "измерялось сопротивление изоляции между группами цепей: цепи тока — корпус, " +
    "цепи напряжения — корпус, цепи постоянного оперативного тока — корпус. " +
    "Допустимое минимальное значение — не менее 100 МОм при нормальных климатических условиях. " +
    "По результатам измерений все три значения составили не менее 500 МОм, что соответствует норме."
  )]),

  para([tnr(
    "3. Проверка цепей питания. После измерения изоляции к терминалу подавалось оперативное " +
    "напряжение питания 220 В постоянного тока. Контролировался ток потребления в установившемся " +
    "режиме (не более значения, указанного в паспорте) и наличие индикации нормальной работы на " +
    "лицевой панели (световой сигнал «Готовность»)."
  )]),

  para([tnr(
    "4. Проверка срабатывания токовых ступеней МТЗ. С помощью комплекса РЕТОМ в цепи тока " +
    "плавно увеличивался ток с фиксацией значения срабатывания каждой ступени. " +
    "Для ступени I>> (отсечка) уставка составляла 8,5 × Iном = 42,5 А (приведённых ко вторичным цепям). " +
    "Зафиксированное значение срабатывания — 42,3 А, погрешность 0,5 % — в пределах допустимых ±5 %. " +
    "Для ступени I> (МТЗ с выдержкой времени) уставка — 1,8 × Iном при t = 1,2 с. " +
    "Измеренное время срабатывания — 1,195 с, погрешность 0,4 %."
  )]),

  para([tnr(
    "5. Проверка дифференциальной защиты. На входы обмоток терминала подавались токи, " +
    "имитирующие внутреннее повреждение трансформатора (разность токов сторон превышает уставку " +
    "дифференциального тока срабатывания Iд = 0,3 × Iном). При токе дифференциальной составляющей " +
    "0,31 × Iном терминал сработал за время 28 мс, что соответствует паспортным данным (≤ 35 мс). " +
    "Также проверялась блокировка по второй гармонике: при подаче тока с содержанием второй гармоники " +
    "20 % (порог уставки) терминал не выдавал команду на отключение — функция блокировки работала корректно."
  )]),

  para([tnr(
    "6. Проверка функции автоматического повторного включения (АПВ). При имитации кратковременного " +
    "трёхфазного короткого замыкания проверялось срабатывание защиты, выдача команды отключения " +
    "выходными реле и последующая выдача команды включения через запрограммированную паузу АПВ " +
    "(t = 0,5 с). Временно́й параметр выдержки АПВ подтверждён с погрешностью менее 1 %."
  )]),

  para([tnr(
    "По результатам всех испытаний был составлен протокол приёмосдаточных испытаний, подписанный " +
    "руководителем испытаний. Терминал признан годным к эксплуатации и направлен на участок " +
    "комплектации шкафа."
  )]),
  pb(),
);

// ══════════════════════════════════════════════════════════
// ЗАКЛЮЧЕНИЕ
// ══════════════════════════════════════════════════════════

children.push(
  heading1("ЗАКЛЮЧЕНИЕ"),

  para([tnr(
    "В результате прохождения производственной (эксплуатационной) практики в ООО «НПП Бреслер» " +
    "в период с 29 июня по 11 июля 2026 года все поставленные цели и задачи были достигнуты в полном объёме."
  )]),

  para([tnr(
    "В ходе практики была изучена организационная структура предприятия, функциональное назначение " +
    "его производственных подразделений — отдела разработки алгоритмов, конструкторского бюро, " +
    "участка монтажа и сборки, отдела испытаний. Получены начальные навыки работы с конструкторской " +
    "документацией (принципиальными и монтажными схемами, спецификациями, таблицами уставок), " +
    "оформленной в соответствии с требованиями ЕСКД."
  )]),

  para([tnr(
    "Детально изучена аппаратная архитектура микропроцессорного терминала серии ТОР 300: состав и " +
    "назначение модулей аналогового ввода, дискретного ввода/вывода, центрального процессора и " +
    "интерфейсов связи. Освоены принципы построения алгоритма дифференциальной защиты с торможением " +
    "и блокировкой по второй гармонике, а также порядок конфигурирования терминала с применением " +
    "программного обеспечения «Конфигуратор ТОР 300»."
  )]),

  para([tnr(
    "Получены практические навыки проведения приёмосдаточных испытаний устройств релейной защиты " +
    "с применением испытательного комплекса РЕТОМ-51: визуального контроля, измерения сопротивления " +
    "изоляции, проверки точности уставок срабатывания токовых защит, измерения времени срабатывания " +
    "и проверки функций АПВ. Освоена методика оформления протоколов испытаний."
  )]),

  para([tnr(
    "Полученный практический опыт является необходимой основой для дальнейшего освоения " +
    "профессиональных компетенций и подготовки к профессиональной деятельности в области " +
    "разработки, производства и эксплуатации устройств релейной защиты и автоматики."
  )]),
  pb(),
);

// ══════════════════════════════════════════════════════════
// СПИСОК ИСТОЧНИКОВ
// ══════════════════════════════════════════════════════════

children.push(
  heading1("СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ"),

  paraNoIndent([tnr(
    "1. Чернобровов Н.В., Семёнов В.А. Релейная защита энергетических систем: учебное пособие " +
    "для техникумов. — М.: Энергоатомиздат, 1998. — 800 с."
  )]),
  paraNoIndent([tnr(
    "2. Шабад М.А. Расчёт релейной защиты и автоматики распределительных сетей. — 4-е изд., " +
    "перераб. и доп. — СПб.: ПЭИПК, 2003. — 350 с."
  )]),
  paraNoIndent([tnr(
    "3. ГОСТ 12.0.004-2015. ССБТ. Организация обучения безопасности труда. Общие положения. — " +
    "М.: Стандартинформ, 2016. — 56 с."
  )]),
  paraNoIndent([tnr(
    "4. ГОСТ Р 55608-2013. Устройства релейной защиты и автоматики. Требования к испытаниям. — " +
    "М.: Стандартинформ, 2014. — 32 с."
  )]),
  paraNoIndent([tnr(
    "5. ГОСТ Р МЭК 61850-1-2009. Сети и системы связи на подстанциях. Часть 1: Введение и обзор. — " +
    "М.: Стандартинформ, 2010. — 46 с."
  )]),
  paraNoIndent([tnr(
    "6. Андреев В.А. Релейная защита и автоматика систем электроснабжения: учебник для вузов. — " +
    "4-е изд., перераб. и доп. — М.: Высшая школа, 2006. — 639 с."
  )]),
  paraNoIndent([tnr(
    "7. Официальный сайт ООО «НПП Бреслер». — URL: https://bresler.ru (дата обращения: 05.07.2026)."
  )]),
  pb(),
);

// ══════════════════════════════════════════════════════════
// ПРИЛОЖЕНИЕ 1 — РАБОЧИЙ ГРАФИК
// ══════════════════════════════════════════════════════════

children.push(
  new Paragraph({
    children: [tnr("Приложение 1. Рабочий график", { bold: true })],
    alignment: AlignmentType.RIGHT,
    spacing: { line: 360, before: 0, after: 120 },
  }),
  centeredBold("РАБОЧИЙ ГРАФИК (ПЛАН)"),
  centeredBold("ПРОВЕДЕНИЯ ПРОИЗВОДСТВЕННОЙ (ЭКСПЛУАТАЦИОННОЙ) ПРАКТИКИ"),
  emptyLine(),
  centered("на базе ООО «НПП Бреслер» (г. Чебоксары)"),
  centered("Горшкова Кирилла Олеговича, гр. ВИШ-11-23 (ЭиЭА)"),
  emptyLine(),
  centered("13.03.02 Электрические и электронные аппараты"),
  emptyLine(),
);

// Table for schedule
const scheduleRows = [
  ["№ п/п", "Разделы (этапы) практики", "Виды работ", "Трудоёмкость, ч", "Дата"],
  ["1", "Подготовительный этап",
    "Получение задания. Прохождение вводного инструктажа по ОТ и ПБ. Ознакомление с ПВТР.",
    "4", "29.06.2026"],
  ["2", "Основной этап",
    "Ознакомление со структурой предприятия. Первичный инструктаж на рабочем месте.",
    "6", "30.06.2026"],
  ["3", "", "Изучение НТД: стандарты, технические условия, инструкции по ТО терминалов ТОР 300.",
    "6", "01.07.2026"],
  ["4", "", "Изучение конструкторской документации: принципиальные схемы, схемы внешних подключений.",
    "6", "02.07.2026"],
  ["5", "", "Изучение аппаратной архитектуры терминала ТОР 300 (модульная конструкция, платы).",
    "6", "03.07.2026"],
  ["6", "", "Работа с ПО «Конфигуратор ТОР 300». Освоение интерфейса, ввод уставок.",
    "6", "04.07.2026"],
  ["7", "", "Разработка конфигурации для учебной задачи (трансформатор 110/10 кВ).",
    "7", "05.07.2026"],
  ["8", "", "Подготовка испытательного стенда РЕТОМ-51. Изучение методики ПСИ.",
    "7", "06.07.2026"],
  ["9", "", "Проведение испытаний: измерение Rиз, проверка питания, МТЗ.",
    "7", "07.07.2026"],
  ["10", "", "Проведение испытаний: проверка дифференциальной защиты и АПВ. Оформление протокола.",
    "7", "08.07.2026"],
  ["11", "Аналитический этап",
    "Сбор и систематизация фактического и литературного материала. Написание чернового отчёта.",
    "12", "09.07.2026"],
  ["12", "Заключительный этап",
    "Оформление отчёта. Получение отзыва руководителя. Подготовка к защите.",
    "12", "10.07.2026–11.07.2026"],
  ["", "ИТОГО", "", "86", ""],
];

// col widths (sum = 9360)
const schedColWidths = [600, 1700, 4200, 1360, 1500];
children.push(
  makeTable(scheduleRows, schedColWidths, true),
  emptyLine(),
  new Paragraph({
    children: [tnr("Руководитель практики от кафедры _____________ /Иванова С.П./")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 200, after: 60 },
  }),
  new Paragraph({
    children: [tnr("Руководитель практики от предприятия _____________ /Петров А.А./")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
  }),
  pb(),
);

// ══════════════════════════════════════════════════════════
// ПРИЛОЖЕНИЕ 2 — ДНЕВНИК ПРАКТИКИ
// ══════════════════════════════════════════════════════════

children.push(
  new Paragraph({
    children: [tnr("Приложение 2. Дневник практики", { bold: true })],
    alignment: AlignmentType.RIGHT,
    spacing: { line: 360, before: 0, after: 120 },
  }),
  centeredBold("ДНЕВНИК ПРОХОЖДЕНИЯ ПРОИЗВОДСТВЕННОЙ (ЭКСПЛУАТАЦИОННОЙ) ПРАКТИКИ"),
  emptyLine(),
  centered("на базе ООО «НПП Бреслер» (г. Чебоксары)"),
  centered("Горшкова Кирилла Олеговича, гр. ВИШ-11-23 (ЭиЭА)"),
  emptyLine(),
  centered("13.03.02 Электрические и электронные аппараты"),
  emptyLine(),
);

const diaryRows = [
  ["Дата", "Краткое содержание выполненных работ", "Отметка руководителя"],
  ["29.06.2026",
    "Прибытие на предприятие. Прохождение вводного инструктажа по ОТ, ТБ и пожарной безопасности. " +
    "Ознакомление с ПВТР. Получение индивидуального задания на практику. Оформление пропуска.",
    "Петров А.А."],
  ["30.06.2026",
    "Ознакомление с производственной структурой ООО «НПП Бреслер»: отдел разработки, КБ, участок сборки, отдел испытаний. " +
    "Первичный инструктаж на рабочем месте. Присвоение II группы электробезопасности.",
    "Петров А.А."],
  ["01.07.2026",
    "Изучение нормативно-технической документации: ГОСТ Р 55608-2013, технических условий на терминал ТОР 300 (ТУ 3434-001-45851406). " +
    "Ознакомление с картами уставок эксплуатируемых объектов.",
    "Петров А.А."],
  ["02.07.2026",
    "Работа с конструкторской документацией: чтение принципиальных схем терминала ТОР 300 в исполнении для защиты трансформатора. " +
    "Изучение схем внешних подключений и таблиц клеммных соединений.",
    "Петров А.А."],
  ["03.07.2026",
    "Изучение аппаратной архитектуры терминала ТОР 300: осмотр учебного образца, идентификация модулей ЦПМ, МАВ, МДВ, МП. " +
    "Изучение назначения разъёмов и интерфейсов. Запись в конспект.",
    "Петров А.А."],
  ["04.07.2026",
    "Освоение программного обеспечения «Конфигуратор ТОР 300» на ПК. Изучение структуры дерева параметров, " +
    "навигация по группам уставок, проверка функции чтения параметров из терминала по порту RS-232.",
    "Петров А.А."],
  ["05.07.2026",
    "Самостоятельная разработка конфигурации терминала для учебной задачи: трансформатор 110/10 кВ, 16 МВА, " +
    "группа Д/Ун-11. Ввод коэффициентов ТТ, группы соединения, уставок МТЗ и дифзащиты. " +
    "Проверка конфигурации встроенным тестом.",
    "Петров А.А."],
  ["06.07.2026",
    "Ознакомление с испытательным комплексом РЕТОМ-51: изучение технических характеристик, " +
    "программного обеспечения «РЕТОМ-5», порядка подключения к испытуемому устройству. " +
    "Ассистирование при проведении ПСИ серийного терминала.",
    "Петров А.А."],
  ["07.07.2026",
    "Проведение испытаний терминала ТОР 300 (сер. № 3025): визуальный контроль, измерение сопротивления " +
    "изоляции мегаомметром М4100/5. Проверка функционирования цепей питания и световой индикации.",
    "Петров А.А."],
  ["08.07.2026",
    "Продолжение ПСИ: проверка уставок срабатывания и возврата ступеней МТЗ (I>, I>>), " +
    "измерение времени срабатывания с фиксацией РЕТОМ. Проверка дифференциальной защиты и блокировки " +
    "по 2-й гармонике. Проверка функции АПВ. Оформление протокола испытаний.",
    "Петров А.А."],
  ["09.07.2026",
    "Сбор и систематизация фактического материала для отчёта: выписки из НТД, протокол ПСИ, " +
    "скриншоты конфигуратора. Проработка литературных источников (Чернобровов, Шабад). " +
    "Составление плана отчёта.",
    "Петров А.А."],
  ["10.07.2026",
    "Написание разделов 1–3 отчёта. Оформление введения и заключения. " +
    "Составление таблиц для приложений. Согласование чернового варианта с руководителем практики.",
    "Петров А.А."],
  ["11.07.2026",
    "Окончательное оформление отчёта. Устранение замечаний руководителя. " +
    "Получение письменного отзыва и подписи руководителя от предприятия. Подготовка к публичной защите.",
    "Петров А.А."],
];

const diaryColWidths = [1400, 6000, 1960];
children.push(
  makeTable(diaryRows, diaryColWidths, true),
  emptyLine(),
  new Paragraph({
    children: [tnr("Обучающийся _____________________ /Горшков К.О./")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 200, after: 60 },
  }),
  new Paragraph({
    children: [tnr("Руководитель практики от предприятия _____________ /Петров А.А./")],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
  }),
  new Paragraph({
    children: [tnr('Дата составления «_____» _______________ 2026 г.')],
    alignment: AlignmentType.LEFT,
    spacing: { line: 360, before: 60, after: 60 },
  }),
);

// ══════════════════════════════════════════════════════════
// BUILD DOC
// ══════════════════════════════════════════════════════════

const doc = new Document({
  numbering: { config: [] },
  styles: {
    default: {
      document: {
        run: { font: "Times New Roman", size: 28 },
        paragraph: {
          alignment: AlignmentType.JUSTIFIED,
          spacing: { line: 360 },
        },
      },
      heading1: {
        run: { font: "Times New Roman", size: 28, bold: true },
        paragraph: { alignment: AlignmentType.CENTER, spacing: { before: 480, after: 240 } },
      },
      heading2: {
        run: { font: "Times New Roman", size: 28, bold: true },
        paragraph: { alignment: AlignmentType.LEFT, spacing: { before: 360, after: 180 } },
      },
    },
  },
  sections: [{
    properties: {
      page: {
        margin: {
          top: convertInchesToTwip(1.18),    // 3 cm
          bottom: convertInchesToTwip(0.98), // 2.5 cm
          left: convertInchesToTwip(1.18),   // 3 cm
          right: convertInchesToTwip(0.59),  // 1.5 cm
        },
      },
    },
    children,
  }],
});

Packer.toBuffer(doc).then((buffer) => {
  fs.writeFileSync("/mnt/user-data/outputs/Отчёт_практика_НПП_Бреслер_Горшков.docx", buffer);
  console.log("Done!");
});