BUH_bot/docs/next_steps.md
Игорь Надеин a16ffca725 Refactor validator for zero-price detection and fix XML generator for 1C EnterpriseData 1.20 compatibility
- Enhanced validator with critical zero-price validation
- Fixed currency GUIDs and money formatting in XML generator
- Removed incompatible VidED field
- Added comprehensive documentation
- Updated test files
2025-11-06 09:03:35 +03:00

285 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Следующие шаги - 6 ноября 2025
## ✅ Выполнено сегодня
### 1. Критичные исправления XML генератора
- ✅ Исправлена потеря копеек (`.2f` вместо `int()`)
- ✅ Удалено поле ВидЭД (отсутствует в ED 1.20)
- ✅ Fallback даты заменён на исключение
- ✅ Счета учёта закомментированы (опционально)
### 2. Валидация
- ✅ Валидатор интегрирован и работает
- ✅ 0 критических ошибок в тестовых XML
- ✅ Все UUID корректны
### 3. Docker
- ✅ Образ пересобран: `sha256:695531b0358c01bf06af94fd410dee234bb605f0db9ca3c6e1d775b433945440`
- ✅ Запушен в Docker Hub: `igornadein/buh_bot:latest`
---
## 🔄 Что делать дальше
### Вариант А: Деплой на сервер (быстро, без проверки клиента)
#### 1. Подключиться к серверу
```bash
ssh user@172.11.0.13
```
#### 2. Обновить контейнер
```bash
cd ~/BUH_bot
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d
```
#### 3. Проверить логи
```bash
docker-compose -f docker-compose.prod.yml logs -f buh_bot
```
#### 4. Протестировать генерацию XML
- Создать заказ в МойСклад
- Сгенерировать XML через бота
- Попробовать импортировать в 1С
**Риски:**
- ⚠️ GUID справочников могут не совпадать с базой клиента
- ⚠️ Структура может не соответствовать XSD клиента
- ⚠️ Банк/договор могут вызвать ошибки
---
### Вариант Б: Сначала проверка с клиентом (безопасно)
#### 1. Запросить у клиента:
**A. XSD EnterpriseData 1.20**
```
Запрос клиенту:
"Для корректного формирования XML нам нужна актуальная схема EnterpriseData 1.20
вашей версии 1С. Можете предоставить файл XSD или сообщить:
- Версию платформы 1С (например, 8.3.25.1394)
- Конфигурацию (УТ 11.5, КА 2.5, ERP 2.5 и т.д.)"
```
**Б. GUID справочников из их базы**
```
Запрос клиенту:
"Для избежания ошибок импорта нужны UUID следующих объектов из вашей базы:
1. Валюта 'Рубль' (RUB, код 643)
2. Страна 'Россия' (код 643)
3. Единица измерения 'Штука' (код 796)
Можно получить через запрос в 1С:
SELECT Ссылка FROM Справочник.Валюты WHERE Код = '643'
SELECT Ссылка FROM Справочник.КлассификаторСтранМира WHERE Код = '643'
SELECT Ссылка FROM Справочник.УпаковкиЕдиницыИзмерения WHERE Код = '796'
"
```
**В. Доступ к тестовой базе**
```
Запрос клиенту:
"Для тестирования XML нужен доступ к тестовой базе 1С:
- HTTP-сервис для импорта (если есть)
- Или удалённый рабочий стол для ручного импорта
- Или возможность прислать скриншоты/логи ошибок импорта"
```
#### 2. После получения данных:
- Обновить GUID в коде (или убрать их)
- Адаптировать структуру под XSD
- Протестировать в их базе
- Задеплоить
---
### Вариант В: Упрощённый подход (компромисс)
#### Убрать все жёсткие GUID, использовать только коды
**Изменения в коде:**
```python
# Валюта - БЕЗ Ссылки
currency_elem = etree.SubElement(doc, "Валюта")
# НЕ создаём <Ссылка>
currency_data = etree.SubElement(currency_elem, "ДанныеКлассификатора")
etree.SubElement(currency_data, "Код").text = "643"
etree.SubElement(currency_data, "КодСимвольный").text = "RUB"
etree.SubElement(currency_data, "Наименование").text = "Российский рубль"
# Страна - БЕЗ Ссылки
country_elem = etree.SubElement(cp_elem, "СтранаРегистрации")
# НЕ создаём <Ссылка>
country_data = etree.SubElement(country_elem, "ДанныеКлассификатора")
etree.SubElement(country_data, "Код").text = "643"
etree.SubElement(country_data, "Наименование").text = "РОССИЯ"
# ЕИ - БЕЗ Ссылки
uom_elem = etree.SubElement(row_elem, "ЕдиницаИзмерения")
# НЕ создаём <Ссылка>
uom_data = etree.SubElement(uom_elem, "ДанныеКлассификатора")
etree.SubElement(uom_data, "Код").text = "796"
etree.SubElement(uom_data, "Наименование").text = "Штука"
# Банк - БЕЗ Ссылки, только БИК
bank_elem = etree.SubElement(bank_acc_elem, "Банк")
# НЕ создаём <Ссылка>
bank_data = etree.SubElement(bank_elem, "ДанныеКлассификатораБанков")
etree.SubElement(bank_data, "БИК").text = acc.get("bic", "")
etree.SubElement(bank_data, "Наименование").text = acc.get("bankName", "")
```
**Преимущества:**
- ✅ Работает в любой базе (1С найдёт объекты по кодам)
- ✅ Не зависит от GUID клиента
- ✅ Более универсально
**Недостатки:**
- ⚠️ Требует настройки "создавать отсутствующие объекты" в 1С
- ⚠️ Может не работать, если структура XSD другая
---
## 📊 Рекомендация
### Если клиент активен и готов помочь:
**→ Вариант Б** (запросить XSD и GUID)
- Время: 1-2 дня
- Риск: минимальный
- Результат: 100% совместимость
### Если клиент недоступен, нужно быстро:
**→ Вариант В** (убрать GUID)
- Время: 2-3 часа
- Риск: средний
- Результат: ~80% вероятность работы
### Если хочется попробовать "как есть":
**→ Вариант А** (деплой без изменений)
- Время: 30 минут
- Риск: высокий
- Результат: может сработать, может упасть
---
## 🎯 Мой совет
**Начни с Варианта А** (быстрый деплой):
1. Задеплой текущую версию на сервер
2. Попробуй сгенерировать XML через бота
3. Попробуй импортировать в 1С
**Если работает** ✅:
- Отлично, копейки сохраняются, ВидЭД не ломает
- Значит GUID совпали (повезло)
**Если НЕ работает** ❌ (ошибки импорта):
- Запроси у клиента: XSD + GUID + доступ к тестовой базе
- Реализуй Вариант В (убрать GUID)
- Доработай под их схему
---
## 📝 Что отслеживать после деплоя
### 1. Логи бота
```bash
docker-compose -f docker-compose.prod.yml logs -f buh_bot | grep -i "xml\|error\|critical"
```
### 2. Ошибки при генерации XML
- Ошибки парсинга даты (должны быть ValueError)
- Ошибки при обращении к МойСклад API
- Проблемы с кодировкой
### 3. Отзывы пользователей
- Удаётся ли импортировать XML в 1С?
- Какие ошибки видят при импорте?
- Сходятся ли суммы с НДС?
### 4. Контрольные проверки
```python
# После генерации XML проверять:
# 1. Копейки присутствуют?
assert "1234.56" in xml_content # не "1234"
# 2. ВидЭД отсутствует?
assert "ВидЭД" not in xml_content
# 3. Все GUID валидны?
import re
guids = re.findall(r'[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}', xml_content)
assert all(len(g) == 36 for g in guids)
```
---
## 🚀 Команды для деплоя
### На локальной машине:
```bash
# Уже выполнено ✅
docker build -t igornadein/buh_bot:latest .
docker push igornadein/buh_bot:latest
```
### На сервере (172.11.0.13):
```bash
# 1. Подключиться
ssh user@172.11.0.13
# 2. Перейти в директорию
cd ~/BUH_bot # или /var/www/buh_bot
# 3. Pull новый образ
docker-compose -f docker-compose.prod.yml pull
# 4. Перезапуск
docker-compose -f docker-compose.prod.yml up -d
# 5. Проверка
docker-compose -f docker-compose.prod.yml ps
docker-compose -f docker-compose.prod.yml logs -f buh_bot
```
### Откат при проблемах:
```bash
# Откатиться на предыдущий образ
docker pull igornadein/buh_bot@sha256:753a07638bc9133ee086ca7c08c4905a55f4752e4559d9384b6cc9fb75f82c0e
docker-compose -f docker-compose.prod.yml up -d
```
---
## ✅ Чек-лист перед деплоем
- [x] Docker образ собран
- [x] Docker образ запушен
- [x] Критичные баги исправлены
- [ ] Документация обновлена (этот файл)
- [ ] Решение принято (А, Б или В)
- [ ] Сервер доступен
- [ ] Есть план отката
- [ ] Пользователи предупреждены (если нужно)
---
## 💡 Итого
**Сейчас:**
- Образ готов к деплою
- Критичные баги исправлены
- Риски известны
**Выбери подход:**
- **Быстро и рискованно** → Вариант А (деплой сейчас)
- **Безопасно и медленно** → Вариант Б (проверка с клиентом)
- **Компромисс** → Вариант В (убрать GUID)
**Мой выбор:** Вариант А → если не работает → Вариант В → если всё ещё проблемы → Вариант Б