С 1 июля 2017 года существенно ужесточена административная ответственность за нарушения при взаимодействии с персональными данными физических лиц.
Если вы владелец сайта, то вы вероятно уже знакомы с нашими
Мы надеемся, что вы уже ознакомлены с законом и ищете техническую информацию.
Данная статья расскажет, что для разработчика решений и компонентов в продукте есть инструменты для помощи в соответствии закону.
Каждая форма, которая собирает, к примеру, имя, фамилию, email или телефон, должна запрашивать согласие пользователя на обработку персональных данных.
Мы в обновлении главного модуля 17.0.9 выпустили набор инструментов, который поможет вам соответствовать закону ФЗ-152 о персональных данных.
Начну с того, что в административном разделе в меню появился новый пункт:
Настройки -> Настройки продукта -> Соглашения
В нем вы можете создать новое соглашение для запроса согласия на обработку персональных данных, используя стандартный текст, который мы также включили в обновление.
Мы рассмотрим как включить поддержку соглашений в ваших компонентах на примере компонента подписки на рассылку sender.subscribe.
1. Выбор.
Сделаем в параметрах компонента выбор соглашения для вывода.
Для этого в файле параметров вашего компонента .parameters.php достаточно объявить параметр "USER_CONSENT" => array() и появится раздел с параметрами настройки:
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arComponentParameters = array( "GROUPS" => array( ), "PARAMETERS" => array( "AJAX_MODE" => array(), "USER_CONSENT" => array(), ) ); |
Теперь в настройках компонента появились вот такие настройки:
2. Вывод в форме.
Для вывода нужно использовать компонент main.userconsent.request.
Он выводит чекбокс с подписью, по нажатию на которую выводится окно с текстом соглашения.
Окно с текстом адаптивное и уже сделано и под мобильные устройства.
Также, компонент умеет сохранять полученное согласие.
Само согласие будет в списке, показываемым в по клику в пункте "Полученные согласия" в контекстом меню соглашения на списке.
Компонент main.userconsent.request нужно подключить в шаблоне вашего компонента перед кнопкой отправки формы.
Есть два вида форм:
- один стандартная get/post отправка формы с событием submit;
- отправка через ajax и иные механизмы, реализованные в js, то есть без события submit у формы.
Для них нужно по разному использовать компонент.
1) Простая форма с событием submit.
Подключаем компонент main.userconsent.request перед кнопкой отправки формы
<fo rm method="POST"> <input name="EMAIL" placeholder="Email"> <input name="PHONE" placeholder="Телефон"> <input name="NAME" placeholder="Имя"> <br> <?if ($arParams['USER_CONSENT'] == 'Y'):?> <?$APPLICATION->IncludeComponent( "bitrix:main.userconsent.request", "", array( "ID" => $arParams["USER_CONSENT_ID"], "IS_CHECKED" => $arParams["USER_CONSENT_IS_CHECKED"], "AUTO_SAVE" => "Y", "IS_LOADED" => $arParams["USER_CONSENT_IS_LOADED"], "REPLACE" => array( 'button_caption' => 'Подписаться!', 'fields' => array('Email', 'Телефон', 'Имя') ), ) );?> <?endif;?> <input type="submit" name="subscribe" value="Подписаться!"> </form> |
Указанные в примере параметры $arParams появятся в шаблоне вашего компонента при наличии
в .parameters.php блока "USER_CONSENT" => array()
В параметре REPLACE передается
- button_caption, название кнопки отправки формы;
- fields, массив названий полей, которые попадут в текст соглашения.
2) Форма без события submit(ajax и пр).
В компонент нужно передать в параметре SUBMIT_EVENT_NAME название события, при котором появится окно запроса согласия.
Далее, нужно добавить обработчик события принятия соглашения.
Если обработчик поймает событие - значит, согласие получено и можно отправлять форму/данные или выполнять какое-то действие.
<div id="my_container"> <input type="text" placeholder="Электронный адрес" name="EMAIL"> <input type="submit" id="fire_event" value="Отправить"> <br> <?if ($arParams['USER_CONSENT'] == 'Y'):?> <?$APPLICATION->IncludeComponent( "bitrix:main.userconsent.request", "", array( 'ID' => $arParams["USER_CONSENT_ID"], "IS_CHECKED" => $arParams["USER_CONSENT_IS_CHECKED"], "IS_LOADED" => "Y", "AUTO_SAVE" => "N", 'SUBMIT_EVENT_NAME' => 'my-event-name', 'REPLACE' => array( 'button_caption' => 'Отправить', 'fields' => array('Электронный адрес') ), ) );?> <?endif;?> </div> <sc ript type="text/javascript"> BX.ready(function () { var submitBtn = BX('fire_event'); BX.bind(submitBtn, 'click', function(){ BX.onCustomEvent('my-event-name', []); }); if (!BX.UserConsent) { return; } var control = BX.UserConsent.load(BX('my_container')); if (!control) { return; } BX.addCustomEvent( control, BX.UserConsent.events.save, function (data) { console.log('js event:', 'save', data); // успешно! // отправляем ajax // или другие действия } ); }); </sc ript> |
3. Сохранение согласия.
В параметрах компонента есть параметр AUTO_SAVE.
Если его значение равно Y, то согласие автоматически сохраняется компонентом.
Если вам нужно сохранить согласие самим, то передайте значение N.
А для ручного добавления согласия вызовите следующий код:
\Bitrix\Main\UserConsent\Consent::addByContext( $arParams["USER_CONSENT_ID"] ); |
Теперь у вас есть инструмент, с помощью которого вы можете быстро привести свои компоненты в соответствие закону, а также помочь соответствовать вашим клиентам.
Есть еще то, что не описал:
- добавление своего источника данных;
- при просмотре согласий вывод связи со своей сущностью;
- кейс использования в виде ссылок;
- дополнительные компоненты выбора и просмотра.
Если вам эта тема интересна - пишите в комментариях, добавим в статью доп информацию.
.
А как активировать его в компоненте регистрации bitrix:main.register ? Там визуальный редактор просто недоступен, т.к. пользователь админ залоген и форма регистрации не отображается.
Предыстория:
На сайте самого Роскомнадзора есть форма обращений граждан, которая собирает ПД и при этом в ней нет никаких галочек "Согласен". По этому поводу и было составлено обращение по средством той самой формы.
В приложении ответ Роскомнадзора по Астраханской области. Из него следует, что никаких дополнительных согласий на обработку ПД с пользователя требовать не надо, а все что нужно сделать - это разместить документ "Политика обработки персональных данных", причем не обязательно на самом видном месте.
Т.е. вся эта шумиха вокруг галочек - зря, раз сам Роскомнадзор трактует закон вот так:
Статья 9. Согласие субъекта персональных данных на обработку его персональных данных
1. Субъект персональных данных принимает решение о предоставлении его персональных данных и дает согласие на их обработку свободно, своей волей и в своем интересе. Согласие на обработку персональных данных должно быть конкретным, информированным и сознательным. Согласие на обработку персональных данных может быть дано субъектом персональных данных или его представителем в любой позволяющей подтвердить факт его получения форме, если иное не установлено федеральным законом.
....
4. В случаях, предусмотренных федеральным законом, обработка персональных данных осуществляется только с согласия в письменной форме субъекта персональных данных. Равнозначным содержащему собственноручную подпись субъекта персональных данных согласию в письменной форме на бумажном носителе признается согласие в форме электронного документа, подписанного в соответствии с федеральным законом электронной подписью.
Критерии конкретности и информированности согласия мне не известны, я не юрист. По бытовой логике Роскомнадзора можно считать, что пользователь отправляющий свои данные на их сайт согласен, что они будут как-то обрабатываться, храниться, передаваться третьим лицам.
Но сами по себе поля не говорят о том, как именно Роскомнадзор будет их обрабатывать, и то, что где-то на сайте хранится некий документ, с моей точки зрения совершенно неконкретно и неинформировано. Т.е. при отправлении ваших данных в форме роскомнадзора вы не были "конкретно информированы" о том, на что конкретно даёте своё согласие. Т.ч. Роскомнадзор с моей непрофессиональной точки зрения нарушает 152-ФЗ. Но это моя личная точка зрения основанная на повседневной логике и бытовой интерпретации терминов закона. Какая должна быть интерпретация этих терминов по закону мне неизвестно
Решение уже в Маркетплейс
В тех случаях, когда включено ограничение доступа к контенту?
там есть стартовый шаблон на базе которого можно реализовать форму просто добавив полей
либо поменять шаблон под свои нужды
Передаю вроде все параметры, а поле пустое...Вроде по аналогии как и с заказом + посмотрел в код шаблона, вроде всё так же и ORIGIN_ID и ORIGINATOR_ID:
Но в результатах соглашения не выводится источник (даже текстом).
Это ещё не реализовано и я забегаю вперед, или что-то не так?)
1. в init.php регистрируем обработчик для вывода источника данных в админке
2. Если нужна своя форма с текстом согласия
А как сделать так, чтобы эта форма согласия работала при регистрации пользователя на сайте?
Да еще, чтобы и при авторизации с помощью соцсетей.
Ну, чтобы всё "из коробки" было, без костылей разных.
Или в этом нет никакой необходимости?
Обновился до последней версии. В штатных компонентах вроде работают согласия. Но, если пользователь не авторизован, то при заполнении формы обратной связи, сохраняется не заполненное согласие (последняя строка на скриншоте):
Так же не работает механизм: \Bitrix\Main\UserConsent\Consent::addByContext( $arParams["USER_CONSENT_ID"]
);
Я проверил, что $arParams["USER_CONSENT_ID"] установлен и имеет необходимое значение. Чтобы \Bitrix\Main\UserConsent\Consent::addByContext работал может его где-то в специфическом месте надо вызывать?
можно просто сделать sql запрос например
На формах его разместили, но нет ссылки на сам текст соглашения, как его может увидеть пользователь?
2. Нужно ли размещать это же механизм на форме восстановления пароля, где запрашивается только почта клиента?
проверил - форма отправляется успешно даже если не был помечен чекбокс согласия.
и когда уже будет добавлено во все стандартные компоненты форм?
1) Адрес страницы по умолчанию добавляется без http(s): $parameters['URL'] = $request->getHttpHost() . $request->getRequestUri();
2) В списке нет столбца № Соглашения (AGREEMENT_ID)
3) Пользователя внешне не узнать без указания [ID], под одним именем может быть разные ID пользователя
4) ORIGIN_ID и ORIGINATOR_ID в базу пишутся одновременно, но в списке не выводятся и ограничение 30 символов, надо больше
5) Сортировки по столбцам нет
6) Фильтрация не по всем полям
7) Многосайтовость не учли, придется захламлять ORIGIN_ID и ORIGINATOR_ID
Чтобы можно было по модулю и сайту отфильтровать список и узнать под каким номером формы соглашались, потому что на одной странице может быть 10-к форм!
Например: formId = ORIGIN_ID, moduleId = ORIGINATOR_ID, siteId = ???
$('.bx_subscribe_checkbox_container').on('click','a',function(e){
e.preventDefault();
});
код компонента пользовательского согласия - ужасен и переусложнен - а там всегото чекбокс и попап.
ощущение что скопировали код js оформления заказа и сделали на основе него данный компонент.
когда исправите?
А INPUT_LABEL зашито в модуле, не разбирался как глубоко, но проще свою фразу в свой шаблон запилить..(
$MESS["/bitrix/modules/имя_шаблона_сайта/lang/ru/lib/userconsent/intl.php"]["MAIN_USER_CONSENT_INTL_LABEL"] = "Тут_свой_текст";
Понять не могу, почему нельзя было сделать возможность html код выводить в соглашении. В общем, как обычно через одно место всё.
Может кто то мне сделать под заказ необходимые галочки?
Skype:
BX.UserConsent.loadFromForms();
от слова вообще!
Помогите разобраться с REPLACE, пожалуйста.
В текст собственного соглашения вставила плейсхолдеры типа %vacancyName%, %companyName% и тд
При вызове компонента bitrix:main.userconsent.request в параметр REPLACE передаю массив с именами
...
REPLACE => [
'vacancyName' => $vacancyName,
'companyName' => $companyName],
...
Ожидалось, компонент заменит шаблоны на заданные даннные, но нет. Этого не происходит, выводится текст в том виде, как он сохранен в бд.
Что я не так делаю?
там по коду используется $agreement->getText(), который в свою очередь использует Text::replace($text, $replaceData, true); который по идее заменяет все что вы ему подсунете...
но может я не так понимаю принцип работы?
совсем не хочется писать свой компонент ради этого. ведь должно же работать.
Помогите, если кто-то сталкивался с этим.
заранее благодарю!
стандартными методами в компоненте replace делается только для Cтандартного типа согласий(TYPE=S).
Вообще это странно, казалось бы, наоборот Custom на то и нужен, чтоб делать с ним все, что нужно.
но у разработчиков на этот счет свои мысли. Было бы инетресно узнать...
Обмануть, поменяв в бд тип соглашения на S тоже не получится, потому что сам текст тогда достается тоже откудато из **** (не стала уже копать откуда, потому что для моей задачи оно того не стоит).
Если кто-то ищет решение аналогичной проблемы, то я решила так:
1) скопировала шаблон
2) перед строкой
$config = \Bitrix\Main\Web\Json::encode($arResult['CONFIG']);
добавила
$arResult['CONFIG']['text'] = Bitrix\Main\UserConsent\Text::replace($arResult['CONFIG']['text'],$arResult['CONFIG']['replace'],true);
Всё. готово.
PS - метод Bitrix\Main\UserConsent\Text::replace приводит строки к нижнему регистру. Поэтому в тексте соглашения плейсхолдеры должны быть тоже в нижнем регистре.
вот такие : %placeholderinlowercase%
всем спасибо.