The Jerusalem PostMojtaba Khamenei was injured prior to Iran war, pulled from hospital rubble, Iranian official saysCNN TürkSON DAKİKA... Ömer Çelik: Usulsüzlükle mücadele tavizsiz verilecektirInquirerMarcos declares local holidays in 5 towns across PHDaily MaverickWORLD NEWS DAY OP-ED: Journalism faces a moral test in the age of AI-driven misinformationPunchGunmen kill 27 in South Africa shootingsSözcüRüya görmek beyin enerjisini tüketiyorBBC عربيإيران تنتظر رداً أمريكياً على مقترحها، وتتوقع هجوماً جديداً من واشنطنRai NewsIl Papa in Francia, la Messa a Lourdes: "Gli abusi sono una piaga, ci sia massima vigilanza"Il Fatto QuotidianoA 29 anni correva maratone, oggi ha bisogno dell’ossigeno per respirare: “Pensavo fosse solo stitichezza, ma era un tumore all’intestino”Guardian SportAustralia v South Africa: international men’s rugby union Test – livekickerOlympia in München: Das Konzept und die ProblemePremium TimesECOWAS Free Movement: Nigeria seeks balance between mobility, security
The Daily Newsstand · Free, Always
Sunday, September 27, 2026

Как я автоматизировал работу врачей на Rust

Translate

qMS работает х.уво, когда нужно подготовить выписку и пакет документов для передачи пациента в другое учреждение. Направление 057/у в системе уже заполнено: там есть ФИО, дата рождения, полис, адрес, повод обращения. Но дальше начинается бюрократия. Те же данные приходится переносить в выписку 027/у, обследования искать по разным файлам, фотографии пересылать с телефона на компьютер. Затем переводить ODT в PDF, собирать всё в нужном порядке и уменьшать итоговый файл. Одно направление готово, а работа с документами только началась.

На такой пакет уходило около 40 минут. Почти всё это время съедали повторный ввод и сборка файлов. Поэтому сделал «МеДок» на Rust. С ним оформление занимает 5–10 минут: программа забирает реквизиты из направления, помогает подготовить выписку и собирает пакет в один PDF. Диагноз, анамнез и осмотр врач пишет и проверяет сам.

Как идёт документ

На входе — направление 057/у, выгруженное из qMS в ODT. Я перетаскиваю его в окно «МеДока». Программа читает поля направления и заполняет форму выписки. Данные можно исправить вручную: например, в направлении указан адрес регистрации, а в выписке нужен фактический адрес проживания.

После этого врач дописывает медицинскую часть и сохраняет выписку 027/у в PDF. Если нужен пакет для другого учреждения, к нему добавляются исходное направление, результаты обследований, сканы и фотографии. Направление идёт первым, выписка — второй, остальные документы — за ними. Получается один файл, который можно открыть и проверить перед отправкой.

flowchart LR
    A["qMS: направление 057/у · ODT"] --> B["Разбор ODT: ZIP и XML"]
    B --> C["app.rs: форма и проверка · egui"]
    C --> D["vypiska.rs + шаблон Typst"]
    D --> E["Выписка 027/у · PDF"]
    A --> F["LibreOffice: ODT → PDF"]
    F --> G["package.rs: сборка пакета"]
    E --> G
    H["Фото и PDF обследований"] --> G
    I["intake.rs: QR-код и локальная сеть"] --> H
    K["store.rs: карточка пациента"] <--> C
    G --> J["Один PDF"]

Что находится внутри

Интерфейс написан на egui. В app.rs живут состояние формы и логика действий врача: загрузка направления, правка полей, сохранение выписки и состав пакета. При загрузке направления другого пациента форма переключается на него вместе с данными осмотра. Для повторных обращений есть отдельная карточка пациента, чтобы не набирать одни и те же сведения каждый раз.

В настройках врач заполняет профиль, должность, добавляет подпись и печать для PDF.

ODT — это ZIP-архив с XML внутри. odt.rs читает content.xml, находит поля направления по подписям и переносит значения в форму. Для этого используются zip и quick-xml. Поля остаются редактируемыми, потому что исходный документ тоже может содержать ошибку. ФИО, дату рождения, полис и адрес перед сохранением нужно проверить.

vypiska.rs передаёт текст врача и проверенные реквизиты в шаблон assets/forma27.typ. Typst создаёт PDF формы 027/у. Для общего пакета нужно ещё сохранить само направление. package.rs вызывает установленный LibreOffice, чтобы перевести ODT в PDF с исходным бланком, а затем соединяет направление, выписку, фотографии и многостраничные PDF обследований в заданном порядке.

У готового файла есть ещё одна практическая проблема — размер. Снимки с телефона быстро раздувают пакет, а слишком сильное сжатие делает подписи и печати нечитаемыми. Поэтому «МеДок» подбирает качество изображений, сохраняя ширину страницы. После сборки файл всё равно стоит открыть и просмотреть целиком.

Фотографии можно передать прямо с телефона. intake.rs поднимает локальный HTTP-сервер и показывает QR-код со ссылкой на страницу загрузки. Телефон отправляет выбранные снимки в открытое приложение. Для этого оба устройства должны находиться в одной подходящей сети; передачу лучше включать в доверенной сети или через раздачу телефона. Файлы с диска добавляются обычным перетаскиванием.

Сборки и данные

У Windows и Linux общие исходники, но готовые файлы собираются отдельно. Есть EXE для Windows 7 x64 и версия для «Альт Рабочая станция» 10 x64. Linux-сборка сделана внутри «Альт 10», чтобы бинарник не потребовал более новую glibc. Для перевода направления в PDF на рабочем компьютере нужен LibreOffice.

«МеДок» работает локально. store.rs хранит карточки пациентов на компьютере: их содержимое защищается DPAPI в Windows и XChaCha20-Poly1305 в Linux. При этом имя файла карточки содержит СНИЛС, а готовый PDF — медицинские сведения. Такие файлы нельзя считать обезличенными и выкладывать вместе с исходниками.

Путь от направления 057/у до пакета PDF не зависит от специальности врача. Но текущая версия выросла из педиатрической практики: заготовка анамнеза, поля «Свидетельство о рождении» и «Организованность», а также подсказки по ЧДД и ЧСС рассчитаны на детей. Заготовку можно изменить, необязательные поля оставить пустыми; подсказки за пределами детского возраста не показываются.

Код и инструкция лежат на GitHub. В репозитории используются искусственные тестовые документы. Сборки для Windows и «Альт 10» доступны в релизе.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.