<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://androman.pro/wp-content/themes/androman/assets/feed.xsl?ver=0.9.4" type="text/xsl"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>1С &#8212; ANDROMAN.PRO</title>
	<atom:link href="https://androman.pro/tag/1%d1%81/feed/" rel="self" type="application/rss+xml" />
	<link>https://androman.pro</link>
	<description>Независимый 1С-архитектор и AI-автоматизация корпоративных процессов: аудит, PoC на реальных данных, проверка качества и внедрение. · build 0.9.4</description>
	<lastBuildDate>Wed, 13 May 2026 21:00:00 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Я хотел CI для тестов 1С. Получил шесть граблей и одну DeepSeek-галлюцинацию</title>
		<link>https://androman.pro/2026/05/14/ci-1c-za-den/</link>
					<comments>https://androman.pro/2026/05/14/ci-1c-za-den/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Wed, 13 May 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[1С]]></category>
		<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[ИИ-разработка]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Allure]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Gitea]]></category>
		<category><![CDATA[YAxUnit]]></category>
		<guid isPermaLink="false">https://androman.pro/2026/05/14/ci-1c-za-den/</guid>

					<description><![CDATA[За вечер собрал автоматический прогон для 72 тестов 1С — Gitea Actions, Allure, Telegram. Расскажу про шесть граблей и одну галлюцинацию DeepSeek.]]></description>
										<content:encoded><![CDATA[<p>Заметил, что общаясь с Клодом и другими моделями, перенимая их лексикон, всё труднее общаться с живыми людьми. То есть говорить нормальными человеческими фразами, а не промптами, напичканными профессиональным жаргоном. ИИ сильно ускоряет мою производительность, но цена этому — нарастающая асоциальность.</p>
<p>С другой стороны это похоже на ещё одну игру в жанре «ИТ-стратегия», которую я так хочу пройти. Не знаю, какие уровни будут дальше, но вчера я, похоже, взял ещё один уровень. Наконец-то разобрался с одним из элементов CI/CD — автотестами и графическими отчётами к ним.</p>
<p>Ниже в основном творчество Клода, я попросил его писать попроще, потому что для меня тоже многие слова не то чтобы каждый день на языке. У меня теперь разработка так устроена — в основном это приключения на вечер в стиле Рика и Морти, на 20 минут вошли и вышли, которые перетекают в очередную эпопею. Я не проходил курсов, не считаю каждый токен, предварительно выстраивая всю архитектуру на бумажке — я просто чётко (а иногда не очень) формулирую свою задачу и контролирую, чтобы в процессе реализации Клод не ушёл в очень уж густые дебри.</p>
<p>А ещё он меня похвалил, когда кружил вокруг одной проблемы около часа, перепробовал всё и пытался меня отговорить от фичи. Я ему сказал, что не привык сдаваться, и дал небольшую подсказку — через минуту готовое решение было у меня на экране. Никогда бы не подумал, что буду хвалиться тем, что меня похвалила машина.</p>
<hr>
<p>У меня в <a href="https://github.com/andromanpro/1c-ai-connector">ИИконе</a> — это открытое расширение к 1С для интеграции с LLM, над которым плотно сижу с весны — 72 теста YAxUnit. Прогон на полминуты руками, считаю прошедшие и упавшие глазами по длинному JSON. К утру следующего дня вместо этого работал зелёный автопрогон по каждому коммиту в Gitea, дашборд Allure на NAS с историей и Telegram-бот, который ругается, когда тесты падают.</p>
<p>Финальная картинка: <strong>72/72 PASSED, около 29 секунд</strong> от коммита до отчёта в Allure.</p>
<p>По дороге наступил на шесть граблей и одну галлюцинацию DeepSeek.</p>
<h2>Что было до</h2>
<p>Тесты разнесены по 14 общим модулям. YAxUnit умеет писать отчёт в формате JUnit XML — а это как английский для систем прогона: понимают почти все.</p>
<p>До этого прогон выглядел так. Я открывал Claude Code, говорил «прогони тесты». Запускался MCP-инструмент <code>run_module_tests</code>, который под капотом дёргает <code>1cv8.exe ENTERPRISE /C "RunUnitTests=config.json"</code>. На выходе — JSON, в нём список модулей, для каждого — список тестов с результатами.</p>
<p>Я смотрел на JSON и решал, доволен ли я.</p>
<p>Иногда — открывал HTML-отчёт, который YAxUnit любезно генерирует рядом. Иногда — нет. Часто — забывал, что прогонял утром, и не помнил, был ли тогда красный или зелёный.</p>
<p>Не то чтобы это было больно. Просто очевидно бестолково, если задумываться. <strong>Нет истории прогонов. Нет графика по неделям. Нет процента успешных тестов в динамике.</strong> Каждый прогон — снимок, который я тут же забываю.</p>
<p>И ещё — задним числом я не помнил, <strong>что я последний раз сломал</strong>. Если сегодня 70 из 72, а вчера было 72 из 72 — где регрессия? Какой тест начал падать? Когда? Чтобы это понимать, надо вести историю. А чтобы вести историю — надо чтобы прогон жил не в моей голове.</p>
<p>Вот, собственно, и решил.</p>
<h2>Из чего собирал</h2>
<p>Я собрал такой зоопарк:</p>
<ul>
<li><strong>Gitea</strong> на NAS. Простой git-сервер, лёгкая система автопрогонов Gitea Actions внутри.</li>
<li><strong>act_runner</strong> под Windows. Это исполнитель шагов, который умеет крутиться где угодно. У меня — на ноуте, потому что 1С живёт там же.</li>
<li><strong>vanessa-runner</strong> (vrunner). Обвязка для запуска <code>1cv8.exe</code> с человеческим лицом. Умеет YAxUnit, BDD, и кучу другого.</li>
<li><strong>YAxUnit kernel</strong> — собственно тестовый раннер для 1С. Пишет JUnit XML.</li>
<li><strong>Allure server</strong> на NAS. Тот самый Docker-контейнер от <code>frankescobar/allure-docker-service</code>. История прогонов, тренды, графики.</li>
<li><strong>Прометей + Графана + Алертменеджер + Telegram-бот</strong>. Понятно зачем — чтобы когда что-то упало, я узнал об этом из телефона, а не из размышлений «а как там у меня тесты».</li>
</ul>
<p>Вот как это бегает по прямой:</p>
<p><img decoding="async" alt="Стек прогона: коммит в Gitea → Gitea Actions → act_runner на Windows → vrunner → 1cv8.exe + YAxUnit → JUnit XML → upload-to-allure.py → Allure на NAS → Prometheus/Grafana/Alertmanager → Telegram bot" src="https://androman.pro/wp-content/uploads/2026/05/ci-1c-stack-diagram.png"></p>
<p>Всё локальное. Никаких облаков, никаких счётчиков минут на чужих исполнителях. У меня дома NAS, у меня ноут, у NAS — Docker, у ноута — 1С. Этого достаточно.</p>
<h2>Что в итоге за вечер</h2>
<p>За вечер прошёл семь этапов: включил Gitea Actions, поднял Windows-исполнитель, подключил прогон через <code>vrunner</code>, перенёс исполнитель в службу, поднял Allure на NAS, написал переводчик JUnit XML в формат Allure, сверху прикрутил Prometheus с Telegram-ботом. Подробности — в граблях ниже, пошаговый туториал — в <a href="https://github.com/andromanpro/onec-yaxunit-ci-template">README шаблона</a>.</p>
<p>Получилось — коммит в репо → через минуту в Allure лежит свежий отчёт, в Grafana прирастают метрики, в Telegram — тишина, пока зелёное.</p>
<p>А теперь грабли. По штукам.</p>
<h2>Грабля 1 — кириллица в пользователе</h2>
<p>В 1С база лежит файловая, пользователь — «Администратор», пароль — пустой. Так настроено лет десять и до сегодня не мешало.</p>
<p>Запускаю прогон через <code>vrunner</code>. В консоли:</p>
<pre class="highlight"><code>Пользователь ИБ не идентифицирован
</code></pre>
<p>Код выхода 1, прогон умирает за полторы секунды.</p>
<p>Грешу на vrunner. Грешу на YAxUnit. Грешу на конфиг. Перепробовал три варианта параметров, четыре — не помогает.</p>
<p>Запускаю ту же команду напрямую, без vrunner:</p>
<pre class="highlight"><code class="language-bash">&quot;C:/Program Files/1cv8/8.3.27.1989/bin/1cv8.exe&quot; ENTERPRISE \
  /IBConnectionString &quot;File='F:/...'&quot; \
  /N &quot;Администратор&quot; /P &quot;&quot; /C &quot;RunUnitTests=...&quot;
</code></pre>
<p>Тот же ответ. Та же полторы секунды.</p>
<p>Меняю пользователя в базе на латинского <code>mcp-client</code>, пароль <code>12345</code>. Запускаю.</p>
<p>Зелёный прогон.</p>
<p>Что произошло. Похоже, где-то в цепочке запуска <code>1cv8.exe</code> через PowerShell / vrunner / Python всплывает однобайтная кодировка — и кириллический <code>Администратор</code> теряется при преобразовании. Для 1С такого пользователя в базе просто нет, дальше падение.</p>
<p>Хочется сказать «1С виновата». Но реально — это болезнь почти любого <code>.exe</code> старше десяти лет, который не научили читать аргументы как Unicode. PowerShell тут просто прокладка.</p>
<p>Лечение скучное и работает на 100%: <strong>в пользователе для автопрогонов не должно быть кириллицы</strong>. Создаёшь в базе пользователя <code>mcp-client</code> или <code>ci-user</code>, выдаёшь ему права (для тестов — полные, не жалко), и в шагах прогона ходишь под ним.</p>
<p>Лечение для себя: я держу кириллического «Администратора» как основного для работы руками и латинского <code>mcp-client</code> для автопрогонов. Они не мешают друг другу.</p>
<p><strong>Самое смешное:</strong> за этот вечер я потерял на этой грабле минут сорок. Через две недели после этого, копаясь в старых заметках по статьям, нашёл собственную запись от 6 мая: «Codex решил эту проблему. Описал в инструкциях и в CLAUDE.md. Через латинского пользователя.» Прошлый я знал. Текущий я забыл и пошёл по тем же граблям. И понял, почему есть отдельный шаг во всех моих инструкциях — «<strong>первым делом загляни в свою папку наработок</strong>».</p>
<h2>Грабля 2 — права запуска скриптов под LocalSystem</h2>
<p>Окей, прогон работает. Тесты зелёные. Открыт терминал, в нём крутится <code>act_runner.exe</code>. Если я закрою терминал — исполнитель умрёт, и коммит в Gitea не подхватится.</p>
<p>Надо поднять исполнитель как Windows-службу, чтобы он жил вечно.</p>
<p>Беру WinSW (это маленькая обёртка для запуска чего угодно как службы), регистрирую исполнитель под аккаунтом LocalSystem, стартую. Коммит в репо. Шаг 1 — пять секунд. Падает.</p>
<p>В логах:</p>
<pre class="highlight"><code>PSSecurityException: UnauthorizedAccess
File ...\0.ps1 cannot be loaded because running scripts is disabled
on this system. ExecutionPolicy: Restricted
</code></pre>
<p>Ставлю права запуска на <code>RemoteSigned</code> через групповую политику. Перезапускаю. То же самое.</p>
<p>Ставлю <code>Set-ExecutionPolicy -Scope Process Bypass</code> первой командой в скрипте. То же самое.</p>
<p>Что-то тут странное.</p>
<p>Открываю как Gitea на самом деле запускает шаг PowerShell:</p>
<pre class="highlight"><code>powershell -command . '0.ps1'
</code></pre>
<p>Видите эту <strong>точку</strong> перед <code>'0.ps1'</code>? PowerShell это называет «загрузить в текущую сессию». Это означает: проверка политики запуска происходит <strong>до</strong> того, как тело скрипта начнёт выполняться. То есть мой <code>Set-ExecutionPolicy</code> внутри <code>0.ps1</code> физически не успевает сработать. Скрипт даже не запускается.</p>
<p>Нашёл лечение — <code>shell: cmd</code> плюс явный вызов <code>powershell -ExecutionPolicy Bypass -File</code>:</p>
<pre class="highlight"><code class="language-yaml">- name: Run smoke
  shell: cmd
  run: powershell -ExecutionPolicy Bypass -File run-yaxunit-smoke.ps1
</code></pre>
<p>Это уже не загрузка в текущую сессию — это запуск отдельного PowerShell-процесса с уже выставленной политикой. Работает. Без UAC, без правки реестра, без правки локальной групповой политики на всех компах.</p>
<p>Запускаю. Падаем на следующем шаге:</p>
<pre class="highlight"><code>'oscript' is not recognized as an internal or external command
</code></pre>
<h2>Грабля 3 — PATH потерял пользовательскую часть</h2>
<p>Это уже сцепка к предыдущему. LocalSystem видит <strong>машинную</strong> часть PATH. А <code>oscript.exe</code> я ставил через ovm (это менеджер версий для OneScript). ovm кладёт всё в <code>C:/Users/&lt;user&gt;/AppData/Local/ovm/current/bin</code> — то есть в <strong>пользовательскую</strong> часть PATH.</p>
<p>Запускаю под собой — работает. Запускаю под LocalSystem — <code>oscript</code> не найден.</p>
<p>Решений два. Первое — добавить путь от ovm в машинную часть PATH. Так нельзя, потому что я там ставил конкретно локально, под себя, и не хочу делать это глобальным.</p>
<p>Второе — расширить <code>$env:Path</code> в скрипте-обёртке, явно ткнув в нужную папку:</p>
<pre class="highlight"><code class="language-powershell">$VrunnerExe = &quot;C:/Users/&lt;user&gt;/AppData/Local/ovm/current/bin/oscript.exe&quot;
$env:Path = &quot;$(Split-Path -Parent $VrunnerExe);$env:Path&quot;
</code></pre>
<p>Сразу после этого <code>vrunner</code> находит <code>oscript</code>, <code>oscript</code> находит свой пакет, прогон стартует.</p>
<p>В сумме — три грабли подряд. Кириллица в пользователе, политика запуска под службой и пропавший PATH — на отдельный вечер каждая, если не знать. Все три отлично гуглятся задним числом. Но в моменте, когда видишь «выход 1 за полторы секунды без объяснения», не очевидно, что это, цитирую, <strong>проблема границы Unicode и однобайтной кодировки в системном вызове Windows</strong>.</p>
<p>Зелёный прогон через службу — после этого. Пять часов в сумме на сегодняшний вечер.</p>
<h2>Грабля 4 — DeepSeek убедил меня чинить не ту Synology ACL</h2>
<p>Это моя любимая.</p>
<p>Allure поднялся за две минуты — <code>docker run</code> на NAS, <code>frankescobar/allure-docker-service</code>, проброс папки <code>/volume1/docker/allure/projects</code> внутрь как <code>/app/projects</code>. Стартует, на порту 5050 живая морда.</p>
<p>Делаю первый POST — отправить результаты прогона. Получаю:</p>
<pre class="highlight"><code>HTTP 400
Permission denied: '/app/allure-docker-api/static/projects/yaxunit-iikona'
</code></pre>
<p>Делаю <strong>перезапуск</strong> контейнера. Тот же POST. <strong>Зелёный</strong>. Загрузка прошла.</p>
<p>Хм. Подозрительно — после перезапуска работает, а до — нет.</p>
<p>Запоминаю это в голове и думаю: «Видимо первый раз после старта он что-то досоздаёт».</p>
<p>На следующий день поднимаю <strong>второй проект</strong> на том же Allure. Та же ошибка. Тот же перезапуск. Лечит.</p>
<p>Это уже не «видимо». Это <strong>закономерно</strong>. Каждый новый проект — перезапуск.</p>
<p>В Claude Code прикасаюсь к скиллу про связку нескольких агентов: «поручу DeepSeek через <code>opencode run</code>, пусть посмотрит свежим взглядом и найдёт настоящую причину». DeepSeek (v4-pro через OpenRouter) у меня в скилле для именно таких ситуаций — независимое мнение по конкретной проблеме.</p>
<p>Отправляю описание ошибки и контекст. Через двадцать секунд ответ. <strong>Уверенный</strong>, со ссылками на скрипт запуска этого образа Docker:</p>
<blockquote>
<p>«Скрипт запуска выполняет <code>chown -R 1000:1000 /app/projects</code> асинхронно. Flask-приложение стартует раньше, чем заканчивается смена владельца. Поэтому первый POST приходит до того, как владелец поменялся, и процесс с правами 1000 не может писать. После перезапуска скрипт инициализации уже отработал, права выставлены — POST проходит.</p>
<p>Решение: в <code>docker-compose.yml</code> добавить <code>command: ["sh", "-c", "chown -R 1000:1000 /app/projects &amp;&amp; exec entrypoint.sh"]</code> — синхронная смена владельца перед стартом сервиса.»</p>
</blockquote>
<p>Логично. Стройно. Объясняет всё, что я видел.</p>
<p>Я уже почти было пошёл это применять. Но <strong>что-то</strong> меня остановило. Не знаю что. Какой-то рефлекс «проверь руками сначала».</p>
<p>И я зашёл в контейнер по SSH:</p>
<pre class="highlight"><code class="language-bash">docker exec -it allure ls -ld /app/projects/yaxunit-iikona
</code></pre>
<p>Ответ:</p>
<pre class="highlight"><code>drwxrwxrwx 2 1029 users 4096 May 14 22:30 /app/projects/yaxunit-iikona
</code></pre>
<p>Стоп.</p>
<p><strong>Владелец — 1029. Не 1000.</strong></p>
<p>То есть никакой смены владельца в скрипте запуска <strong>не происходило</strong>. Ни до старта, ни после. Владелец — <code>1029:users</code>, как я его создал через <code>mkdir</code> изначально. Права в стиле Unix — <code>0777</code>, что для процесса с правами 1000 (под которым Flask) <strong>разрешает запись</strong>.</p>
<p>Я был в полу-шаге от того, чтобы записать в инструкцию <code>1c-yaxunit-runner</code> «добавьте смену владельца в скрипт запуска, иначе будет 400 на первом POST» — и оставить этот ложный вывод там навечно.</p>
<p>После пары часов проб — стартовал контейнер, ждал пять секунд, делал POST, замерял. Стартовал, ждал десять секунд, POST, замерял. Менял <code>command:</code>, не менял <code>command:</code>. Через двадцать минут реальная картина была вот такая:</p>
<p><strong>Flask-приложение начинает слушать порт 5050 раньше, чем заканчивается скрипт инициализации внутри образа.</strong> Скрипт инициализации делает кучу всего — миграции базы SQLite, проверки, прогрев. POST, приходящий на сервер, который уже слушает но ещё не готов, получает 400 с криво сложенным сообщением «permission denied на /app/&hellip;», хотя реально с правами ни при чём.</p>
<p>Лечение — банальный <strong>опрос готовности</strong> перед первым POST:</p>
<pre class="highlight"><code class="language-python">for _ in range(30):
    if requests.get(f&quot;{ALLURE_URL}/version&quot;).ok:
        break
    time.sleep(1)
</code></pre>
<p>Тридцать секунд ожидания готовности на старте. После этого POST-запросы летят.</p>
<p>DeepSeek был умен, стройн и неправ. Я его очень люблю как независимого ревьюера, особенно в обычной связке нескольких агентов: каждое ревью кода через DeepSeek поверх Claude находит баги уровня «уборка дубликатов событий цепляется не за идентификатор, а за совпадение сумм за тридцать дней». Но в этот раз он сочинил красивую внутреннюю модель ошибки, которая не имела отношения к реальности.</p>
<blockquote>
<p><strong>Я:</strong> «Так ты выдумал про смену владельца в скрипте запуска?»</p>
<p><strong>DeepSeek:</strong> Молчит. Он не помнит этот разговор. Третий агент в моём рабочем потоке — без памяти между запросами.</p>
</blockquote>
<p>Урок: <strong>на инфраструктурных вопросах сначала проверка руками, потом совет от ИИ</strong>. Пять минут <code>docker exec</code> и <code>ls -l</code> стоят дешевле, чем час неверной правки и потеря веры в собственные диагнозы. Без проверки руками я бы записал в скилл <code>1c-yaxunit-runner</code> навсегда инструкцию «в скрипте запуска синхронная смена владельца» — и каждый, кто бы шёл моими граблями по моему же скиллу, запомнил бы её как факт.</p>
<h2>Грабля 5 — Allure не принимает JUnit XML</h2>
<p>Я думал, JUnit XML — это универсальный билет в Allure. Раз Allure про красивые отчёты тестов, и почти все системы понимают JUnit XML — значит и он понимает.</p>
<p>Оказалось, в этом контейнере билет не тот. <code>frankescobar/allure-docker-service</code> принимает только <strong>свой формат Allure raw JSON</strong> — это один JSON-файл на тест. У него своя структура: <code>name</code>, <code>fullName</code>, <code>status</code>, <code>start</code>, <code>stop</code>, <code>historyId</code>, <code>labels</code>, <code>parameters</code>.</p>
<p>Открыл документацию Allure. Половина — про плагин для Java, половина — про SBT и Gradle. Описание собственного формата — где-то на третьем уровне навигации, под спойлером, на английском, с примером в YAML, который не валиден как JSON.</p>
<p>Окей, написал переводчик сам. На стандартной библиотеке Python, пятьдесят строк:</p>
<pre class="highlight"><code class="language-python">import xml.etree.ElementTree as ET
import json, hashlib, time, uuid

def junit_to_allure(xml_path, out_dir):
    tree = ET.parse(xml_path)
    for tc in tree.iter(&quot;testcase&quot;):
        name = tc.get(&quot;name&quot;)
        suite = tc.get(&quot;classname&quot;)
        failure = tc.find(&quot;failure&quot;)
        status = &quot;failed&quot; if failure is not None else &quot;passed&quot;
        # historyId через md5 — чтобы Allure связал прогоны в график
        history_id = hashlib.md5(f&quot;{suite}.{name}&quot;.encode()).hexdigest()
        result = {
            &quot;uuid&quot;: str(uuid.uuid4()),
            &quot;name&quot;: name,
            &quot;fullName&quot;: f&quot;{suite}.{name}&quot;,
            &quot;status&quot;: status,
            &quot;stage&quot;: &quot;finished&quot;,
            &quot;historyId&quot;: history_id,
            &quot;labels&quot;: [{&quot;name&quot;: &quot;suite&quot;, &quot;value&quot;: suite}],
        }
        if failure is not None:
            result[&quot;statusDetails&quot;] = {&quot;message&quot;: failure.get(&quot;message&quot;), &quot;trace&quot;: failure.text}
        with open(f&quot;{out_dir}/{result['uuid']}-result.json&quot;, &quot;w&quot;) as f:
            json.dump(result, f)
</code></pre>
<p><code>historyId = md5(fullName)</code> — критическая мелочь. Без неё Allure не свяжет прогоны между собой, и не будет графиков трендов. Это написано в их документации, но не очевидно — раздел про историю как раз про этот md5, и легко пропустить, потому что параметр выглядит как «необязательный».</p>
<p>Переводчик работает. Заливка работает. Тренды строятся. Дальше в цепочке от меня нужно только смотреть на красивые графики и иногда отвечать в Telegram-бот «yes, видел, сегодня починю».</p>
<p><img decoding="async" alt="Allure dashboard: 72 теста, 100%, разбивка по 14 suites" src="https://androman.pro/wp-content/uploads/2026/05/screenshot-allure-dashboard.png"></p>
<h2>Грабля 6 — BDD-тесты в автопрогон не лезут</h2>
<p>В ИИконе кроме YAxUnit (модульные тесты) есть сценарии BDD через Vanessa Automation. Это поведенческие тесты, написанные на Gherkin. Они умеют ходить по формам, нажимать кнопки, читать значения — то есть нужен <strong>живой экран с интерфейсом</strong>.</p>
<p>Под YAxUnit мы только что собрали красивую штуку — исполнитель крутится как служба под LocalSystem, прогон без видимого окна, прекрасно. Хочется BDD туда же.</p>
<p>Не работает.</p>
<p>LocalSystem в Windows стартует в <strong>Session 0</strong> — это специальная сессия для системных служб, без интерактивного рабочего стола, без окон, без сообщений интерфейса. Сценарии Vanessa отправляют оконные сообщения формам — в Session 0 этих окон нет.</p>
<p>Vanessa запускает 1С тонкий клиент, тонкий клиент пытается открыть форму, движок интерфейса отправляет оконные сообщения — некому слушать. Тест зависает или падает с непонятной ошибкой через таймаут.</p>
<p>Можно? Технически — <code>psexec -s -i 1 vrunner.exe</code>, переключение в Session 1, тонкий клиент в видимом рабочем столе. Можно службу запускать <strong>не от LocalSystem, а от обычного пользователя</strong> с разрешением «вход как служба». Тогда сессия получает интерфейс.</p>
<p>Должен ли я это делать? Для моего случая — <strong>нет</strong>. Сценарии BDD у меня прогоняются раз в неделю руками через Vanessa MCP в Claude Code. Я в этот момент сижу за компом, смотрю как кликается. Это и нужно, потому что BDD у меня про вёрстку форм — я в этот момент <strong>смотрю</strong> скриншоты.</p>
<p>Решил так:</p>
<table>
<thead>
<tr>
<th></th>
<th>YAxUnit</th>
<th>BDD (Vanessa)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Нужен живой рабочий стол</td>
<td>Нет</td>
<td>Да</td>
</tr>
<tr>
<td>Под Windows-службой</td>
<td>работает</td>
<td>не работает</td>
</tr>
<tr>
<td>Где прогон</td>
<td>Автоматически на коммит</td>
<td>Вручную через MCP</td>
</tr>
<tr>
<td>История прогонов</td>
<td>Allure (проект <code>yaxunit-iikona</code>)</td>
<td>Allure (проект <code>bdd-iikona</code>)</td>
</tr>
</tbody>
</table>
<p>То есть Allure-история покрывает <strong>обе</strong> ветки одним и тем же дашбордом. Просто прогон BDD стартует с моей кнопки, не с коммита. И переводчик JUnit → Allure raw используется одинаково.</p>
<p>Получилась несимметричная, но честная цепочка. Без окон там, где это работает. Руками там, где требуется живой экран. Один Allure, два проекта, общая история.</p>
<h2>Где помог Claude Code, а где помешал</h2>
<p>Здесь не про «ИИ круто помогает разработчику», а про конкретные мелочи.</p>
<p><strong>Где помог.</strong> Связка из трёх агентов — Claude как архитектор плюс Codex CLI как разработчик плюс DeepSeek как независимый ревьюер. Я отдаю Codex детально-сформулированную задачу («написать опрос готовности, добавить повторы, обновить модульные тесты»), он реализует, Claude (то есть я в этой сессии) ревьюит, DeepSeek проверяет третьим взглядом. На длинной дистанции эта тройка ловит баги, которые я бы не нашёл. Дороже подписки на Claude Max — копейки на DeepSeek через OpenRouter, около половины цента за прогон ревью.</p>
<p>Скиллы — память между сессиями. После сегодняшних граблей записи про них уже в памяти. Следующая сессия с фразой «настроить автопрогон тестов 1С» сама подтянет нужный скилл, и я не повторю эти же грабли. Это работает не идеально, но лучше, чем без него — Грабля 1 (кириллица в пользователе) тому подтверждение: скилл был, я его не открыл, прошёл по тем же костям. Скилл стал жёстче.</p>
<p><strong>Где помешал.</strong> Как показала Грабля 4 — советы ИИ на инфраструктурных вопросах требуют проверки руками. Особенно когда модель не видит <strong>твоего</strong> конкретного контейнера и твоих конкретных прав.</p>
<p>И ещё — я регулярно ловил себя на том, что <strong>изобретаю</strong> там, где у меня уже есть готовое. Например я пошёл писать с нуля PowerShell-скрипт для прогона YAxUnit, при том что у меня уже лежат готовые скилл-обёртки <code>db-create</code>, <code>db-load-cf</code>, <code>epf-build</code> для всего этого. Лень открыть <code>ls</code>. Прошлогодний я в инструкциях уже <strong>умнее</strong>, чем текущий я по памяти. Это смешно и грустно одновременно.</p>
<h2>Сколько ушло</h2>
<p>Время: <strong>5 часов</strong> с клавиатуры в сессиях Claude Code. С вечера четверга до утра пятницы, с перерывом на сон. Реально это две полу-сессии — одна на цепочку YAxUnit до Allure (три часа), одна на Allure плюс стек мониторинга плюс Telegram (два часа).</p>
<p>Деньги:</p>
<ul>
<li>Claude Pro Max — подписка, не за задачу. Считать как «фиксированная».</li>
<li>DeepSeek через OpenRouter — около двух центов за всю сессию. Это пять-шесть прогонов ревью по половине цента, цифра реальная (есть в моём трекере, <a href="/ai-tracker-60k/">про который писал отдельный пост</a>).</li>
<li>Прометей, Графана, Allure — контейнеры Docker на NAS, который и так крутится 24/7.</li>
<li>1С — лицензия учебная, файловая база.</li>
</ul>
<p>Железо: домашний NAS, который и так работает 24/7. Под весь стек — около гигабайта оперативки (Allure плюс Prometheus с Grafana и Alertmanager). На нём же живёт Gitea и пара других сервисов. Запас есть.</p>
<h2>Когда стоит это делать</h2>
<p>Это <strong>не для каждого 1С-проекта</strong>. Это для конкретного класса проектов:</p>
<ul>
<li>Тестов больше тридцати, и прогон занимает заметное время (десятки секунд → минуты).</li>
<li>Прогон делается <strong>чаще раза в день</strong>. Если раз в неделю — перебор.</li>
<li>Хочется график «процент успешных по неделям», регрессии замечать «вчера было 72/72, сегодня 70/72 — что я сломал?».</li>
<li>Команда больше одного человека, и тесты надо видеть не только в моей голове.</li>
<li>Или: команда из одного, но есть стратегическая цель — например, сертификация «1С:Совместимо», для которой автоматизация тестов это плюс.</li>
</ul>
<p>Если тестов десять и они прогоняются раз в неделю руками — забудь про это, тебе не надо.</p>
<h2>Когда не стоит</h2>
<ul>
<li>Файловая база, единственный разработчик, два десятка тестов раз в неделю. Достаточно ручного прогона.</li>
<li>Нет NAS / нет виртуалки / нет ноута, который можно отдать под свой исполнитель. На облачных исполнителях 1С запускать нельзя — лицензия привязана к железу.</li>
<li>Команда не понимает «зачем нам автопрогон» и сопротивляется. Сначала разговор, потом инфраструктура.</li>
</ul>
<h2>Шаблон для тех, кто хочет повторить</h2>
<p>Я выложил репозиторий-шаблон. Все шесть грабель задокументированы в README, плюс готовый конфиг прогона, готовый скрипт-обёртка, готовый переводчик JUnit → Allure raw, готовый сборщик метрик Allure для Prometheus.</p>
<p><a href="https://github.com/andromanpro/onec-yaxunit-ci-template"><code>github.com/andromanpro/onec-yaxunit-ci-template</code></a> — MIT, бери и адаптируй. Поднимается у нового проекта минут за тридцать.</p>
<p>Поднимается у нового пользователя минут за тридцать. Главные параметры — путь до <code>1cv8.exe</code>, имя файловой базы, латинский пользователь с правами. Остальное — копипаста.</p>
<h2>Посмотреть</h2>
<ul>
<li><a href="https://github.com/andromanpro/onec-yaxunit-ci-template">Шаблон <code>onec-yaxunit-ci-template</code></a> — MIT, README со списком грабель на 200 строк</li>
<li><a href="https://github.com/andromanpro/1c-ai-connector">ИИкона — AI-коннектор для 1С</a> — открытый проект, из CI-инфраструктуры которого вырос этот шаблон</li>
<li><a href="/ai-tracker-60k/">Пост про трекер расходов на ИИ</a> — там тот же DeepSeek, который ловит реальные баги, упоминается в контексте связки нескольких агентов</li>
<li><a href="https://github.com/andromanpro">github.com/andromanpro</a> — публичная часть моих проектов</li>
</ul>
<h2>Что осталось</h2>
<p>План, до которого я <strong>не дошёл</strong> в этот вечер и который висит на следующий заход:</p>
<ul>
<li>Перенос всего стека на Linux-исполнитель на NAS плюс 1С в Docker плюс Postgres. Это убирает зависимость от моего ноута. Три-пять дней работы, ждёт повода вроде «команда выросла» или «ноут перестал быть надёжным».</li>
<li>Сборщик метрик 1С для Prometheus для кластерной базы (если когда-нибудь появится кластер). Для файловой ИБ — бессмысленно.</li>
<li>Расширение сборщика метрик Allure — помодульные числа, чтобы в Grafana видеть процент успешных <strong>по конкретному модулю</strong> в динамике.</li>
<li>Архив HTML-отчётов Allure в <code>/volume1/backups/</code> (сейчас Allure держит последние 20 отчётов, потом удаляет).</li>
</ul>
<p>Ни один из этих пунктов не блокирует ничего. Если упадёт что-то критичное, я узнаю через Telegram в течение минуты — это самое важное, что я успел собрать.</p>
<h2>Самое смешное</h2>
<p>Самое смешное про этот вечер — это не количество граблей. Их шесть, и каждая ловится через 30 секунд <code>docker exec</code> или <code>Get-ChildItem $env:Path</code>.</p>
<p>Самое смешное в том, что <strong>из шести граблей пять я уже встречал раньше</strong>. Грабля 1 — кириллица в пользователе — была решена 6 мая, в скилле и в CLAUDE.md. Грабля 2 — права запуска под службой — общеизвестная штука среди Windows-сисадминов. Грабля 5 — Allure ждёт свой формат — задокументирована в их официальной документации.</p>
<p>Только <strong>Грабля 4</strong> — DeepSeek и не та Synology ACL — была мне новой. И именно на ней DeepSeek дал красивый, уверенный, неверный диагноз. Единственная по-настоящему свежая грабля среди шести — единственная, на которой совет от ИИ дал сбой.</p>
<p>Это не значит, что ИИ бесполезен. Это значит, что ИИ <strong>очень хорошо имитирует</strong> уверенный ответ, и если ты сам не знаешь правильного ответа, ты не различишь.</p>
<p>Скиллы — внешняя память от прошлого меня к текущему — работают лучше, чем модельная память внутри ИИ. Скилл написан после того, как я <strong>проверил руками</strong>. Модель пишет ответ из обучающего корпуса, не глядя в мой контейнер.</p>
<p>DeepSeek через два дня после этого вечера поймал в ревью два серьёзных бага в коде, которые я бы не нашёл (обход путей в одной из точек входа, гонка проверок в уборке дубликатов). Я ему очень благодарен. Просто <strong>для инфраструктурных диагнозов</strong> — <code>docker exec</code> стоит дешевле и точнее.</p>
<p><img decoding="async" alt="Grafana «Allure CI — тесты и тренды»: pass rate, тренды, длительность по проектам" src="https://androman.pro/wp-content/uploads/2026/05/screenshot-grafana-allure.png"></p>
<p><img decoding="async" alt="Telegram-алерт от бота через Alertmanager" src="https://androman.pro/wp-content/uploads/2026/05/screenshot-telegram-alert.png"></p>
<p>Автопрогон зелёный. Дашборд Allure жив. Telegram-бот молчит, что означает «всё ок».</p>
<p>А я теперь сижу и думаю, сколько ещё вещей вокруг меня я могу автоматизировать за один длинный вечер.</p>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/05/14/ci-1c-za-den/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/05/14/ci-1c-za-den/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Разгон</title>
		<link>https://androman.pro/2026/05/01/razgon/</link>
					<comments>https://androman.pro/2026/05/01/razgon/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[ИИ-разработка]]></category>
		<category><![CDATA[1С]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[вайб-кодинг]]></category>
		<category><![CDATA[ИИ]]></category>
		<category><![CDATA[продуктивность]]></category>
		<guid isPermaLink="false">https://androman.pro/2026/05/01/razgon/</guid>

					<description><![CDATA[Думал, ИИ освободит время. Получилось другое — задач стало в три раза больше. Не как нагрузки, а как пространства. Маховик раскручивается.]]></description>
										<content:encoded><![CDATA[<p>В прошлом посте я насчитал — 41 час взаимодействия на семь визуальных pet-проектов за пять недель. Попросил ИИ проанализировать весь апрель —</p>
<p>147 часов активного общения с моделью. Тридцать активных дней из тридцати — каждый день апреля без пропусков. В среднем — около пяти часов в день, включая выходные.</p>
<p>И что самое удивительное &#8212; я не выгорел. То есть такой ритм и такая форма работы &#8212; это прям как подошедший пазл в мою СДВГ-шную голову. Раньше у меня была куча идей, они перерастали в планы, но быстро затухали, оставшись лежать либо забытым черновиком на задворках папок компьютера, либо неработающим приложением, когда столкнулся с проблемой, превышающей собственную компетенцию. Игра перевернулась с появлением ИИ &#8212; теперь от задумки до первого прототипа иногда проходит меньше 10 минут, и это обескураживает и пугает одновременно. Но что могу сказать точно — это увлекает так, как ничто другое не увлекало уже много лет. </p>
<p>При этом задач стало <strong>в три раза больше</strong>, чем было в начале месяца. Не закрытых — нет, новых. Каждая закрытая идея в течение часа порождала ещё две. Так получилось пространство, в котором интересно жить и из которого не хочется выходить.</p>
<p>Это не усталость. Это разгон.</p>
<h2>Что получилось за месяц</h2>
<p><strong>Продуктовый аудит крупной WMS-конфигурации</strong> под сертификацию «1С:Совместимо» — мой большой клиентский проект апреля. Два этапа поставки, около 185 источников в md по этапам аудита, восемь итоговых документов для четырёх типов руководителей (техдиректор, гендиректор, финдиректор, инвестор — у каждого свой угол), архитектурный разбор регистров, обзор безопасности, дорожная карта на 6-9 месяцев, финансовая модель и сравнение с шестью конкурентами по WMS. К концу месяца — комплект документов на ~400 страниц. В общем работа целого отдела разных специальностей на протяжении нескольких месяцев.</p>
<p><strong>Свои pet-проекты</strong> — про них уже <a href="https://androman.pro/2026/04/28/1c-stalo-skuchno/">отдельный пост</a>. Если коротко: 76 коммитов в <a href="https://github.com/andromanpro/ai-conversation-viz">ai-conversation-viz</a>, выпуск пакета <a href="https://github.com/andromanpro/lava-orb">@andromanpro/lava-orb</a> v0.1.1 на npm, две новых браузерных игрушки (<a href="https://andromanpro.github.io/orb-2048/">orb-2048</a>, <a href="https://andromanpro.github.io/orb-arkanoid/">orb-arkanoid</a>), редактор частиц <a href="https://github.com/andromanpro/fire-particle-editor">fire-particle-editor</a>, генератор печатных кроссвордов. Большинство под лицензией MIT, на GitHub.</p>
<p><strong>Свой блог androman.pro.</strong> Перезапустил на собственной теме для WordPress (15 итераций дизайна, см. <a href="https://androman.pro/2026/04/27/ya-eto-sdelal/">«Я это сделал!»</a>), опубликовал два поста за апрель. Раньше я не выкладывал ничего по 6 лет — теперь у меня в черновиках ещё восемь штук статей, включая этот. И проекты растут гораздо быстрее статей!</p>
<p>Я ненавижу инфоцыган, но на работе попросили рассказать про мой опыт использования ИИ. Оттуда выросло несколько статей, учебный курс, презентации и книга. Все в неотшлифованном виде, так что публиковать рано. Тем более каждый день я туда дописываю по кусочку и выстраиваю свой идеальный воркфлоу.</p>
<p><strong>Курсы и книга.</strong> Курс К01 «ИИ-Аудит 1С» — пять модулей по реализму процесса аудита плюс одиннадцать модулей самой механики. Курс К02 «ИИ-Разработка 1С» — структура и материалы (EDT, CodePilot1C, YAXUnit, SonarQube, GitSync). Книга «ИИ-аудит конфигураций 1С: полное руководство» по материалам К01 — две главы готовы, ещё несколько начаты, скрипт-сборщик в работе.</p>
<p><strong>Клиентские 1С-проекты</strong> — четыре активных направления. Техаудит большой 1С-системы с миграцией учёта (рекомендация архитектуры по результатам интервью с ИТ-командой сменилась с одной системы на три раздельные). Обновление складской системы у вендора с разбором обработчиков шинной интеграции и состоянием гонки в одном из обработчиков перемещения. Интеграция ЭТрН в УПП у производственного предприятия. Правки внешних форм для медицинской 1С. Без имён — это NDA-зона.</p>
<p><strong>Серия «Деформации ИИ»</strong> — семь черновиков о собственных граблях с моделью за апрель. Про синтетическую карту интеграций (контекстное заражение между проектами через общую папку), про самосохраняющиеся ошибки через ссылки, про инцидент со стиранием 100 файлов баз из-за уверенности в симметрии кодировок cp1251<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" />utf-8. Серия пишется как памятка-инструкция, не как обвинение модели — этим инструментом надо уметь пользоваться, и ошибки бывают и без него.</p>
<p><strong>ИИкона</strong> — мой pet-проект платформы ИИ-персонажа для контакт-центров. В апреле — исследование, диаграммы, описания API. Сам продукт ещё в подготовке, но <a href="https://github.com/andromanpro/1c-ai-connector">коннектор уже на гитхабе</a> — у него больше 50 звёзд. ИИ говорит, что мама бы мной гордилась). Только я понимаю, что он требует развития, но пока не могу к нему подобраться из за продуктивной прокрастинации.</p>
<p><strong>Инфраструктура (мини).</strong> SonarQube + BSL Plugin v1.17.2 запущены на NAS, форк CodePilot1C обновлён, openclaw перезапущен через NAS-ветку, удалённое управление Claude с телефона работает, скилл <code>cyrillic-paths</code> написан после двух инцидентов с кодировкой, скилл <code>androman-writing-style</code> собран после двух итераций самоанализа собственных текстов. Пара десятков мелких улучшений вокруг.</p>
<h2>Цифры месяца</h2>
<p>В сумме за апрель получилось:</p>
<ul>
<li><strong>~80 значимых сессий</strong> Claude Code (плюс пара сотен мелких автозадач — синтез заметок, обновление памяти, плановые скрипты; их в подсчёт человеческого времени не включаю)</li>
<li><strong>147 часов</strong> активного общения с моделью по правилу &lt;2 минут между сообщениями. Сначала посчитал по сессиям, получилось 169 — но это включает многозадачность (когда работают одновременно десктоп и удалённая сессия с телефона). После объединения по единому таймлайну осталось 147 — это реальное физическое время. Двадцать часов разницы — артефакт параллельной работы.</li>
<li>Пик активности — <strong>28 апреля, 9 часов</strong> (день публикации предыдущего поста)</li>
<li><strong>~300 МБ</strong> исходников в md / docx / pptx нового содержания</li>
<li><strong>~40 000 строк</strong> кода в pet-проектах (из прошлого поста)</li>
<li><strong>~50-60 значимых артефактов</strong> — документ / диаграмма / модуль / скилл / пост</li>
<li><strong>~150-200 модулей</strong> правленых в 1С-проектах</li>
<li><strong>2 публикации</strong> на блоге + <strong>7 черновиков</strong> «Деформаций» — уже больше</li>
</ul>
<p>Распределение часов по линиям (после нормализации на 147):</p>
<table>
<thead>
<tr>
<th>Линия</th>
<th>Часы Claude</th>
<th>Доля</th>
</tr>
</thead>
<tbody>
<tr>
<td>Другие клиентские 1С-проекты (4 направления)</td>
<td>~46</td>
<td>31%</td>
</tr>
<tr>
<td>Pet-проекты (WebGL/Canvas)</td>
<td>~36</td>
<td>25%</td>
</tr>
<tr>
<td>Продуктовый аудит крупной WMS-конфы</td>
<td>~30</td>
<td>20%</td>
</tr>
<tr>
<td>Блог androman.pro (перезапуск + переключения)</td>
<td>~13</td>
<td>9%</td>
</tr>
<tr>
<td>Инфраструктура / инструменты / исследования</td>
<td>~10</td>
<td>7%</td>
</tr>
<tr>
<td>Курсы К02 + книга</td>
<td>~6</td>
<td>4%</td>
</tr>
<tr>
<td>Личное (планирование, учёт времени)</td>
<td>~3</td>
<td>2%</td>
</tr>
<tr>
<td>ИИкона (исследование)</td>
<td>~3</td>
<td>2%</td>
</tr>
<tr>
<td><strong>Итого</strong></td>
<td><strong>~147</strong></td>
<td><strong>100%</strong></td>
</tr>
</tbody>
</table>
<p>Если бы делал то же самое <strong>без</strong> модели — приблизительная личная оценка по типам задач:</p>
<table>
<thead>
<tr>
<th>Линия</th>
<th>Часы Claude</th>
<th>Без ИИ — личная оценка</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pet-проекты (WebGL/Canvas)</td>
<td>36</td>
<td>~8 месяцев ≈ ~1280ч</td>
</tr>
<tr>
<td>Продуктовый аудит крупной WMS-конфы</td>
<td>30</td>
<td>~3 месяца аналитики ≈ ~480ч</td>
</tr>
<tr>
<td>Другие клиентские 1С (4 направления)</td>
<td>46</td>
<td>~2.5 месяца ≈ ~400ч</td>
</tr>
<tr>
<td>Блог (тема + содержание + инфра)</td>
<td>13</td>
<td>~1.5 месяца WordPress + материалов ≈ ~240ч</td>
</tr>
<tr>
<td>Инфраструктура / инструменты</td>
<td>10</td>
<td>~3 недели ≈ ~120ч</td>
</tr>
<tr>
<td>Обучение / книга</td>
<td>6</td>
<td>~3 недели на материалы ≈ ~120ч</td>
</tr>
</tbody>
</table>
<p>Грубая прикидка — <strong>~2640 часов руками против 147 с моделью</strong>. Звучит как полтора года в полный рабочий день против одного апреля, и именно поэтому к этой цифре надо относиться осторожно. Не как к бизнес-метрике, а как к личному дневниковому масштабу: где-то модель правда срезала месяцы входа в незнакомую область, а где-то просто сидела рядом, пока я глазами проверял результат.</p>
<p>Эту оценку я гонял вместе с ИИ, так что в коммерческую презентацию её тащить нельзя. Я мог завысить ручной эквивалент в одних местах и занизить в других. Но для личного смысла — порядок похож на правду.</p>
<h2>Где модель съела больше времени, чем сэкономила</h2>
<p>На фоне этой скорости есть отдельный класс эпизодов, где сжатие <strong>отрицательное</strong>. Когда я потратил больше времени, чем потратил бы без модели. В апреле — шесть таких. Все они стали черновиками серии «Деформации ИИ».</p>
<p><strong>Контекстное заражение через общую папку.</strong> В корне рабочей директории лежал CLAUDE.md одного проекта. Модель прочитала его как «общий контекст», и в выводы по другому проекту просочились имена, факты, отрасли. Я обнаружил это через несколько сессий — артефакты пришлось откатывать, проверять перекрёстными ссылками, переписывать. Стоимость — пара дней разбора. Без модели я бы такой ошибки не сделал, потому что не было бы общей папки.</p>
<p><strong>Восемь выдуманных методов БСП в одной поставке.</strong> Модуль уверенно ссылался на <code>СтрокаЯвляетсяЧислом</code>, <code>ОбщегоНазначения.ТекущаяОрганизация</code> и так далее — методов, которых в БСП <strong>не существует</strong>. Поймал ручной проверкой по ИТС в самом конце цикла, перед сдачей. Стоимость — половина смены на проверку и переписывание шести публичных файлов. Без модели — методов было бы меньше, но и существовали бы они все.</p>
<p><strong>Состояние гонки в обработчике перемещения.</strong> Модель сама же дважды переписала код «по-старому», после чего сама же выявила состояние гонки в собственном свежем коде. Колесо. Я три раза сидел и убеждал её, что <strong>именно</strong> это место она же ломала час назад.</p>
<p><strong>Стирание 100 файлов баз.</strong> Уверенность модели в том, что cp1251<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" />utf-8 симметрично. Не симметрично оказалось. Слетели имена баз — я думал что не имена, а сами базы, и обнаружил это в холодном поту. Восстановил из бэкапа за полчаса. Без бэкапа было бы драматичнее.</p>
<p><strong>Категоричные архитектурные утверждения.</strong> Четыре регрессии за одну сессию: «не подходит вообще», «обязательно нарушает стандарт», «100% / всегда / никогда» — без ссылки на ИТС, без открытых источников. Поймал сам через самопроверку. После этого сделал отдельный скилл, который заставляет модель отделять факты от компромиссов.</p>
<p><strong>«Сам написал — сам забыл».</strong> Создал скилл с правилом, в этой же сессии его нарушил. Скилл указывал — для сессий в EDT-проекте сначала использовать семантические индексы (edt-mcp / Serena), а не Read/Grep. ИИ сделал скилл, и через двадцать минут полез искать по <code>*.bsl</code> руками. Скилл сработал бы — если бы ИИ не забыл его прочитать.</p>
<p>Эти шесть эпизодов суммарно — часов десять чистого овертайма. На фоне 147 — около семи процентов. На самом деле не так много &#8212; раньше над затыками в архитектуре или в сложных блоках кода я мог просидеть намного дольше. Но тут ошибки перемалываются и исправляются очень оперативно.</p>
<p>ИИ как лошадь — везёт быстро. Но если не держать поводья, увезёт в овраг и сам же удивится, как мы сюда попали.</p>
<h2>Главное открытие: разгон</h2>
<p>Каждая закрытая задача в апреле порождала две следующие. Не «то, что я мог бы сделать» — а <strong>то, что я уже задумал и хочу сделать сейчас</strong>. Между «было бы круто» и «это задача до конца недели» теперь несколько часов размышления, а не несколько месяцев накопления квалификации.</p>
<p>Получается так:</p>
<ul>
<li>Барьер входа в новую область <strong>упал</strong>. Я зашёл в WebGL2 не зная что такое <code>display:flex</code>. В графовую визуализацию — без знаний D3. В книгу — никогда не писал книг. В разбор чужих кодовых баз через семантические индексы — раньше это была работа на месяц чтобы только настроить инструменты. Теперь — на полчаса.</li>
<li>Стоимость прототипа <strong>околонулевая</strong>. Идея → черновик → проверка реальности занимает один вечер. Большинство идей умирают на этапе черновика, и это нормально. Раньше до этой точки — недели.</li>
<li>Каждый закрытый проект <strong>порождает соседей</strong>. Большой WMS-аудит породил скилл <code>1c-product-audit-discovery</code>. Тот породил методологию для других аудитов. Та породила пост на блог. Тот породил идею книги. Та породила курс. Курс породил материалы для следующего курса. Все эти артефакты реально стоят отдельно, у каждого своя ценность.</li>
<li>Соединения <strong>между областями</strong> работают. Pet-проект <a href="https://github.com/andromanpro/ai-conversation-viz">ai-conversation-viz</a> — визуализация диалогов с моделью, и она оказалась полезной для аудита. Работа с клиентами породила методологию, методология стала книгой, книга породила скилл <code>androman-writing-style</code>. Всё взаимосвязано и работает как единый организм — по кирпичикам или частицам пазла. Как в факторио или сфера Дайсона (это игрушки, которые забрали много моего времени — я прям залипал)</li>
</ul>
<p>В предыдущем посте я сформулировал тот же паттерн как <strong>проблему</strong>: «Скорость реализации опережает способность приоритизировать». Через несколько дней я понимаю — это не проблема. Это и есть <strong>продукт</strong>.</p>
<p>Бэклог — это не «то, что не сделано». Это пространство возможного, и оно <strong>расширяется</strong>. Если сжать его обратно — потеряешь ровно то, ради чего всё начато. Можно ныть про 30 невыполненных задач, можно жить в реальности, где их 30 живых, и каждая интересна.</p>
<p>Маховик. Раз набрал скорость — несёт. Тормозить можно, но зачем. Главное чтобы он вынес в правильное русло.</p>
<h2>Что дальше</h2>
<p>Май — финал крупного WMS-аудита, начало 6-месячного забега до сертификата «1С:Совместимо». Книга — следующие главы. Серия «Деформации ИИ» — часть черновиков перейдёт сюда отдельными постами, рабочее название «инструкция по эксплуатации модели».</p>
<p>Но есть тема, о которой неудобно молчать. У меня хроническая проблема — <strong>закрывать</strong> проекты. СДВГ хорош для разгона: гиперфокус в окне интереса даёт ровно те пять часов в день, которые я насчитал в логах. Но за окном интереса — оставляет хвост. На каждый закрытый проект — два-три открытых, и не все из них доходят до релиза.</p>
<p>Хвост на май:</p>
<ul>
<li><strong>ИИкона</strong> — доработать. Накопились запросы пользователей, да я и сам понимаю чего ей не хватает.</li>
<li><strong>Расширение для 1С по генерации диаграмм через ИИ</strong> — закончить плагин и выпустить статью.</li>
<li><strong>Личный астролог</strong> — обработка + статья. Эзотерика + ИИ = чистое искусство перфоманса. Жалко только что кто-то воспримет всерьёз.</li>
<li><strong>ИИкзаменатор</strong> — учебная платформа на базе ИИконы для автоматического создания и прохождения тестов.</li>
<li><strong>make-it-zbs</strong> — волшебная кнопка для компа. Одной командой улучшить всё что можно. Идея крутая, надо доводить.</li>
</ul>
<p>Когда хвост закроется — если закроется — приступать к собственным коммерческим продуктам. Помощник по саду и огороду: куда что посажено, когда поливать, что обрезать, интернет вещей в перспективе. <strong>Шелл Апокалипсиса</strong> — личные коллекции топов медиа: «сто лучших фильмов / книг / игр / альбомов» в одном месте, локально без интернета.</p>
<p>Маховик и так крутится. Получится ли не отрастить новый хвост, пока закрываю старый — отдельный вопрос.</p>
<p>Поживём — увидим. Пока мне это нравится, а значит сам путь приносит удовольствие, а не конец пути. В общем я на пути к дзену!)</p>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/05/01/razgon/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/05/01/razgon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Когда заниматься 1С становится скучно</title>
		<link>https://androman.pro/2026/04/28/1c-stalo-skuchno/</link>
					<comments>https://androman.pro/2026/04/28/1c-stalo-skuchno/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Sun, 26 Apr 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[лаборатория]]></category>
		<category><![CDATA[1С]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[creative-code]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[WebGL]]></category>
		<guid isPermaLink="false">https://androman.pro/2026/04/27/1c-stalo-skuchno/</guid>

					<description><![CDATA[1С-разработчик, не знающий что такое display:flex, выкатил 7 WebGL/Canvas проектов за 5 недель. Потому что заскучал на ползунке опросника.]]></description>
										<content:encoded><![CDATA[<style>
.lava-orb-demo input[type="range"] {
  -webkit-appearance: none;
  appearance: none;
  height: 12px;
  background: linear-gradient(to right, #3b82f6 0%, #06b6d4 25%, #fbbf24 60%, #ef4444 100%);
  border-radius: 6px;
  border: 1px solid rgba(0, 212, 255, 0.35);
  box-shadow: 0 0 12px rgba(0, 212, 255, 0.2);
  outline: none;
  cursor: pointer;
}
.lava-orb-demo input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 60px;
  height: 60px;
  border-radius: 50%;
  background: transparent;
  opacity: 0;
  cursor: grab;
}
.lava-orb-demo input[type="range"]::-moz-range-thumb {
  width: 60px;
  height: 60px;
  border-radius: 50%;
  background: transparent;
  border: 0;
  opacity: 0;
  cursor: grab;
}
</style>
<div class="lava-orb-demo" style="text-align:center;padding:36px 24px;background:rgba(8,20,36,0.6);border:1px solid var(--border);border-radius:12px;margin:32px 0;">
<div style="font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--text-muted);letter-spacing:0.25em;margin-bottom:6px;">// LIVE DEMO · ДВА ОРБА</div>
<div style="font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--text-dim);letter-spacing:0.05em;margin-bottom:24px;">дёрни резко — оторвутся от ползунка → сведи вместе — взорвутся</div>
<div style="max-width:480px;margin:0 auto 48px;padding:0 40px;">
    <input type="range" min="0" max="10" value="3" step="1" id="lo-demo-slider-1" style="width:100%;"></p>
<div style="text-align:center;margin-top:14px;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.2em;"><span id="lo-demo-label-1">холодный</span> · <span id="lo-demo-val-1" style="font-size:18px;">3</span></div>
</p></div>
<div style="max-width:480px;margin:0 auto;padding:0 40px;">
    <input type="range" min="0" max="10" value="7" step="1" id="lo-demo-slider-2" style="width:100%;"></p>
<div style="text-align:center;margin-top:14px;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.2em;"><span id="lo-demo-label-2">тёплый</span> · <span id="lo-demo-val-2" style="font-size:18px;">7</span></div>
</p></div>
</div>
<script src="https://unpkg.com/@andromanpro/lava-orb@latest/dist/lava-orb.js"></script>
<script>
(function(){
  // value (0-10) → { label, color, glow }
  function temp(v){
    var n = +v;
    if (n <= 1)  return { label: 'мороз',       color: '#3b82f6', glow: 'rgba(59,130,246,0.5)' };
    if (n <= 3)  return { label: 'холодный',    color: '#06b6d4', glow: 'rgba(6,182,212,0.5)'  };
    if (n <= 5)  return { label: 'прохладный',  color: '#84cc16', glow: 'rgba(132,204,22,0.5)' };
    if (n <= 7)  return { label: 'тёплый',      color: '#fbbf24', glow: 'rgba(251,191,36,0.5)' };
    if (n <= 9)  return { label: 'горячий',     color: '#f97316', glow: 'rgba(249,115,22,0.5)' };
    return         { label: 'огонь',         color: '#ef4444', glow: 'rgba(239,68,68,0.5)'  };
  }
  function update(v, labelEl, valEl){
    var t = temp(v);
    valEl.textContent = v;
    labelEl.textContent = t.label;
    labelEl.style.color = t.color;
    valEl.style.color = t.color;
    valEl.style.textShadow = '0 0 12px ' + t.glow;
  }
  function init(){
    var i1 = document.getElementById('lo-demo-slider-1');
    var v1 = document.getElementById('lo-demo-val-1');
    var l1 = document.getElementById('lo-demo-label-1');
    var i2 = document.getElementById('lo-demo-slider-2');
    var v2 = document.getElementById('lo-demo-val-2');
    var l2 = document.getElementById('lo-demo-label-2');
    if (!i1 || !i2 || !window.LavaOrb) { setTimeout(init, 200); return; }
    var group = (typeof LavaOrb.createGroup === 'function')
      ? LavaOrb.createGroup({ name: 'demo' })
      : undefined;
    LavaOrb.attach(i1, { size: 60, group: group, detach: true, onChange: function(v){ update(v, l1, v1); } });
    LavaOrb.attach(i2, { size: 60, group: group, detach: true, onChange: function(v){ update(v, l2, v2); } });
    update(i1.value, l1, v1);
    update(i2.value, l2, v2);
  }
  init();
})();
</script>
<hr>
<p>В общем делаю автоматический воркфлоу по анализу бизнес-процессов в 1С для обследования предприятий. Добавил генерацию опросника — можно выбрать роль или должность, протыкать варианты ответов на вопросы, которые были выявлены ранее на основе анализа конфигурации и документации, и выгрузить всё в JSON. Не нужно тратить время на многочасовые интервью.</p>
<p>Но дело не в этом.</p>
<p>Посмотрел я, с какой скоростью с ИИ получится сделать опросник. Добавил тёмную тему на выбор, контроль неотвеченных вопросов, даже салют при завершении. Всё, можно закрывать.</p>
<p>А потом мой взгляд упал на скучные ползунки выбора приоритетов.</p>
<p>Тут-то всё и заверте…</p>
<hr>
<p>Наступили выходные, а ощущение незавершённости не отпускало. Обычный ползунок от 1 до 10 — это же просто цифра, не показательно.</p>
<p>Пришлось развивать — прототип, другой, третий. Покрутил настройки частиц. Узнал что есть Canvas 2D и WebGL 2 (ну как узнал — просто что они существуют). Добавил DOOM-fire (прям как из культовой игры, ну вы поняли) режим как альтернативный движок пламени. Попробовал сделать взрывы, физику воды, отрывающиеся от ползунка орбы, которые улетают по дуге.</p>
<p>Задача была в том числе — проверить, получится ли через ИИ сделать что-то в незнакомой области. Без глубокого погружения в шейдеры и прочие термины которые я впервые увидел на прошлой неделе.</p>
<p>Получилось.</p>
<p>Я думал — сделаю пару эффектов на ползунок и пойду обратно к опроснику.</p>
<p><strong>Что выросло за 5 недель параллельной работы:</strong></p>
<ul>
<li><strong>npm-библиотека <code>@andromanpro/lava-orb</code></strong> — привязывается к любому <code>&lt;input type="range"&gt;</code> одной строкой. От мороза до огня, взрывов и молний.</li>
<li><strong>2 одностраничные игры</strong> — ORB 2048 (жидкие сливающиеся сферы с процедурной музыкой) и ORB ARKANOID (арканоид где блоки — орбы с физикой волн). Оба работают офлайн одним HTML-файлом.</li>
<li><strong>2 интерактивных редактора</strong> — для тонкой настройки жидкости и огня в реальном времени. С экспортом пресетов.</li>
<li><strong>Библиотека из 7 WebGL2-фонов</strong> — drop-in для любой страницы.</li>
</ul>
<p>Всё это — MIT, на GitHub.</p>
<p><img decoding="async" alt="От холода к огню — один и тот же ползунок, разные значения" src="https://raw.githubusercontent.com/andromanpro/lava-orb/main/article/gifs/02-cold-to-hot.gif"></p>
<p>Ни одного профильного курса по веб-разработке я не проходил. Я вообще не знаю, что такое <code>box-sizing</code> и <code>display: flex</code>)))</p>
<hr>
<p>Помните 2048? Ту простую головоломку с плитками, которая в 2014-м разошлась по всем сторам за несколько недель. Сделал свою версию — с жидкими светящимися сферами вместо цифровых плиток. И залип.</p>
<p><strong>Геймплей:</strong><br />
&#8212; Классическая сетка 4×4, свайпы / стрелки / WASD<br />
&#8212; Ячейки — жидкие metaballs через marching squares, сливаются как капли ртути<br />
&#8212; На высоких значениях — процедурный огонь частицами с glow и затуханием<br />
&#8212; При 2048 — <strong>supernova</strong>: space warp, chromatic aberration, 250 частиц, тряска камеры<br />
&#8212; Игра продолжается — 4096, 8192, логотип подхватывает</p>
<p><strong>Звук:</strong><br />
8 процедурных треков через Web Audio API, никаких mp3. Oscillator + filter + reverb синтезируются в браузере. Адаптивный темп — чем больше ячеек, тем быстрее.</p>
<p><strong>Рендеринг:</strong><br />
WebGL2 с Canvas2D fallback. 4 фона на выбор (Cyberpunk / Space / Dark / Synthwave). RU/EN локализация.</p>
<p><strong>Бот / Autoplay</strong> — запускаешь, смотришь как играет сам. Максимум набирает <strong>65 536</strong> (16 слияний — дальше на сетке 4×4 места нет, но есть настройка для большей сетки!).</p>
<p>Для СДВГ-шников — идеальная сенсорная подкормка. Запускаешь на втором мониторе или в углу экрана, свернул — периферическое зрение ловит постоянное мельтешение жидких сфер, мозгу хорошо, на основной задаче сидишь ровнее.</p>
<p>Режим отладки оставил прямо в сборке — FPS, хитбоксы, статистика. Не стал прятать от прода, пусть смотрит кто хочет.</p>
<p>Один файл <code>Orb-2048.html</code> ~330 KB. Скачал на телефон в самолёт — играешь офлайн.</p>
<div class="game-embed" data-src="https://andromanpro.github.io/orb-2048/" data-label="ЗАПУСТИТЬ ORB 2048" style="position:relative;cursor:pointer;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#030712;margin:24px 0;">
  <img decoding="async" src="https://raw.githubusercontent.com/andromanpro/orb-2048/main/media/gameplay1.gif" alt="ORB 2048 gameplay" style="display:block;width:100%;height:auto;"></p>
<div class="game-embed-overlay" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(3,7,18,0.55);transition:background 0.2s;">
    <button type="button" style="background:var(--cyan);color:#030712;border:none;padding:14px 28px;font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;border-radius:4px;cursor:pointer;letter-spacing:0.15em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ЗАПУСТИТЬ ORB 2048</button>
  </div>
</div>
<p><strong>Live:</strong> <a href="https://andromanpro.github.io/orb-2048/">andromanpro.github.io/orb-2048</a></p>
<hr>
<p>Если 2048 — про «плавное слияние», то арканоид — про «разрушение». Идея: блоки — это не кубики, а светящиеся орбы-капсулы с жидкостью. Она реагирует на удар волной, а при разрушении выливается вниз, передавая волну соседям.</p>
<p>Так и сделал.</p>
<p><strong>Геймплей:</strong><br />
&#8212; 15 уровней, каждый со своей темой, музыкой и фоном<br />
&#8212; 9 типов орбов — Fire, Ice, Water, Earth, Lava, Steel, Gold, TNT, Rainbow (у каждого своя физика и звук удара)<br />
&#8212; 8 power-up — расширение/сужение платформы, огненный шар, мультишар, прилипание, лазерные турели, жизнь, замедление времени<br />
&#8212; Комбо-система и локальная таблица рекордов</p>
<p><strong>Технологии:</strong><br />
&#8212; WebGL2 SDF-шейдер для орбов — круглый SDF, 2 слоя жидкости с Catmull-Rom интерполяцией, спекулярный блик<br />
&#8212; Verlet 6-колоночная пружинная симуляция волн<br />
&#8212; Процедурная музыка на каждый уровень</p>
<p><strong>Тюнинг шарика:</strong><br />
Тип хвоста (FIRE / LAVA / PLASMA / ICE), длина S/M/L, размер S/M/L. Превью шарика в настройках — живая анимация на весь экран, клик для запуска.</p>
<p><strong>Бот</strong> со скоростью ×2.5. Прицеливается в конкретные орбы, проходит уровни сам. Можно включить и бесконечный режим — уровни продолжают генерироваться сверх 15 штук, бот разбивает бесконечно. Играет лучше меня.</p>
<p>Запустил бота в бесконечном режиме, свернул окно в угол — и пока работаешь в основном, боковым зрением ловишь как шарик дробит орбы, жидкость выливается, комбо растут.</p>
<p>Режим отладки тоже оставил в сборке — FPS, хитбоксы, прыжки между уровнями через <code>[</code> и <code>]</code>. Dev-инструменты не прятал.</p>
<p><strong>97 unit-тестов</strong> встроенных в <code>game.js</code>. Я сам не представлял, что в браузерной игре буду их писать. Но если разрабатывать <strong>с</strong> ИИ — приходится проверять каждый шаг.</p>
<p>Один файл ~225 KB, работает офлайн.</p>
<div class="game-embed" data-src="https://andromanpro.github.io/orb-arkanoid/" data-label="ЗАПУСТИТЬ ORB ARKANOID" style="position:relative;cursor:pointer;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#030712;margin:24px 0;">
  <img decoding="async" src="https://raw.githubusercontent.com/andromanpro/orb-arkanoid/main/media/gameplay.gif" alt="ORB ARKANOID gameplay" style="display:block;width:100%;height:auto;"></p>
<div class="game-embed-overlay" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(3,7,18,0.55);transition:background 0.2s;">
    <button type="button" style="background:var(--cyan);color:#030712;border:none;padding:14px 28px;font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;border-radius:4px;cursor:pointer;letter-spacing:0.15em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ЗАПУСТИТЬ ORB ARKANOID</button>
  </div>
</div>
<p><strong>Live:</strong> <a href="https://andromanpro.github.io/orb-arkanoid/">andromanpro.github.io/orb-arkanoid</a></p>
<p><strong>Важный юридический момент.</strong> Arkanoid — зарегистрированная торговая марка Taito с 1986 года (легендарная японская компания, сейчас в составе Square Enix). Моя игра называется ORB ARKANOID чисто как дань уважения жанру — пока это open-source прикол, никто не придёт.</p>
<p>Но если я начну рубить с этого капусту — Taito быстро найдёт меня через юристов. Код можно форкать (MIT разрешает), но имя «Arkanoid» — не моё чтобы его дарить. Для коммерческого форка придётся переименовать в что-то нейтральное вроде <strong>ORB BREAKOUT</strong> (слово «breakout» — общий жанр, не товарный знак), поменять логотип — и тогда можно идти в сторы.</p>
<p>Это к вопросу «а можно я возьму и продам» — в принципе можно, но с переименованием.</p>
<hr>
<p>Решил посчитать — сколько я реально на это потратил.</p>
<p>Прошёлся по логам сессий Claude Code — там у каждого сообщения timestamp. Если между сообщениями меньше 2 минут — это активная работа. Больше 2 минут — отошёл или задумался без ИИ.</p>
<p><strong>Итог: 41 час активного общения. На 7 артефактов, 40 981 строку кода.</strong></p>
<p>Для сравнения, 1С-разработчику без веб-опыта (это я) без ИИ на это ушло бы:<br />
&#8212; 3 месяца на изучение стека (HTML / CSS / JS / Canvas2D / WebGL2 / WebAudio)<br />
&#8212; Ещё ~6 месяцев на реализацию</p>
<p>Грубая оценка — около 8 месяцев full-time вместо 5 недель коротких периодических сессий. Не научная цифра, просто мой внутренний «сколько бы я на это убил, если бы шёл один».</p>
<p>Ускорение не в «ИИ пишет код за тебя». Оно в том, что ИИ убирает <strong>барьер незнания</strong>. Можешь формулировать задачу словами и сразу получать рабочий прототип — вместо того чтобы тонуть в документации к шейдерам, которая предполагает, что ты уже знаешь что такое SDF, metaballs и Verlet integration.</p>
<p>Для меня это самая сильная зона ИИ: незнакомые специализированные домены, где сначала нужно месяцами накапливать словарь, а только потом начинать делать.</p>
<script>
(function(){
  document.querySelectorAll('.game-embed').forEach(function(el){
    var overlay = el.querySelector('.game-embed-overlay');
    if (overlay) {
      el.addEventListener('mouseenter', function(){ overlay.style.background = 'rgba(3,7,18,0.25)'; });
      el.addEventListener('mouseleave', function(){ overlay.style.background = 'rgba(3,7,18,0.55)'; });
    }
    el.addEventListener('click', function(){
      var src = el.dataset.src;
      if (!src) return;
      var iframe = document.createElement('iframe');
      iframe.src = src;
      iframe.setAttribute('allow', 'autoplay; fullscreen');
      iframe.setAttribute('loading', 'lazy');
      iframe.style.cssText = 'display:block;width:100%;height:700px;border:none;';
      el.innerHTML = '';
      el.appendChild(iframe);
      el.style.cursor = 'default';
    });
  });
})();
</script>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/04/28/1c-stalo-skuchno/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/04/28/1c-stalo-skuchno/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
