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

11 KiB
Raw Blame History

Следующие шаги - 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. Подключиться к серверу

ssh user@172.11.0.13

2. Обновить контейнер

cd ~/BUH_bot
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d

3. Проверить логи

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, использовать только коды

Изменения в коде:

# Валюта - БЕЗ Ссылки
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. Логи бота

docker-compose -f docker-compose.prod.yml logs -f buh_bot | grep -i "xml\|error\|critical"

2. Ошибки при генерации XML

  • Ошибки парсинга даты (должны быть ValueError)
  • Ошибки при обращении к МойСклад API
  • Проблемы с кодировкой

3. Отзывы пользователей

  • Удаётся ли импортировать XML в 1С?
  • Какие ошибки видят при импорте?
  • Сходятся ли суммы с НДС?

4. Контрольные проверки

# После генерации 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)

🚀 Команды для деплоя

На локальной машине:

# Уже выполнено ✅
docker build -t igornadein/buh_bot:latest .
docker push igornadein/buh_bot:latest

На сервере (172.11.0.13):

# 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

Откат при проблемах:

# Откатиться на предыдущий образ
docker pull igornadein/buh_bot@sha256:753a07638bc9133ee086ca7c08c4905a55f4752e4559d9384b6cc9fb75f82c0e
docker-compose -f docker-compose.prod.yml up -d

✅ Чек-лист перед деплоем

  • Docker образ собран
  • Docker образ запушен
  • Критичные баги исправлены
  • Документация обновлена (этот файл)
  • Решение принято (А, Б или В)
  • Сервер доступен
  • Есть план отката
  • Пользователи предупреждены (если нужно)

💡 Итого

Сейчас:

  • Образ готов к деплою
  • Критичные баги исправлены
  • Риски известны

Выбери подход:

  • Быстро и рискованно → Вариант А (деплой сейчас)
  • Безопасно и медленно → Вариант Б (проверка с клиентом)
  • Компромисс → Вариант В (убрать GUID)

Мой выбор: Вариант А → если не работает → Вариант В → если всё ещё проблемы → Вариант Б