# Приём документов → реестр + журнал Программа вносит данные о принятых документах из файлов в папке `прием` в файл **2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ** на соответствующие листы (последующими записями) и заполняет **Журнал внесения**. Работает на чистых Python-библиотеках (`odfpy`, `openpyxl`, `xlrd`), **LibreOffice не требуется**. Оформление реестра (стили ячеек, формат дат, прочие листы) сохраняется: новые строки копируют стиль последней строки листа. ## Запуск Графический интерфейс (выбор файлов мышью, кнопка «Внести данные»): ```bash pip install -r requirements.txt python3 gui.py ``` Или из командной строки (по умолчанию берёт файлы из текущей папки): ```bash python3 run.py ``` Оригиналы не изменяются — результат пишется рядом: * `2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ._ЗАПОЛНЕНО.ods` * `Журнал внесения_ЗАПОЛНЕНО.xlsx` Скрипт идемпотентен: всегда читает оригиналы, повторный запуск не задваивает данные. ## Сборка .exe для Windows (один файл) На **Windows** (Python 3.10+ с галочкой «Add to PATH») достаточно запустить `build.bat` — он установит зависимости и соберёт один файл: ``` build.bat ``` Результат: `dist\Приём документов.exe` — всё внутри одного файла, у конечного пользователя ничего ставить не нужно. В onefile-режиме пути по умолчанию не работают, файлы реестра/журнала и папку `прием` нужно указать в окне кнопками «Обзор». > Кросс-сборка из Linux напрямую невозможна (PyInstaller собирает под ту ОС, > где запущен); на Linux это делается через Wine с Windows-Python. ## Правило сопоставления Файл `DD.MM.YYYY_74_NN.` из папки `ТО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 оркестратор ```