Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

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

Дата публикации: 27-09-2026 07:37:01

Написал локальный софт на Rust, который переносит реквизиты из ODT, помогает оформить выписку и собирает документы в один PDF. Читать далее

Основное содержимое страницы с новостью.

Уровень сложностиПростой

Время на прочтение3 мин

Охват и читатели7.7K

Кейс

Recovery Mode

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

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

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

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

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

a760adb8d27faa123b2160fd8e01d90a.jpg
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.

df231e141085fdd14dcb38d5aae99231.jpg

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

6a055fbdd8e67332df5a422365ff2576.jpg

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» доступны в релизе.

Надеюсь тут есть врачи.

Схожие новости

#Наименование новостиТональностьИнформативностьДата публикации
1[Перевод] Rewrite It in Rust: когда переписывание действительно оправдано07.9919-09-2026
2«Лучшие» практики Rust, которые вас подведут. Часть 207.9817-09-2026
3Чудеса nightly, часть 1: на чём тайком держится stable Rust08.5529-09-2026
4Rust на вырост. Почему мы изучаем язык, который не входит в наш основной стек-17.2410-09-2026
5Rust для микроконтроллеров: что он даёт по сравнению с С16.629-09-2026
6Zed: Великий и ужасный09.4914-09-2026
7[Перевод] Почему я пишу Bun‑native альтернативу napi‑rs08.8228-09-2026
8[Перевод] Реверс‑инжиниринг электросамоката и новая прошивка для него на Rust08.1411-09-2026
9Задача взяла lock() и остановила весь рантайм: пять ошибок с блокировками в async Rust06.5707-09-2026
10900 гипотез об уязвимостях и 12 миллиардов токенов08.9901-10-2026

Классификация: Мнения. Схожих патентов: 0. Схожих новостей: 10. Тональность: 0. Информативность: 7.03. Источник: habr.com.