BUILD182 — SQL без игрока удаления, Preview через триггер, общая ссылка «Свои плюсы» Версия: 2026.10.02.3, 02.10.2026 Обновление поверх BUILD181 / 2026.10.02.2. УСТАНОВКА 1. Сохраните резервную копию файлов, которые будете заменять. 2. Остановите приложение и распакуйте архив в корень проекта с заменой файлов, сохранив структуру папок. В архиве ровно шесть изменённых файлов программы. 3. Запустите приложение заново и обновите браузер через Ctrl+F5. 4. Проверьте отображение версии 2026.10.02.3. SQL ПРИ ОТСУТСТВИИ ИГРОКА УДАЛЕНИЯ Пустые ID игрока выделенного удаления теперь передаются в запрос как SQL NULL, вместо остановки с «Не хватает переменных». Ваш запрос WITH params / NULLIF / LEFT JOIN можно оставить без изменений. SQL выполнится и сможет вернуть данные самого нарушения и длительность штрафа даже без игрока. Это относится к player_id и player_db_id для selected_penalty, selected_home_penalty, selected_away_penalty, active_home_penalty, active_away_penalty. Остальные обязательные параметры проверяются как раньше. У командного штрафа ID игрока очищается даже при старом сохранённом игроке. НАСТРОЙКА ПОДСМОТРА УДАЛЕНИЯ В VMIX 1. Откройте «События и триггеры» и добавьте триггер. 2. Источник / Action ID: ваш блок «Хоккей: дашборд удалений». 3. Событие: penalty_selected — удаление выбрано для подсмотра. 4. item_id оставьте пустым, чтобы срабатывало для любого удаления. 5. Действие: «Титр в Preview (обновить SQL/Mapping)». 6. Нажмите «Обновить список Inputs», если нужного титра нет в списке. Выберите его в «Название Input / титра» и нажмите «Сохранить». 7. Во вкладке «Игра» нажмите на карточку удаления вне кнопок управления. Сначала сохраняется выделенное удаление, затем выполняются SQL/Mapping только этого Input и после этого отправляется PreviewInput. Включать периодическое автообновление SQL для этой операции не требуется. Если для разных сторон нужны разные титры, создайте два триггера: поле условия detail.side, оператор «Равно», значения home и away соответственно. Без условий достаточно одного триггера для всех удалений. Input сохраняется и вызывается по названию. Настройка хранится в существующих файлах конфигурации интерфейса и переживает перезапуск приложения. Триггер отправляет титр в Preview; быстрые выборы удалений выполняются по порядку. Ошибки SQL/доставки отображаются оператору. Фатальная ошибка Mapping блокирует Preview; независимые рабочие связи сохраняют прежний режим частичного обновления. ССЫЛКА «СВОИ ПЛЮСЫ» Одна общая ссылка загружается для любого матча и обоих языков. Изменяйте её в шапке «Свои плюсы» — «Ссылка для всех матчей». После автосохранения новое значение используется при открытии других матчей. Открытие ссылки по-прежнему происходит в новой вкладке браузера. Заметки и статусы строк остаются отдельными для каждого матча. Обычное редактирование строк не отправляет старую копию ссылки на сервер. Ссылка хранится в settings/local/hockey_custom_pluses.json. Этот файл создаётся автоматически и в архив обновления не включён. При первом использовании переносится непустая ссылка из последнего обновлённого матча предыдущей версии. После явного очищения старые значения не возвращаются. ПРОВЕРКИ 125 проверок новых изменений и совместимости на изолированной тестовой базе. Проверено выполнение WITH/LEFT JOIN без игрока, заполненный игрок, очистка ID, передача NULL, сохранение конфигурации и общая ссылка между матчами/перезапусками. Браузерные проверки: реальный клик по карточке, context -> SQL/Mapping -> Preview, быстрые переключения и синхронизация параметров таймерами, ошибки, зритель, условия сторон, сохранение настроек, общая ссылка и размеры интерфейса. Для тестовой SQLite-базы адаптированы PostgreSQL ::text и LEFT; производственный запрос и его имена параметров не меняются. Вызовы vMix проверены с имитацией Agent. Рабочая база и реальный эфир при проверках не использовались. Один старый статический тест на четыре Overlay исключён: до этого обновления приложение уже поддерживало восемь каналов Overlay. СОСТАВ АРХИВА app.py hockey_data/config.py hockey_data/service.py hockey_data/mapping_context.py ui_builder/manager.py ui_builder/static/app.js README_UPDATE182_RU.txt