Внесение данных из файлов приёма в реестр невостребованных документов и заполнение журнала. Дата внесения — текущая; журнал заполняется чисто (без строк-примеров шаблона). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
81 lines
4.9 KiB
Markdown
81 lines
4.9 KiB
Markdown
# Приём документов → реестр + журнал
|
||
|
||
Программа вносит данные о принятых документах из файлов в папке `прием`
|
||
в файл **2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ** на соответствующие
|
||
листы (последующими записями) и заполняет **Журнал внесения**.
|
||
|
||
Работает на чистых Python-библиотеках (`odfpy`, `openpyxl`, `xlrd`),
|
||
**LibreOffice не требуется**. Оформление реестра (стили ячеек, формат дат,
|
||
прочие листы) сохраняется: новые строки копируют стиль последней строки листа.
|
||
|
||
## Запуск
|
||
|
||
Графический интерфейс (выбор файлов мышью, кнопка «Внести данные»):
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
python3 gui.py
|
||
```
|
||
|
||
Или из командной строки (по умолчанию берёт файлы из текущей папки):
|
||
|
||
```bash
|
||
python3 run.py
|
||
```
|
||
|
||
Оригиналы не изменяются — результат пишется рядом:
|
||
|
||
* `2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ._ЗАПОЛНЕНО.ods`
|
||
* `Журнал внесения_ЗАПОЛНЕНО.xlsx`
|
||
|
||
Скрипт идемпотентен: всегда читает оригиналы, повторный запуск не задваивает данные.
|
||
|
||
## Правило сопоставления
|
||
|
||
Файл `DD.MM.YYYY_74_NN.<ext>` из папки `ТОk` → лист `ТОk_NN` реестра.
|
||
|
||
По заданию: **«внести все строки, начиная со второй»**. Поэтому пропускается
|
||
только шапка (строка 1), а каждая последующая **непустая** строка вносится как
|
||
отдельная запись — без фильтрации по № п/п. № п/п в реестре проставляется
|
||
заново (сквозной, продолжает нумерацию листа), исходный № отбрасывается.
|
||
|
||
Колонки источника B…M переносятся **позиционно** в одноимённые колонки листа.
|
||
Значения ячеек очищаются от внешних пробелов (единообразно для всех форматов).
|
||
|
||
## Данные правее колонки M
|
||
|
||
В реестре 13 колонок (A…M). Если в источнике есть данные в 14-й колонке
|
||
(напр. «закладная погашена» в `16.04.2026_74_33`), отдельной колонки для них
|
||
нет — они добавляются в «Примечание» той же строки. Все такие случаи
|
||
перечисляются в `Pipeline().run().notes` (информационно).
|
||
|
||
## Известное ограничение
|
||
|
||
Сопоставление колонок — **позиционное** (колонка N источника → колонка N листа).
|
||
Это верно для текущего шаблона приёма. Если появится файл с другим порядком
|
||
или набором колонок (сдвиг влево), значения попадут не в свои поля, и это
|
||
**не** будет обнаружено автоматически — сдвиг вправо/лишние колонки ловятся
|
||
предупреждением, сдвиг влево — нет. При смене шаблона нужна проверка по
|
||
заголовкам.
|
||
|
||
## Структура
|
||
|
||
```
|
||
gui.py десктоп-интерфейс (tkinter)
|
||
run.py точка входа из командной строки
|
||
priem_register/
|
||
config.py пути, константы, раскладка колонок A..M
|
||
models.py Record, SourceFile, JournalEntry
|
||
mapping.py поиск файлов приёма и привязка к листам
|
||
readers/ чтение источников по форматам
|
||
base.py SourceReader: пропуск шапки, все непустые строки, нарезка колонок
|
||
xls_reader.py .xls (xlrd; даты-сериалы Excel)
|
||
xlsx_reader.py .xlsx (openpyxl)
|
||
ods_reader.py .ods (odfpy; разворот повторов)
|
||
factory.py выбор читателя по расширению
|
||
writers/
|
||
register_writer.py дозапись строк в .ods с копированием стилей
|
||
journal_writer.py заполнение журнала .xlsx
|
||
pipeline.py оркестратор
|
||
```
|