Перейти к содержимому

Согласие на обработку данных - соглашение, компонент, запись факта

Прикладываем согласие на обработку данных к своей форме: текст соглашения, флажок с модальным окном, запись факта согласия и собственный источник.

Механика

Соглашение и согласие - это две разные вещи, и путать их дорого. Соглашение с текстом заводится в административной части один раз, а согласие - это записанный факт, что конкретный посетитель с этим текстом согласился.

Штатные формы платформы умеют выводить согласие своими настройками. В своей форме его подключают руками: параметром компонента и отдельным компонентом запроса согласия.

Объявленный параметр добавляет отдельную секцию в настройки компонента. После объявления параметра редактор компонента сам показывает выбор соглашения, а в шаблон приходят идентификатор и признаки состояния.

Компонент запроса рисует флажок и модальное окно с полным текстом этого соглашения. Один вызов компонента обслуживает одно соглашение, и для двух соглашений его подключают дважды.

Режим автоматического сохранения решает, кто именно записывает в базу полученный факт согласия. При включённом режиме компонент делает это сам, при выключенном - запись остаётся на прикладном коде.

Форма без обычной отправки страницы работает через события на стороне самого браузера. Компонент ждёт названное событие, после подтверждения генерирует своё событие сохранения, и по нему отправляют данные.

Факт согласия записывается отдельным вызовом с идентификатором соглашения. Минимальный вариант принимает только его, полный - ещё и источник, идентификатор сущности и выбранные пункты.

Нестандартный источник объявляют обработчиком события. Источник описывается кодом, именем и двумя функциями: одна отдаёт название и адрес, вторая - текст пункта по его значению.

Записи о полученных согласиях удалять нельзя. Это требование закона, и система такой возможности не даёт: смотреть их можно в разделе полученных согласий.

Соглашение живёт в настройках продукта сайта и имеет собственный числовой номер. На этот номер ссылаются все формы сайта, поэтому правка текста в одном месте меняет его сразу везде, где соглашение подключено.

Проверять результат стоит не по внешнему виду формы, а по списку полученных согласий. Форма с флажком выглядит одинаково и при работающей записи, и при забытом вызове сохранения, а список показывает реальное положение дел.

Шаги

  1. Завести соглашение с готовым текстом в настройках продукта и запомнить его номер.
  2. Объявить параметр согласия в файле описания параметров своего компонента.
  3. Подключить компонент запроса согласия в шаблоне формы перед кнопкой.
  4. Выбрать режим сохранения: автоматический или запись из своего кода.
  5. Для формы без перезагрузки страницы подписаться на событие подтверждения согласия в браузере.
  6. Проверить, что факт согласия появился в списке полученных согласий.

Код

Объявляем параметр в описании компонента:

// .parameters.php своего компонента
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) { die(); }
$arComponentParameters = [
'GROUPS' => [],
'PARAMETERS' => [
'AJAX_MODE' => [],
'USER_CONSENT' => [], // секция выбора соглашения в настройках
// остальные параметры компонента объявляют здесь же, рядом
],
];

После объявления в шаблон приходят четыре значения: сам признак включения, идентификатор соглашения и два признака состояния флажка. Придумывать свои параметры под эти значения не нужно вовсе.

Подключаем запрос согласия в форме:

<form method="POST">
<input name="EMAIL" placeholder="Email">
<?php if ($arParams['USER_CONSENT'] === 'Y'): ?>
<?php $APPLICATION->IncludeComponent('bitrix:main.userconsent.request', '', [
'ID' => $arParams['USER_CONSENT_ID'],
'IS_CHECKED' => $arParams['USER_CONSENT_IS_CHECKED'],
'IS_LOADED' => $arParams['USER_CONSENT_IS_LOADED'],
'AUTO_SAVE' => 'Y', // факт согласия запишет сам компонент
'REPLACE' => ['button_caption' => 'Отправить', 'fields' => ['Email']],
]); ?>
<?php endif; ?>
<input type="submit" value="Отправить">
</form>

Подстановки в тексте соглашения берутся из настроек компонента: название кнопки и перечень полей формы. Так один текст соглашения обслуживает совершенно разные формы без правки самого текста.

Работаем с формой без перезагрузки:

BX.ready(() => {
BX.bind(BX('send'), 'click', () => BX.onCustomEvent('my-form-submit'));
const control = BX.UserConsent.load(BX('my_form'));
if (!control) { return; }
BX.addCustomEvent(control, BX.UserConsent.events.save, () => {
BX.ajax.runAction('local:feedback.feedback.save', { data: getFormData() });
});
});

Отправку данных вешают на событие сохранения согласия, а не на клик по кнопке. Иначе форма уедет на сервер раньше, чем посетитель успеет увидеть текст соглашения.

Записываем факт согласия сами:

use Bitrix\Main\UserConsent\Consent;
Consent::addByContext($arParams['USER_CONSENT_ID']); // минимальный вызов
// вызывают после успешной проверки формы, а не до неё
// при выключенном автосохранении без этой строки факт согласия не запишется

Минимального вызова достаточно, когда источник и сущность не важны. Забытая строка при выключенном автосохранении даёт форму, которая согласие показывает, а факт его получения нигде не сохраняет.

Сохраняем согласие с источником и пунктами:

Consent::addByContext(
$agreementId, // номер соглашения
'my/activity', // код своего источника
$formId, // идентификатор сущности: форма, виджет
['ITEMS' => [['VALUE' => 'cookie'], ['VALUE' => 'analytics']]]
);

Полный вызов записывает не только факт, но и обстоятельства: откуда пришло согласие и на какие пункты. Для разбора спорной ситуации через год это важнее, чем сама отметка о согласии.

Объявляем свой источник согласия:

// обработчик события OnUserConsentProviderList
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [[
'CODE' => 'my/activity', // этот код передают в запись
'NAME' => 'Форма подписки на витрине',
'DATA' => static fn ($id = null) => ['NAME' => 'Витрина', 'URL' => '/'],
'ITEMS' => static fn ($value = null) => ['cookie' => 'Cookie'][$value] ?? '',
]], 'my.module');

Свой источник нужен там, где согласие собирает не штатная форма: виджет, встраиваемая форма, отдельное приложение. Без такого объявления запись согласия не найдёт свой источник и просто не сохранится.

Ограничения

Уже полученное согласие нельзя удалить задним числом вообще никаким способом. Система не даёт такой возможности намеренно, и это стоит учитывать при опытах на боевом сайте.

Один вызов компонента запроса обслуживает ровно одно соглашение. Два разных согласия в одной форме означают два вызова компонента с разными идентификаторами.

Полученное согласие не отменяет остальной работы с персональными данными. Оно фиксирует факт, а хранение, передача и удаление данных остаются задачей проекта.

Текст самого соглашения - это зона ответственности юриста компании, а не разработчика. Разработчик отвечает за другое: чтобы факт согласия был записан и его можно было показать при проверке вместе с датой и источником.

Типичные проблемы

Флажок согласия в форме есть, а записей о согласиях нет.

Автоматическое сохранение выключено, а вызов записи согласия из своего кода не сделан. Компонент в этом режиме только показывает текст соглашения и принимает подтверждение посетителя.

В настройках компонента нет секции согласия.

Параметр согласия не объявлен в файле описания параметров компонента. Редактор компонента показывает эту секцию настроек только после объявления нужного параметра.

Форма отправляется раньше подтверждения.

Отправка данных повешена на клик по кнопке, а не на событие сохранения согласия. В форме без перезагрузки порядок задаёт именно это событие.

Запись согласия не сохраняется со своим источником.

Источник не объявлен обработчиком события или его код не совпадает с переданным. Система при записи проверяет, разрешён ли переданный источник для конкретного соглашения.

Два соглашения в форме показывают один текст.

Компонент запроса подключён один раз сразу на две совершенно разные записи соглашений. Каждое соглашение требует своего вызова компонента.

Частые вопросы

Где смотреть полученные согласия?

В настройках продукта есть раздел соглашений и список полученных согласий. Там видно, кто, когда и на какой текст согласился.

Нужно ли согласие на форме обратной связи?

Если форма собирает персональные данные или ставит cookie - да. Штатные формы платформы умеют выводить согласие настройкой, своим формам его добавляют руками.

Можно ли поставить флажок отмеченным заранее?

Технически признак начального состояния есть, но заранее отмеченный флажок обесценивает само согласие. Подтверждение должно быть действием посетителя.

Что делать при смене текста соглашения?

Заводить новую версию соглашения и собирать согласия на неё. Старые записи остаются как есть: они относятся к прежнему тексту.

Как согласие связано с формой?

Через источник и идентификатор сущности в записи. Без них запись хранит только факт, и понять, откуда пришло согласие, будет невозможно.

Смежное

Первоисточник