Как идёт экспорт
Экспорт по расписанию: Bimit, TRM на диск и резерв
Документ описывает технический поток одного экспорта документа при срабатывании расписания: как CAD вызывается один раз и как распределяются цели Bimit / TRM / резерв.
Общее руководство по расписанию: Подробное руководство.
Главное: CAD экспортируется один раз
Независимо от числа целей (ExportToBimit, ExportToDisk) для каждого документа вызывается один DocumentService.Export() и один пакет IPC-команд в CAD (EXPORT_IFC, EXPORT_2D, EXPORT_SHEETS).
Повторный запуск CAD или второй вызов Export() / GetTRM() для тех же артефактов не выполняется.
| Цель | Когда срабатывает | Повторный CAD? | |
| Bimit | В колбэках после ответа CAD | Нет | |
| TRM на диск (папка расписания) | В `CompleteExport` из `TrmPathModel` | Нет | |
| Резерв в «Документы» | В `CompleteExport`, только если загрузка в Bimit упала | Нет |
Отдельный путь GetTRM() → Export(upload: false) используется только для ручного «Выгрузить TRM» (диалог TRM Light), не для расписания с двумя галками.
Настройки расписания (на документ)
ScheduledExportService.ApplyScheduleExportOptions задаёт DocumentExportOptions:
SaveTrmToDisk ← schedule.ExportToDisk
OutputFolder ← {ExportOutputFolder}/{название документа}/
Затем один раз: documentService.Export().
Диаграмма потока

Режимы
Только Bimit
- CAD → IFC/PDF один раз
2. Загрузка в Bimit API
3. TRM на диск не создаётся
Только TRM на диск
- CAD → IFC/PDF один раз
2. Bimit не вызывается
3. TRM zip в {папка расписания}/{документ}/
Bimit + TRM на диск (оба включены)
- CAD → IFC/PDF один раз
2. В колбэках: параллельно загрузка в Bimit и накопление путей в TrmPathModel
3. В CompleteExport: упаковка TRM zip в папку расписания (те же файлы, без повторного CAD)
Bimit недоступен (резерв)
- CAD → артефакты как обычно
2. Ошибка UploadIFC / UploadPDF → не прерывает экспорт
3. TRM сохраняется в Документы\IFCAnchor\Экспорт Bimit (резерв)\{документ}\
4. Пользователь видит предупреждение (snackbar + журнал расписания)
5. Если дополнительно включён TRM на диск — сохранение в папку расписания тоже выполняется (при успехе)
Ключевые точки в коде
| Шаг | Файл | |
| Один вызов Export по расписанию | `Service/Scheduling/ScheduledExportService.cs` | |
| Установка флагов | `ApplyScheduleExportOptions` | |
| Один пакет IPC | `Service/CADS/Archicad/ArchicadDocumentService.Export` | |
| Bimit + сбор TRM в колбэках | `Callback3d`, `ProcessDrawingExportCallback` | |
| Финализация TRM / резерв | `CompleteExport`, `TrySaveBimitUploadFallback` | |
| Упаковка zip | `Service/TrmServices/DocumentTrmDiskExportService.cs` | |
| UI: галки расписания | `WpfApp/Features/Shedule/ScheduleExportSettingsPanel.xaml` |
Содержимое TRM на диске: что в zip, что рядом
По формату TRM IFC не кладётся внутрь zip. В архив попадают PDF, .enc (метаданные видов) и info.xml; IFC копируется в ту же папку, что и zip.
| Файл | Где оказывается | |
| `{документ}.zip` | Папка документа (TRM-контейнер без IFC) | |
| `*.ifc` / `*.ifczip` | Рядом с zip, в той же папке | |
| PDF, `.enc` | Внутри zip |
Реализация: DocumentTrmDiskExportService.CopyIfExists — для .ifc/.ifczip вызывается PlaceIfcBesideZip (копия в каталог zip-файла, не в temp перед архивацией). То же в TrmService для ручного TRM.
Структура папок при TRM на диск
{Название документа 1}/
{Название документа 1}.zip ← PDF, .enc, info.xml
model.ifc ← отдельно, рядом с zip
{Название документа 2}/
...
Резерв при сбое Bimit (та же схема файлов):
{Название документа}/
{Название документа}.zip
*.ifc