Synthèse automatique
Documente l'intégration d'import de catalogue entre le traitement 1C 8.2 déjà déployé chez le client et le backend Python, ainsi que l'exposition du poste de développement via un tunnel Cloudflare et la vérification avec Postman et depuis 1C.
Points forts
- Pose le principe clé : le contrat est dicté par le traitement 1C existant (original-Libra.bsl, non modifiable), et donne la table de correspondance précise (article → plu via AliasChoices, en-tête X-API-Key avec Bearer conservé pour curl, suppression des espaces autour du token).
- Décrit des pièges de test concrets et vécus : un Bearer parasite dans l'onglet Authorization de Postman provoque un 401 alors que curl passe, et l'absence de route /health faisait répondre 200 à la page SPA de secours.
- Explique la topologie réseau réelle (serveur 1C accessible uniquement en RDP, instruments derrière NAT sans IP publique) et la solution tunnel Cloudflare avec nom fixe, token copié à la main, et repli HTTP sans TLS pour 1C 8.2 sans OpenSSL.
- Signale les garde-fous anti-synchronisation partielle (packs vides rejetés en 400 avant extinction, notify catalog_busy/catalog émis en finally avec écran « Оновлення » côté borne).
Limites
- Fortement lié à un dépôt et à un projet précis : chemins backend/app/api/import_1c.py, domaine smk-retail.com, identifiant de tunnel, fichier .bsl du client — peu réutilisable tel quel ailleurs.
- Le document est tronqué (la section « Пакет — ровно как у обраб… » s'arrête au milieu), donc la procédure de test complète n'est pas entièrement disponible.
- Aucun exemple de payload JSON ni de script automatisé : la vérification reste manuelle via Postman, curl et l'interface 1C.
À utiliser pour modifier import_1c.py ou les schémas Import1C*, configurer ou diagnostiquer le tunnel Cloudflare, ou répondre à un « 1С не видит весы ».
À ne pas utiliser pour une autre intégration ou un autre projet, ni comme guide générique sur les tunnels Cloudflare ou la migration 1C.
Analyse de sécurité
PrudenceThe skill documents legitimate integration setup and testing involving network tunnels, API keys, and database manipulation. No destructive, exfiltrating, or obfuscated commands are present, but the use of cloudflared, tokens, and full-sync data operations warrants caution.
- •Uses cloudflared tunnel with token from environment; token handling requires manual copy by owner.
- •Instructs running curl against external URLs and check-host.net for network verification.
- •Describes database stash/restore commands that move production data, with risk of full catalog deactivation if used incorrectly.
Exemples
В import_1c.py позиции без артикула или с артикулом длиннее 5 цифр сейчас валят 422 на весь пакет. Сделай по скиллу 1c-exchange, чтобы они пропускались с записью в errors[] (plu: 0, name), а остальной пакет принимался.Подними быстрый туннель Cloudflare на http://127.0.0.1:8000, дай адрес *.trycloudflare.com и проверь снаружи curl https://<имя>/health — S2L_IMPORT_TOKEN уже прописан в backend/.env.1С не видит весы: из Postman приходит 401, хотя curl с тем же X-API-Key проходит. Проверь по скиллу 1c-exchange, не мешает ли Authorization Bearer, и что GET /health реально отдаёт ответ, а не SPA-заглушку.name: 1c-exchange description: Обмен с 1С — приём каталога POST /api/catalog/1c-import под неизменную обработку заказчика, туннель Cloudflare с прибора, проверка через Postman и из 1С, мок рабочих данных на время теста. Использовать при правке import_1c.py, схем Import1C*, туннеля и при вопросах «1С не видит весы».
Обмен с 1С
Контракт диктует обработка
integrations/1c/original-Libra.bsl — внешняя обработка 1С 8.2, уже работает у
заказчика и не правится без явной просьбы владельца. Наш приёмник
backend/app/api/import_1c.py подстроен под неё, а не наоборот:
| Обработка шлёт | Приёмник |
| --- | --- |
| заголовок X-API-Key | основной способ; Authorization: Bearer оставлен для curl. Пробелы по краям токена срезаются — его копируют руками |
| article (числовой артикул) | это и есть plu: в схеме validation_alias=AliasChoices("plu","article"), поле необязательное |
| позиции без артикула / длиннее 5 цифр | не 422 на весь пакет, а пропуск с записью в errors[] (plu: 0, name) — 1С печатает их в своём логе |
| GET /health («Проверить связь») | явный маршрут в main.py вместе с /healthz; без него SPA-заглушка отвечала 200 при любом состоянии |
| in_stock всегда true | отбор «только в наличии» делает 1С; чего нет в пакете — гасится (active=0) |
| replace_images | снимок существующему товару кладётся только с ним; новым — всегда |
На время записи киоск закрыт экраном «Оновлення»: бэкенд шлёт live.notify
«catalog_busy» до записи и «catalog» после — в finally, поэтому сорвавшаяся
выгрузка не оставит прибор за экраном ожидания (плюс минутная страховка в киоске).
Без этого покупатель успевал нажать карточку посреди выгрузки и получить этикетку
со старой ценой. После снятия экрана киоск возвращается к началу каталога, но не
тогда, когда взвешенное ещё не забрали.
Полная синхронизация опасна при сбое выгрузки: пустой пакет и пакет без единого
пригодного артикула отклоняются (400) до того, как что-то погаснет. После приёма —
live.notify("catalog"). Поля настройки SMK_HTTP_Настройки и формат тела —
integrations/1c/README.md; менять контракт можно только с обеих сторон разом.
Как 1С достаёт до прибора
Сервер 1С доступен только по RDP, приборы — за NAT провайдера без белого IP
(проверено: WAN роутера — приватный 192.168.12.x, проброс снаружи не отвечает).
Поэтому прибор сам держит исходящий туннель Cloudflare (сервис tunnel в
deploy/docker/compose.yml, скилл deployment), а 1С ходит на имя
vesy-N.<домен>, SSL = Истина. Tailscale отпал: на сервер 1С клиента ставить
нельзя. Если 8.2 не договорится по TLS — SSL = Ложь через порт 80 работает
(Cloudflare принимает HTTP), но у домена должно быть выключено «Always Use HTTPS».
Постоянный адрес
Домен smk-retail.com в аккаунте Cloudflare владельца. Туннель vesy-dev
(ID ef35cc5d-…) с маршрутом vesy-dev.smk-retail.com → http://127.0.0.1:8000 —
это машина разработчика: cloudflared tunnel run --token <из backend/.env, CLOUDFLARE_TUNNEL_TOKEN>. Токен надстройка Claude в Chrome не отдаёт (и правильно) —
его копирует владелец руками. Снаружи проверено: /health 200 из Кипра и Германии,
/admin 401 без пароля и 200 с ним, приём 1С отвечает своим 401/400. HTTP без TLS
через туннель тоже проходит — запасной путь для 1С 8.2 без OpenSSL.
Проверка на машине разработчика
- Бэкенд слушает
0.0.0.0(tools/dev.pyтак и запускает); вbackend/.envзаданS2L_IMPORT_TOKEN. - Быстрый туннель без домена:
cloudflared tunnel --no-autoupdate --url http://127.0.0.1:8000печатает имя*.trycloudflare.com; живёт, пока идёт команда, меняется при каждом старте. Убедиться снаружи:curl https://<имя>/healthи, если есть сомнения в сети, check-host.net (TCP/DNS с чужих узлов). - Postman: вкладка Authorization → No Auth, заголовок
X-API-Keyво вкладке Headers. Первая ловушка теста: в Authorization стоял Bearer с другим значением — 401, хотя curl с тем же токеном проходил. - Пакет — ровно как у обработки (
article, неplu), плюс позиция без артикула и с шестизначным — проверитьerrors[]. Отрицательные: без ключа 401, пустой пакет 400. - Из 1С: сначала «Проверить связь» (то же поле
Сервер, без тела), потом «Заполнить» → «ВыгрузитьВВесы».Couldn't resolve host name— в полеСерверлишнийhttps://, путь или пробел, либо DNS на RDP-сервере не отдаётtrycloudflare.com(nslookupтам же). Именованный туннель со своим доменом такие фильтры не трогают.
Результат первого прогона 2026-09-15: 415 позиций, 290 со снимками, 4 группы — киоск перерисовался сам.
Мок рабочих данных
Выгрузка гасит всё, чего нет в пакете, поэтому демо-каталог на время теста
уезжает в backend/data/mock/ (гитигнор):
cd backend && .venv/Scripts/python tools/mock_data.py stash # база в мок
cd backend && .venv/Scripts/python tools/mock_data.py restore # вернуть
Снимки мок не трогает: присланные из 1С лежат в backend/data/photos/ и
перекрывают демо-набор из сборки по коду товара (скилл product-photos).
Оба — при остановленном бэкенде: SQLite занят, на Windows файл не переименовать.
S2L_SEED_DEMO=0 в backend/.env, иначе пустая база на старте снова засеется
демо. Ловушка Windows: после убийства родителя uvicorn --reload дочерние
воркеры (--multiprocessing-fork в командной строке) живут дальше и держат базу —
добивать их отдельно.
Проверять приём одной позицией через curl нельзя: это полная синхронизация, и такой запрос погасил 415 боевых товаров — восстанавливать пришлось повторной отправкой всего каталога из базы. Тестовую позицию слать только внутри полного пакета или на пустой базе.
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/download' --output '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md.part' && mv '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md.part' '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md' && test -s '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/1c-exchange' && cp -R '.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr' '.claude/skills/1c-exchange'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr'openskills read '1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/1c-integration-catalog-import-cloudflare-tunnel-mu6guoqr/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.