О документе
Документ подготовлен для BUSSOL Consent Manager, модуль bussol.policy2 версии 2.1.0, на основе фактической структуры релизного архива. Он предназначен для владельца проекта, администратора 1С-Битрикс, интегратора, разработчика и специалиста, отвечающего за cookie и пользовательские согласия.
| Параметр | Значение |
|---|---|
| Продукт | BUSSOL Consent Manager |
| Позиционирование | Cookie Consent Manager для 1С-Битрикс — сканер сайта, блокировка сервисов, журнал согласий и ФЗ-152 |
| ID модуля | bussol.policy2 |
| Версия | 2.1.0 |
| Дата релиза | 01.10.2026 |
| Контрольный SHA-256 архива | 873489a9bbb092bac2b515881857313ad8c60bb27cfaf87f3553671303222119 |
| Проверенная совместимость | Композитный режим на готовых решениях Аспро, INTEC и Сотбит Розница — подтверждено практическими тестами владельца продукта. |
Разделы 1–6 нужны для установки и запуска, 7–14 — для функциональной настройки, 15–16 — для интегратора и разработчика, 17–18 — для эксплуатации, диагностики и приёмки.
1. Назначение и модель решения
BUSSOL Consent Manager — отдельный модуль 1С-Битрикс, который автоматически подключает на публичных страницах интерфейс управления согласием, блокирует распознанные сторонние ресурсы до разрешения нужной категории, ведёт журнал действий пользователя и предоставляет административные инструменты для аудита и диагностики.
| Уровень | Роль в решении |
|---|---|
| Автоподключение | Обработчик OnEndBufferContent внедряет bootstrap, consent.js и корневой контейнер без ручного IncludeComponent(). |
| Серверный блокировщик | До отдачи HTML переводит распознанные script/iframe/img/link/object/embed/source в заблокированное состояние. |
| Клиентский Consent Center | Shadow DOM-интерфейс: принять всё, отказаться, выбрать категории, повторно изменить решение или отозвать согласие. |
| Менеджер сервисов | Связывает домены, сигнатуры, cookie и типы ресурсов с категорией согласия. |
| Сканер сайта | Same-origin обход страниц и инвентаризация известных сторонних подключений. |
| Журнал и политика | Consent log, редакции политики, SHA-256 snapshot/fingerprint, HMAC-цепочка, аналитика и CSV. |
| Интеграция Bitrix | Запись согласий через штатный UserConsent\Consent::addByContext(), административное меню, D7 ORM и события main. |
Установил → включил → настроил → виджет работает. Правка header.php/footer.php и обязательное размещение компонента не требуются.
2. Возможности версии 2.1.0
- Срок хранения согласия и повторный запрос при изменении версии политики.
- Кнопки «Принять все», «Отказаться», «Настроить», сохранение индивидуального выбора и отзыв согласия.
- Произвольные категории; necessary всегда остаётся обязательной.
- Встроенные профили сервисов: Яндекс.Метрика, Google Analytics, Google Tag Manager, VK Pixel/VK Ads, YouTube, Rutube, Vimeo, JivoSite, Calltouch, Roistat, Google reCAPTCHA, Яндекс.Карты.
- Серверная блокировка script, iframe, img, link, object, embed, source; клиентская обработка динамических ресурсов и сетевых сценариев.
- Перехват document.cookie для известных cookie и удаление cookie запрещённых категорий после отказа или отзыва.
- Google Consent Mode v2: analytics_storage, ad_storage, ad_user_data, ad_personalization, functionality_storage, personalization_storage, security_storage.
- Журнал согласий и согласий форм: пользователь, IP-режим, страна/регион, URL, User-Agent, категории, версия/редакция политики и Bitrix consent ID.
- HMAC-связанная цепочка записей и проверка её целостности.
- Неизменяемые снимки редакций политики с SHA-256.
- Добавление согласия к формам по CSS-селекторам, исключения и обязательная валидация.
- Автоподключение, многосайтовые настройки, URL-правила показа и независимые URL-правила блокировки.
- Композит-совместимая загрузка: статический HTML содержит нейтральный loader, актуальная конфигурация запрашивается no-store.
- Shadow DOM, accessibility, RU/EN, региональные режимы, генератор политики, Scanner, Dashboard, Diagnostics, PHP/JS API.
Модуль технически управляет загрузкой ресурсов и фиксацией согласий, но не определяет юридическую достаточность конкретного текста политики. Сформированный генератором документ необходимо проверить под реальные процессы сайта.
3. Системные требования и совместимость
| Требование | Комментарий |
|---|---|
| Платформа | Самостоятельно размещённая 1С-Битрикс: Управление сайтом / коробочная установка, где разрешена установка PHP-модулей. |
| PHP | Встроенная проверка конфигурации считает совместимым диапазон PHP 8.1–8.4; сборка 2.1.0 синтаксически проверена на PHP 8.4. |
| Модуль main | Используются публичные D7 API, EventManager, Option, ORM, UserConsent и административная инфраструктура 1С-Битрикс. |
| JavaScript | Современный браузер с Shadow DOM, CustomEvent, fetch/Promise. Для старых браузеров требуется отдельная политика поддержки. |
| HTTPS | Рекомендуется. Cookie согласия получает Secure автоматически при HTTPS. |
| Сайты24 / Landing | Поддерживается сценарий коробочной установки Bitrix Landing/Сайты24, где модуль может работать на финальном HTML. Облачный Bitrix24 не устанавливает PHP Marketplace-модули тем же способом. |
| Готовые решения | Архитектура не зависит от CSS-классов конкретного шаблона; практическая стабильность с включённым Композитом проверена на Аспро, INTEC и Сотбит Розница. |
Публичный интерфейс рендерится в Shadow DOM, а сам корневой контейнер внедряется независимо от layout-классов шаблона. Для согласий форм применяются настраиваемые CSS-селекторы и отдельный namespaced-класс.
4. Установка, обновление и удаление
Установка
Распакуйте Marketplace-пакет в /bitrix/modules/bussol.policy2/ и установите модуль через стандартный менеджер модулей 1С-Битрикс. При установке регистрируется ID bussol.policy2, создаются таблицы, события, агент очистки журнала и копируются публичные ресурсы.
| Что устанавливается | Путь / действие |
|---|---|
| Резервный компонент | /bitrix/components/bussol/policy2.widget |
| JS/CSS | /bitrix/js/bussol.policy2 |
| Публичные endpoints | /bitrix/tools/bussol.policy2 |
| Административные прокси | /bitrix/admin/bussol.policy2_*.php |
| Иконка меню | /bitrix/themes/.default/icons/bussol.policy2/icon_policy.png |
| События | OnBuildGlobalMenu и OnEndBufferContent |
| Агент | \Bussol\Policy2\LogCleaner::run(); раз в 86400 секунд |
Обновление с 2.0.0
Migration::install() создаёт недостающие таблицы и добавляет новые поля в b_bussol_policy2_consent без удаления существующих строк. Миграция содержит ветки для MySQL-family, PostgreSQL и SQLite при добавлении колонок.
Удаление
При удалении можно сохранить данные. Если параметр savedata=Y, таблицы и опции не удаляются. При полном удалении удаляются таблицы consent/revision/scan, файлы, события, агент и настройки модуля.
Сделайте резервную копию базы и каталога /bitrix/modules/bussol.policy2, а после обновления откройте «Диагностика» и проверьте живое автоподключение, JS, config endpoint и целостность журнала.
5. Быстрый запуск и автоматическое подключение
Автоматический вывод — основной и рекомендуемый режим. После установки для каждого нужного сайта оставьте включёнными «Модуль включён» и «Автоматически подключать Consent Manager». Обработчик OnEndBufferContent выполняется на итоговом HTML публичной страницы.
| Шаг | Действие |
|---|---|
| 1 | Открыть BUSSOL → Consent Manager → Настройки и выбрать SITE_ID. |
| 2 | Проверить ENABLED=Y и AUTO_INJECT=Y. |
| 3 | Настроить срок согласия, тексты, категории, сервисы и политику. |
| 4 | Сохранить. Создаётся редакция политики; выполняется очистка Static HTML Cache и BXClearCache. |
| 5 | Открыть Диагностику и дождаться статусов «Виджет обнаружен», «JS загружен», «Конфигурация получена». |
В head внедряются bootstrap и /bitrix/js/bussol.policy2/consent.js?v=2.1.0, а перед </body> — <div id="bussol-policy2-root" data-bussol-policy2-root></div>. Актуальная конфигурация загружается из /bitrix/tools/bussol.policy2/config.php?site_id=... с Cache-Control: no-store.
// Ручной компонент нужен только как резервный режим
$APPLICATION->IncludeComponent('bussol:policy2.widget', '', []);В обычной эксплуатации компонент вручную размещать не нужно. Если AUTO_INJECT=N, можно использовать резервный компонент.
6. Административный центр и многосайтовость
| Экран | Назначение |
|---|---|
| Обзор | Согласия за 30 дней, согласия форм, accept_all/reject/withdraw, статус проверки конфигурации и быстрые действия. |
| Настройки | Основное, категории, сервисы, формы, приватность/регионы, политика и Developer API. |
| Сканер сайта | Same-origin аудит сторонних сервисов и сохранение находок. |
| Журнал и аналитика | Фильтрация записей, статистика, CSV-экспорт. |
| Диагностика | Серверные проверки, HMAC verify и живая проверка публичной страницы. |
Настройки хранятся в Bitrix Option с привязкой к SITE_ID. При установке дефолты создаются для активных сайтов. В каждом административном разделе можно работать с выбранным сайтом.
Ключевые настройки по умолчанию
| Параметр | Значение по умолчанию |
|---|---|
| ENABLED / AUTO_INJECT | Y / Y |
| POSITION | bottom |
| SHOW_DELAY | 250 мс |
| CONSENT_DAYS | 365 дней |
| POLICY_VERSION | 2.1.0 |
| SHOW_REOPEN | Y |
| STRICT_COOKIE_BLOCKING / DYNAMIC_BLOCKING | Y / Y |
| LOG_RETENTION_DAYS | 730 дней |
| IP_MODE | mask |
| CONSENT_MODE_ENABLED | Y |
| SCANNER_MAX_PAGES / SCANNER_TIMEOUT | 20 страниц / 8 секунд |
| LOCALE_MODE / LOCALE_DEFAULT | auto / ru |
7. Категории, баннер и Consent Center
Категории не зашиты в публичный интерфейс. Администратор может создавать собственные коды, названия, описания, обязательность, включённость и сортировку. Код necessary всегда считается обязательным и восстанавливается, если его случайно удалить из конфигурации.
| Категория по умолчанию | Назначение | Обязательная |
|---|---|---|
| necessary | Базовая работа сайта | Да |
| functional | Предпочтения и дополнительные функции | Нет |
| analytics | Измерение посещаемости и улучшение сайта | Нет |
| marketing | Реклама, ретаргетинг и встраиваемый контент | Нет |
Пользователь может принять всё, отказаться от необязательных категорий, открыть подробные настройки, сохранить индивидуальный выбор и позднее повторно открыть центр управления. При withdraw cookie BUSSOL_POLICY2_CONSENT удаляется, а модуль очищает известные cookie запрещённых категорий.
Cookie согласия
| Параметр | Реализация |
|---|---|
| Имя | BUSSOL_POLICY2_CONSENT |
| Срок | CONSENT_DAYS, минимум 1 день |
| Path | / |
| SameSite | Lax |
| Secure | Автоматически на HTTPS |
| HttpOnly | Нет, поскольку состояние читается клиентским Consent Center |
| Повторное согласие | Если policy в cookie не равен текущей POLICY_VERSION, старое состояние не принимается. |
8. Менеджер сторонних сервисов и блокировка ресурсов
Профиль сервиса связывает код сервиса с категорией, доменами, сигнатурами, cookie и допустимыми типами ресурсов. Одни и те же правила используют серверный блокировщик, клиентский блокировщик и сканер.
| Встроенный профиль | Категория по умолчанию |
|---|---|
| Яндекс.Метрика | analytics |
| Google Analytics | analytics |
| Google Tag Manager | analytics |
| VK Pixel / VK Ads | marketing |
| YouTube | marketing |
| Rutube | marketing |
| Vimeo | marketing |
| JivoSite | functional |
| Calltouch | analytics |
| Roistat | analytics |
| Google reCAPTCHA | functional |
| Яндекс.Карты | functional |
Серверная блокировка
ContentBlocker обрабатывает script, iframe, img, link, object, embed и source. Для script тип меняется на text/plain, исходные src/type сохраняются в data-bussol-*; для iframe/object/embed используется about:blank, для изображений/source — прозрачный placeholder. После разрешения категории клиентский код восстанавливает ресурс.
<script data-bussol-category="analytics" src="/custom-analytics.js"></script>
<iframe data-bussol-category="marketing" src="https://example.com/embed"></iframe>
<!-- Полное исключение из обработки -->
<script data-bussol-skip src="/must-run.js"></script>Cookie и динамические ресурсы
При STRICT_COOKIE_BLOCKING=Y модуль пытается перехватить document.cookie и не записывать cookie, сопоставленные с запрещённой категорией. Purge удаляет известные cookie запрещённых категорий. MutationObserver и сетевые guards предназначены для поздно добавленных ресурсов и известных fetch/XHR/sendBeacon сценариев.
Автоматическая блокировка основана на доменах/сигнатурах/явной data-bussol-разметке. Обфусцированный код, проксирование через собственный домен или нетипичная загрузка могут потребовать пользовательского профиля сервиса или интеграции через API.
9. Google Consent Mode v2
При включённом CONSENT_MODE_ENABLED модуль до получения согласия устанавливает default-состояние denied для аналитических/рекламных/функциональных параметров и granted для security_storage. После выбора пользователя выполняется consent update.
| Consent Mode параметр | Категория BUSSOL |
|---|---|
| analytics_storage | analytics |
| ad_storage | marketing |
| ad_user_data | marketing |
| ad_personalization | marketing |
| functionality_storage | functional |
| personalization_storage | functional |
| security_storage | всегда granted |
Дополнительные настройки: wait_for_update (по умолчанию 500 мс), url_passthrough и ads_data_redaction. Событие consentModeUpdated отправляется после обновления состояния.
Если GTM устанавливается через модуль, убедитесь, что его профиль относится к правильной категории и что сам контейнер не внедряется раньше BUSSOL Consent Manager альтернативным кодом шаблона.
10. Автоматический сканер сайта
Scanner выполняет ограниченный same-origin обход. Он не является удалённым vulnerability scanner: задача — инвентаризация подключений для настройки Consent Manager.
| Параметр | Поведение |
|---|---|
| Стартовый URL | Полный http/https URL текущего сайта. |
| Граница обхода | Только тот же origin. |
| Лимит | 1–50 страниц; настройка по умолчанию 20. |
| Timeout | SCANNER_TIMEOUT, по умолчанию 8 секунд. |
| Исключаемые ссылки | mailto:, tel:, javascript:, якоря, а также типичные файлы jpg/png/svg/pdf/zip/css/js/xml. |
| Что ищется | script/iframe/img/link/object/embed/source и inline-сигнатуры известных сервисов. |
| Хранение | b_bussol_policy2_scan: run ID, URL страницы, тип ресурса, сервис, категория, URL ресурса, evidence, статус. |
По завершении сохраняются SCANNER_LAST_RUN и SCANNER_LAST_SUMMARY. На административном экране результаты можно использовать как аудит покрытия сервисов.
В Scanner 2.1.0 User-Agent всё ещё содержит строку BUSSOL-Policy2-Scanner/3.0. На функциональность это не влияет, но перед публикацией следующей сборки строку желательно привести к 2.1.0.
11. Журнал согласий, аналитика, IP и целостность
Каждое решение пользователя сохраняется в b_bussol_policy2_consent. Согласия форм пишутся в ту же таблицу с EVENT_TYPE=form, что позволяет централизовать историю.
| Поле / группа | Что хранится |
|---|---|
| Идентификация | SITE_ID, CONSENT_UID, USER_ID |
| Событие | EVENT_TYPE, DECISION, CATEGORIES |
| Сеть и регион | IP, COUNTRY, REGION |
| Политика | POLICY_VERSION, POLICY_REVISION_ID, POLICY_HASH, POLICY_SNAPSHOT |
| Bitrix | BITRIX_CONSENT_ID |
| Контекст | URL, USER_AGENT, META_JSON, DATE_CREATE |
| Целостность | PREV_HASH, ENTRY_HASH |
Режимы IP
| Режим | Поведение |
|---|---|
| none | IP не сохраняется. |
| mask | IPv4 обнуляет последний октет; IPv6 сохраняет первые 64 бита. Режим по умолчанию. |
| hash | HMAC-SHA256 от IP с секретом сайта. |
| full | Сохраняется полный IP. |
Proxy-заголовки игнорируются по умолчанию. При IP_TRUST_PROXY=Y рассматриваются только перечисленные IP_TRUSTED_HEADERS. Это снижает риск доверия произвольному X-Forwarded-For.
HMAC-цепочка
SecureLog берёт ENTRY_HASH предыдущей записи (для первой — GENESIS), канонизирует ключевые поля и вычисляет HMAC-SHA256 с сайто-специфичным секретом. Diagnostics может проверить последовательность и указать ID нарушенных записей.
Аналитика и экспорт
Dashboard и LogAnalytics считают total, consent, form, accept_all, reject, custom, withdraw и распределение разрешённых категорий за выбранный период. CSV-экспорт ограничен 50 000 строками за один вызов и использует разделитель «;» с UTF-8 BOM.
Агент удаляет записи старше LOG_RETENTION_DAYS. После удаления начала цепочки проверка оставшейся последовательности продолжает работать относительно первого доступного PREV_HASH, но архивную доказательность за удалённый период следует обеспечивать отдельным регламентом экспорта/хранения.
12. Политика, версии, генератор и UserConsent
При каждом сохранении настроек PolicyRevisionManager создаёт forced snapshot. В редакцию входят версия, HTML политики, категории, сервисы, срок согласия, региональный режим и флаг согласия форм. SHA-256 считается от JSON снимка.
| Сущность | Назначение |
|---|---|
| POLICY_VERSION | Логическая версия политики; также входит в подписанный публичный token и используется для re-consent. |
| b_bussol_policy2_revision | Неизменяемые редакции с HASH, POLICY_HTML, CATEGORIES_JSON, SERVICES_JSON и CONFIG_JSON. |
| POLICY_HASH / POLICY_SNAPSHOT в журнале | Связывают конкретное решение пользователя с редакцией, которую видел сайт в тот момент. |
| BITRIX_AGREEMENT_ID | Штатное соглашение Bitrix для cookie consent. |
| FORM_AGREEMENT_ID | Отдельное штатное соглашение Bitrix для форм. |
Генератор политики
PolicyGenerator использует оператора, реквизиты, контакт, дату вступления в силу, цели, фактические категории и активные сервисы. В текст включаются таблицы категорий/сервисов, управление выбором, срок хранения, режим IP и описание защищённого журнала.
Генератор создаёт технический шаблон. Он не является юридическим заключением и не подтверждает соответствие конкретного сайта ФЗ-152, GDPR или иным требованиям без проверки фактических процессов и документов.
13. Согласия для форм, региональные режимы, URL-правила и локализация
Согласия для форм
При FORM_CONSENT_ENABLED=Y клиентский код ищет формы по FORM_SELECTORS (по умолчанию form), исключает FORM_EXCLUDE_SELECTORS (#bx-panel form,.b24-form form), добавляет checkbox перед submit или в конец формы и может запрещать submit до отметки.
При успешной отправке согласия в журнал передаются CSS selector формы, action, form ID и список имён полей. Значения самих полей модуль не отправляет в payload журнала форм.
Региональные режимы
RegionResolver читает Cloudflare/GeoIP-подобные заголовки или пользовательский event bussol.policy2:OnResolveCountry. EU/EEA определяется по настраиваемому списку ISO-кодов; дополнительные правила задаются JSON, а REGION_BEHAVIOR_JSON определяет mode и preselected категории для региона.
URL-правила
URL_INCLUDE/URL_EXCLUDE управляют показом виджета. BLOCK_URL_INCLUDE/BLOCK_URL_EXCLUDE отдельно управляют серверной блокировкой ресурсов. Поддерживаются маски * и ?. Исключения проверяются раньше включений.
Локализация
Публичный UI поддерживает ru/en. В auto-режиме используется LANGUAGE_ID; неизвестный язык откатывается к ru. LOCALE_TRANSLATIONS_JSON позволяет переопределять отдельные строки без правки consent.js.
14. Accessibility, Shadow DOM, Композит, Сайты24 и шаблоны
Accessibility
- role="dialog", aria-modal, aria-labelledby и aria-label на интерактивных элементах.
- Focus trap внутри модального Consent Center и возврат фокуса после закрытия.
- Управление Escape, видимый :focus-visible, role=alert для ошибки обязательного согласия формы.
- prefers-reduced-motion отключает анимации/переходы.
Shadow DOM
Корневой контейнер #bussol-policy2-root создаёт open ShadowRoot и собственные стили. Это минимизирует влияние Bootstrap, глобальных селекторов готового решения и пользовательских CSS.
Композит
Для композитных страниц в статическом HTML остаются нейтральный bootstrap/loader и уже заблокированная сервером разметка сторонних ресурсов. Актуальные настройки consent загружаются отдельным no-store запросом. После сохранения настроек модуль очищает Static HTML Cache.
Практически проверенные решения
| Решение | Результат теста |
|---|---|
| Аспро | Стабильная работа BUSSOL Consent Manager при включённом Композите. |
| INTEC | Стабильная работа при включённом Композите. |
| Сотбит Розница | Стабильная работа при включённом Композите. |
Модуль не привязан к структуре перечисленных шаблонов. Тесты подтверждают совместимость с ними, но неизвестный кастомный код, CSP, HTML-минимизаторы и нестандартные прокси всегда следует проверять на staging.
15. Developer API и события
JavaScript API
BussolPolicy2.on('change', handler);
BussolPolicy2.open();
BussolPolicy2.acceptAll();
BussolPolicy2.rejectAll();
BussolPolicy2.withdraw();
BussolPolicy2.getConsent();
BussolPolicy2.hasConsent('analytics');
BussolPolicy2.setCookie('name', 'value', { category: 'functional' });
BussolPolicy2.deleteCookie('name');
BussolPolicy2.registerScript({ category: 'analytics', src: 'https://example/script.js' });
BussolPolicy2.registerResource({ type: 'iframe', category: 'marketing', url: 'https://example/embed' });
BussolPolicy2.getConfig();
BussolPolicy2.getRegion();
BussolPolicy2.getCategories();
BussolPolicy2.getServices();
BussolPolicy2.purgeCookies();События
Внутренние listener-события дублируются как DOM CustomEvent bussol.policy2:<event> и, если доступен BX.Event.EventEmitter, как Bussol.Policy2:<event>. Основные: ready, open, change, withdraw, resourceBlocked, cookieBlocked, cookieDeleted, consentModeUpdated, formConsent.
PHP API
\Bussol\Policy2\Api::getCurrentConsent();
\Bussol\Policy2\Api::hasConsent('analytics');
\Bussol\Policy2\Api::getCategories();
\Bussol\Policy2\Api::getServices();
\Bussol\Policy2\Api::getRegion();
\Bussol\Policy2\Api::getPolicyRevision();
\Bussol\Policy2\Api::shouldShowOnUrl('/catalog/item/');Расширение геолокации
// Подпишитесь на событие модуля bussol.policy2:OnResolveCountry
// и верните в параметрах результата: ['country' => 'DE']Метод Api::registerServiceMatcher() в текущей сборке оставлен как декларативная точка расширения с комментарием, но сам вызов ничего не регистрирует. Для рабочих интеграций используйте ServiceManager/настройки профиля или собственную подписку/обвязку.
16. Хранилище, endpoints и безопасность
Таблицы
| Таблица | Назначение |
|---|---|
| b_bussol_policy2_consent | Consent/form log и HMAC chain. |
| b_bussol_policy2_revision | Редакции политики и конфигурационные snapshots. |
| b_bussol_policy2_scan | Результаты запусков Scanner. |
Публичные endpoints
| Endpoint | Метод / защита | Назначение |
|---|---|---|
| /bitrix/tools/bussol.policy2/config.php | GET, no-store, проверка SITE_ID | Публичная конфигурация виджета. |
| /bitrix/tools/bussol.policy2/consent.php | POST JSON, Bitrix Signer token | Сохранение cookie-consent и журнала. |
| /bitrix/tools/bussol.policy2/form.php | POST JSON, Bitrix Signer token | Журналирование согласия формы. |
| /bitrix/tools/bussol.policy2/diagnostics.php | GET, только авторизованный администратор + DIAGNOSTICS_ENABLED | Публичный debug payload для диагностической панели. |
Token подписывает строку siteId|POLICY_VERSION с использованием Bitrix Signer и COOKIE_NAME в качестве salt. При смене POLICY_VERSION старый token считается stale.
HTML политики перед вставкой в Consent Center проходит клиентскую санитаризацию: удаляются script/iframe/object/embed/form/input/button, обработчики on* и опасные javascript:/data:text/html атрибуты.
Если проект использует строгую Content-Security-Policy, nonce/hash требования или внешнюю WAF-обвязку, разрешите собственные ресурсы /bitrix/js/bussol.policy2 и /bitrix/tools/bussol.policy2 либо адаптируйте политику CSP под архитектуру проекта.
17. Диагностика и типовые проблемы
| Симптом | Что проверить |
|---|---|
| Виджет не появился | ENABLED/AUTO_INJECT, URL_INCLUDE/EXCLUDE, наличие </html>, отсутствие административного пути /bitrix/ или /local/, композитный кэш. |
| Диагностика: JS не загружен | Файл /bitrix/js/bussol.policy2/consent.js, права, веб-сервер, CDN/WAF, CSP. |
| Config endpoint не отвечает | /bitrix/tools/bussol.policy2/config.php, SITE_ID, загрузку модуля main/bussol.policy2, кеширование прокси. |
| Сервис выполняется до согласия | Проверьте профиль сервиса, домен/сигнатуру, тип ресурса, альтернативную вставку кода и data-bussol-skip. |
| Cookie не удаляется | Cookie может быть HttpOnly, иметь недоступный domain/path или устанавливаться сервером; browser JS не способен удалить любой cookie. |
| Форма перестала отправляться | FORM_SELECTORS/EXCLUDE, обязательность, AJAX-перерисовку формы, custom submit listeners. |
| Нарушение HMAC-цепочки | Ручные изменения строк БД, перенос части таблицы, изменение секретного LOG_HMAC_SECRET или некорректная внешняя очистка. |
| Сканер не видит сервис | Сервис создаётся только после JS execution, использует собственный proxy-domain или сигнатуры отсутствуют в профиле. |
| Живая проверка недоступна | Выбранный SITE_ID настроен на другой SERVER_NAME — откройте админку на соответствующем домене или проверьте вручную. |
Расширенная публичная диагностика
Если DIAGNOSTICS_ENABLED=Y, администратор может открыть публичную страницу с GET-параметром, имя которого задаёт ADMIN_DEBUG_QUERY (по умолчанию bussol_policy2_debug), и значением Y. Модуль покажет debug-панель только авторизованному администратору.
В lib/helper/menu.php title административного пункта содержит строку «BUSSOL Consent Manager 3.0». Это косметическое несоответствие версии 2.1.0 и не меняет MODULE_VERSION; рекомендуется исправить в следующем пакете.
18. Чек-лист приёмки и эксплуатационные ограничения
Чек-лист перед production
- Создана резервная копия; обновление 2.0.0 → 2.1.0 проверено на staging.
- Для каждого SITE_ID проверены ENABLED, AUTO_INJECT, тексты, срок согласия и POLICY_VERSION.
- Категории отражают фактическую модель сайта; necessary содержит только действительно обязательные функции.
- Scanner пройден по ключевым разделам; все найденные сервисы назначены правильным категориям.
- Реальные Метрика/GA/GTM/VK/видео/карты проверены до и после согласия в Network/Application DevTools.
- Отказ и withdraw удаляют доступные cookie запрещённых категорий и прекращают дальнейшую загрузку сервисов.
- Consent Mode v2 проверен через dataLayer/gtag и GTM Preview, если Google-экосистема используется.
- Журнал фиксирует accept/reject/custom/withdraw; HMAC verify возвращает valid.
- Policy snapshot/hash меняется после редактирования политики/категорий/сервисов.
- Формы проверены в обычной и AJAX-версии; исключения для системных форм настроены.
- Многосайтовость, RU/EN, регионы и URL-правила проверены на нужных доменах.
- Композит включён и повторно проверен после очистки Static HTML Cache.
- Диагностика показывает: автоподключение активно, виджет обнаружен, JS загружен, конфигурация получена.
Эксплуатационные ограничения
- Нельзя гарантировать удаление HttpOnly или недоступных по domain/path cookie средствами браузерного JavaScript.
- Regex/сигнатурная блокировка требует актуальных профилей сервисов; новые домены и нестандартные интеграции нужно добавлять вручную.
- Сканер анализирует загруженный HTML, но не является полноценным headless-browser crawler и не выполняет все пользовательские сценарии JavaScript.
- Генератор политики — технический шаблон, а не юридическая экспертиза.
- Неизвестный кастомный код, WAF, CDN, CSP, модификаторы HTML и нестандартные композитные механизмы требуют отдельного теста на staging.
Считайте внедрение принятым после сквозного сценария: первый визит без consent → проверка отсутствия запрещённых сервисов → accept/custom/reject → повторный визит → изменение выбора → withdraw → проверка журнала, политики, форм и диагностики.