Files
help365/business_solutions/saml-with-keycloak.html
2025-05-26 16:15:30 +04:00

272 lines
36 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<title>Настройка SAML-интеграции с Keycloak</title>
<meta name="generator" content="Help+Manual" />
<meta name="keywords" content="" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="SAMLинтеграция позволяет использовать Keycloak для аутентификации и автоматического создания внутренних и&nbsp;внешних пользователей в&nbsp;ELMA365.&nbsp;" />
<meta name="picture" content="" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Cправка по Low-code платформе ELMA365" />
<meta property="og:url" content="https://elma365.com/ru/help" />
<meta property="og:image" content="" />
<meta property="og:site_name" content="ELMA365" />
<link rel="icon" href="favicon.png" type="image/png" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="./jquery-ui.min.css" />
<link rel="stylesheet" href="default.css" />
<link rel="stylesheet" href="./search-yandex.css" />
<link rel="stylesheet" href="./article.css" />
<link rel="stylesheet" href="./glossary.css" />
<link rel="stylesheet" href="./theme.css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="helpman_settings.js"></script>
<script type="text/javascript" src="helpman_topicinit.js"></script>
<script type="text/javascript" src="highlight.js"></script>
<script type="text/javascript">
$(document).ready(function(){highlight();});
</script>
</head>
<body>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-M6ETBEC1R9"></script><script>window.dataLayer=window.dataLayer || []; function gtag(){dataLayer.push(arguments);}gtag('js', new Date()); gtag('config', 'G-M6ETBEC1R9');</script>
<script>!function(e,t,c,n,r,a,m){e.ym=e.ym||function(){(e.ym.a=e.ym.a||[]).push(arguments)},e.ym.l=1*new Date;for(var s=0;s<document.scripts.length;s++)if(document.scripts[s].src===n)return;a=t.createElement(c),m=t.getElementsByTagName(c)[0],a.async=1,a.src=n,m.parentNode.insertBefore(a,m)}(window,document,"script","https://mc.yandex.ru/metrika/tag.js"),ym(83179930,"init",{clickmap:!0,trackLinks:!0,accurateTrackBounce:!0,webvisor:!0})</script><noscript><div><img alt=""src=https://mc.yandex.ru/watch/83179930 style=position:absolute;left:-9999px></div></noscript>
<header class="header elma-365">
<div class="container">
<a class="header__logo" href="https://elma365.com/ru/help">
<img src="./logo.svg" alt="header logo">
</a>
<!-- <div class="hero__search-form" id="search-panel">
<form class="search-form" onsubmit="ym(83179930,'reachGoal','poisk')">
<label class="search-form__label">
<span id="reset-search" class="search__icon"></span>
<input class="search-form__input" type="text">
</label>
<input class="search-form__submit" type="submit" value="Submit">
</form>
</div> -->
<div class="hero__search-form" id="search-panel"> <form class="search-form"> <label class="search-form__label"> <span id="reset-search" class="search__icon"></span> <input class="search-form__input" type="text"> </label> <input class="search-form__submit" type="submit" value="Submit"> </form> </div>
<div class="hero__search">
<a href="#" id="search-icon" class="hero__search-icon">
<img src="search-icon-white.svg" alt="search string">
</a>
<a href="#" id="side-menu-icon" class="hero__side-icon">
<img src="side_menu.svg" alt="side menu">
</a>
</div>
<div class="header__navi">
<ul class="header__list"><li><span class="solution-select"><span class="solution-select__selected"></span><svg width="7" height="4" viewBox="0 0 7 4" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L3.5 3.5L6 1" stroke="white" stroke-linecap="round" stroke-linejoin="round"/></svg><ul class="solution-select__list"><li><a class="project-link" href="https://elma365.com/ru/help/platform/get-trial.html">Платформа</a></li><li><a class="project-link" href="https://elma365.com/ru/help/ecm/ecm-functions.html">ECM</a></li><li><a class="project-link" href="https://elma365.com/ru/help/crm/crm_overview.html">CRM</a></li><li><a class="project-link" href="https://elma365.com/ru/help/service/service-functions.html">Service</a></li><li><a class="project-link" href="https://elma365.com/ru/help/projects/projects-functions.html">Проекты</a></li><li><a class="project-link" href="https://elma365.com/ru/help/business_solutions/-elma365-store.html">Бизнес-решения</a></li></ul></span></li><li><a href="https://api.elma365.com/ru/"target="_blank">API</a></li><li><a href="https://tssdk.elma365.com/"target="_blank">SDK</a></li><li><a href="https://community.elma365.com/" target="_blank">Community</a></li><li><a href="https://elma-academy.com/ru/" target="_blank">Академия</a></li><li><a href="https://elma365.com/ru/" target="_blank">Сайт ELMA365</a></li></ul>
</div>
</div>
</header>
<main class="main container">
<aside class="sidebar" id="sidebar">
<div class="sidebar__header">
<a class="header__logo" href="https://elma365.com/ru/help">
<img src="./logo-light.svg">
</a>
<span class="sidebar__close elma-365-close" id="close"></span>
</div>
<div class="sidebar__wrapper" id="side-menu">
</div>
</aside>
<article class="article" id="article">
<div class="article-inner">
<div class="content">
<header class="article__header">
<div class="article__bread" style="display:flex; gap:10px;">
<span id="subcategory" class="search-res__item-category search-res__item-category_subcategory subcategory article__badge"></span>
<div class="topic__breadcrumbs">
<p>Интеграция с SAML / Настройка SAML-интеграции с Keycloak</p>
</div>
</div>
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">Настройка SAML-интеграции с Keycloak</span></h1>
</div>
</header>
<section class="article__content">
<div class="scroll-top-inner">
<a href="#h1-article" class="scroll-top"></a>
</div>
<!-- Placeholder for topic body. -->
<p class="p_Normal">SAMLинтеграция позволяет использовать Keycloak для аутентификации и автоматического создания внутренних и внешних пользователей в ELMA365. </p>
<p class="p_Normal">В момент авторизации в ELMA365 будет создаваться новый внутренний пользователь, а запись о нём появится в справочнике <a href="360004833572.html" class="topiclink">Пользователи</a>. Если авторизация происходит на портале, то запись о пользователе появится в системном справочнике <a href="external-users.html" class="topiclink">Внешние пользователи</a>. </p>
<p class="p_Normal">Обратите внимание, чтобы незарегистрированный пользователь вошёл на портал через SAML, ему не нужно высылать <a href="add-external-users.html#get_link" class="topiclink">индивидуальную ссылку-приглашение</a>. Достаточно предоставить ему ссылку на страницу портала.</p>
<p class="p_Normal">Перед началом настройки интеграции выполните установку Keycloak согласно <a href="https://www.keycloak.org/guides" target="_blank" class="weblink">официальной документации</a>. </p>
<p class="p_Normal">Для корректной работы требуется шифрованное соединение с сертификатами tls на серверах Keycloak и ELMA365. </p>
<h2 class="p_Heading2"><span class="f_Heading2">Первоначальная настройка приложения SAML в Keycloak </span></h2>
<ol style="list-style-type:upper-roman">
<li value="1" class="p_Normal">Откройте настройки Keycloak по адресу http://my_domen.com:8443, где: <ul style="list-style-type:disc">
<li class="p_Normal"><span style="font-weight: bold;">my_domen.com</span> — адрес вашего сайта; </li><li class="p_Normal"><span style="font-weight: bold;">:8443</span> — стандартный порт, используемый Keycloak при шифрованном соединении. Его можно изменить при конфигурировании рабочей среды. </li></ul>
<li value="2" class="p_Normal">Перейдите в <span style="font-weight: bold;">Administration Console</span>. Для подтверждения действия введите логин и пароль от своей учётной записи. </li><li value="3" class="p_Normal">На открывшейся странице создайте новое окружение. Введите название окружения и нажмите кнопку <span style="font-weight: bold;">Create</span>. </li><li value="4" class="p_Normal">Из левого меню перейдите в раздел <span style="font-weight: bold;">Realm setting</span>. На вкладке <span style="font-weight: bold;">General</span> из поля <span style="font-weight: bold;">Endpoints</span> скопируйте ссылку на метаданные Keycloak для интеграции с SAML. </li></ol>
<h2 class="p_Heading2"><span class="f_Heading2">Настройка интеграции с SAML в ELMA365 </span></h2>
<ol style="list-style-type:upper-roman">
<li value="1" class="p_Normal">Перейдите в <span style="font-weight: bold;">Администрирование &gt; Модули &gt; SAML</span>. </li><li value="2" class="p_Normal">Поставьте флажок напротив опции <span style="font-weight: bold;">Включить модуль</span> и нажмите <span style="font-weight: bold;">Добавить элемент</span>. </li><li value="3" class="p_Normal">В открывшемся окне настроек провайдера заполните поля: </li></ol>
<p class="p_Normal" style="margin: 0 0 0 36px;"><img alt="saml" width="524" height="757" style="margin:0;width:524px;height:757px;border:none" src="saml.png"/></p>
<ul style="list-style-type:disc">
<li class="p_Normal"><span style="font-weight: bold;">Наименование</span><span style="font-weight: bold; color: #ff0000;">*</span> — название для интеграции; </li><li class="p_Normal"><span style="font-weight: bold;">URL метаданных IdP</span><span style="font-weight: bold; color: #ff0000;">*</span> — URL метаданных вашего Keycloak сервера, который был получен при первоначальной настройке приложения SAML в Keycloak на шаге 4; </li><li class="p_Normal"><span style="font-weight: bold;">Публичный ключ</span><span style="font-weight: bold; color: #ff0000;">*</span> — строковое представление вашего публичного ключа в <span style="font-weight: bold;">.pem</span> формате: &nbsp;</li></ul>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">-----BEGIN&nbsp;CERTIFICATE-----</span><br />
<span class="f_CodeExample"></span><br />
<span class="f_CodeExample">-----END&nbsp;CERTIFICATE-----</span></p>
<ul style="list-style-type:disc">
<li class="p_Normal"><span style="font-weight: bold;">Закрытый ключ</span><span style="font-weight: bold; color: #ff0000;">*</span> — строковое представление вашего закрытого ключа в <span style="font-weight: bold;">.pem</span> формате: </li></ul>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">-----BEGIN&nbsp;PRIVATE&nbsp;KEY-----</span><br />
<span class="f_CodeExample"></span><br />
<span class="f_CodeExample">-----END&nbsp;PRIVATE&nbsp;KEY-----</span></p>
<p class="p_Normal">Для генерации публичного ключа и закрытого ключа используйте следующую команду в openssl: </p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">openssl&nbsp;req&nbsp;-x509&nbsp;-newkey&nbsp;rsa:2048&nbsp;-keyout&nbsp;service.key&nbsp;-out&nbsp;service.cert&nbsp;-days&nbsp;365&nbsp;-nodes&nbsp;-subj&nbsp;&quot;/CN=mydomain.pro&quot;</span></p>
<p class="p_Normal">Где <span style="font-weight: bold;">mydomain.pro</span> — ваше доменное имя keycloak. </p>
<p class="p_Normal">Для последующей настройки интеграции вам потребуется импортировать публичный ключ в формате <span style="font-weight: bold;">PKCS12</span>. Для его экспорта используйте следующую команду: </p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">openssl&nbsp;pkcs12&nbsp;-export&nbsp;-out&nbsp;cert.p12&nbsp;-in&nbsp;service.cert&nbsp;-inkey&nbsp;service.key&nbsp;-name&nbsp;learn&nbsp;</span></p>
<ul style="list-style-type:disc">
<li class="p_Normal"><span style="font-weight: bold;">Создавать пользователей в момент авторизации</span> — установите параметр в значение <span style="font-weight: bold;">Да</span>, чтобы отсутствующие внешние или внутренние пользователи создавались автоматически при попытке авторизации пользователя в системе; </li><li class="p_Normal"><span style="font-weight: bold;">Преобразовывать существующих пользователей</span> — установите параметр в значение <span style="font-weight: bold;">Да</span>, если необходимо обновлять существующих пользователей в момент авторизации. При обновлении пользователь будет преобразован во внешнего SAMLпользователя, при этом у него пропадёт возможность авторизации прежним способом;</li><li class="p_Normal"><a id="update-user-data" class="hmanchor"></a><span style="font-family: Inter; font-weight: bold;">Обновлять данные существующих пользователей </span><span style="font-family: Inter;">— установите параметр в значение </span><span style="font-family: Inter; font-weight: bold;">Да</span><span style="font-family: Inter;">, чтобы в момент аутентификации пользователя его данные в ELMA365 обновлялись на данные, полученные в SAMLсообщении. Набор данных, которые отправляются в SAMLсообщении, определяется при </span><span style="font-family: Inter; color: #0000ff;"><a href="saml-with-keycloak.html#add-parameters" class="topiclink">создании параметров на стороне провайдера аутентификации</a></span><span style="font-family: Inter;">. Обратите внимание, если в SAMLсообщении получены пустые значения, они также заменяют существующие данные пользователя в ELMA365;</span></li><li class="p_Normal"><span style="font-weight: bold;">Использовать для пользователей</span> — укажите, для кого будет возможна авторизация через SAML: для пользователей внешнего портала или для внутренних пользователей ELMA365.</li></ul>
<ol style="list-style-type:upper-roman" start="4">
<li value="4" class="p_Normal">Нажмите <span style="font-weight: bold;">Сохранить</span>. После этого будет сгенерирована ссылка на файл метаданных, которая отобразится в поле <span style="font-weight: bold;">URL метаданных</span>. </li><li value="5" class="p_Normal">Перейдите по полученной ссылке и сохраните файл метаданных Service Provider в <span style="font-weight: bold;">.xml</span> формате. Он потребуется для финальной настройки SAMLприложения на стороне Keycloak. </li></ol>
<h2 class="p_Heading2"><span class="f_Heading2">Финальная настройка приложения SAML в Keycloak </span></h2>
<ol style="list-style-type:upper-roman">
<li value="1" class="p_Normal">Вернитесь в интерфейс настройки Keycloak и импортируйте клиента с помощью файла метаданных, полученных при настройке интеграции SAML в ELMA365 на шаге 5. Для этого из левого меню перейдите в раздел <span style="font-weight: bold;">Clients</span> и нажмите кнопку <span style="font-weight: bold;">Import client</span>. На отрывшейся странице загрузите файл метаданных с помощью кнопки <span style="font-weight: bold;">Browse</span>. После сохранения откроется окно настройки приложения. </li><li value="2" class="p_Normal">Перейдите на вкладку <span style="font-weight: bold;">Keys</span> и с помощью кнопки <span style="font-weight: bold;">Import Key</span> импортируйте хранилище ключей <span style="font-weight: bold;">cert.p12</span>, созданное при настройке интеграции SAML в ELMA365 на шаге 3. Укажите формат архивирования (в нашем примере это <span style="font-weight: bold;">PKCS12</span>), лэйбл, указанный после директивы <span style="font-weight: bold;">-name</span> при экспорте ключа, и пароль от хранилища. &nbsp;</li><li value="3" class="p_Normal"><a id="add-parameters" class="hmanchor"></a>Для корректной работы интеграции на стороне Keycloak необходимо создать два обязательных для SAMLпараметра: <span style="font-weight: bold;">windowsaccountname</span> и <span style="font-weight: bold;">externalCode</span>. <span style="font-family: Inter;">Если в настройках модуля </span><span style="font-family: Inter; font-weight: bold;">SAML</span><span style="font-family: Inter;"> в ELMA365 включено </span><span style="font-family: Inter; color: #0000ff;"><a href="saml-with-keycloak.html#update-user-data" class="topiclink">обновление данных пользователей при аутентификации</a></span><span style="font-family: Inter;">, добавленные параметры также определяют, какие данные будут обновляться.</span></li></ol>
<p style="line-height: 1.28; margin: 0 0 11px 34px;"><span style="font-family: Inter;">Для добавления параметров перейдите из левого меню</span> в раздел <span style="font-weight: bold;">Clients</span> и выберите созданное приложение. Затем откройте вкладку <span style="font-weight: bold;">Client scopes</span> и снова выберите созданное приложение. </p>
<ol style="list-style-type:upper-roman">
<li value="4" class="p_Normal">На открывшейся странице на вкладке <span style="font-weight: bold;">Mappers</span> нажмите кнопку <span style="font-weight: bold;">Add predefined mapper</span>. Из открывшегося списка выберите <span style="font-weight: bold;">role_list</span>.</li><li value="5" class="p_Normal">На вкладке <span style="font-weight: bold;">Mappers</span> нажмите кнопку <span style="font-weight: bold;">Add mapper</span>. Из списка выберите <span style="font-weight: bold;">By configuration</span>. В открывшемся модальном окне выберите <span style="font-weight: bold;">User attributes</span>. </li><li value="6" class="p_Normal">Создайте два параметра со следующими данными: </li></ol>
<ul style="list-style-type:disc">
<li class="p_Normal"><span style="font-weight: bold;">для windowsaccountname</span>: <ul style="list-style-type:circle">
<li class="p_Normal"><span style="font-weight: bold;">Name</span><span style="font-weight: bold; color: #ff0000;">*</span> — http://schemas.xmlsoap.org/ws/2005/05/identity/claims/windowsaccountname;</li><li class="p_Normal"><span style="font-weight: bold;">User Attribute</span> — windowsaccountname; </li><li class="p_Normal"><span style="font-weight: bold;">SAML Attribute Name</span> — http://schemas.xmlsoap.org/ws/2005/05/identity/claims/windowsaccountname;</li><li class="p_Normal"><span style="font-weight: bold;">SAML Attribute NameFormat</span> — URL Reference. </li></ul></li></ul>
<p class="p_Normal" style="margin: 0 0 0 36px;">Параметр является обязательным. Атрибут будет сопоставлен с логином пользователя в ELMA365. </p>
<ul style="list-style-type:disc">
<li class="p_Normal">для <span style="font-weight: bold;">externalCode</span>: </li></ul>
<ul style="list-style-type:disc"><ul style="list-style-type:circle">
<li class="p_Normal"><span style="font-weight: bold;">Name</span><span style="font-weight: bold; color: #ff0000;">*</span> — http://schemas.xmlsoap.org/ws/2005/05/identity/claims/externalCode;</li><li class="p_Normal"><span style="font-weight: bold;">User Attribute</span> — externalCode; </li><li class="p_Normal"><span style="font-weight: bold;">SAML Attribute Name</span> — http://schemas.xmlsoap.org/ws/2005/05/identity/claims/externalCode;</li><li class="p_Normal"><span style="font-weight: bold;">SAML Attribute NameFormat</span> — URL Reference. </li></ul></li></ul>
<p class="p_Normal" style="margin: 0 0 0 36px;">Параметр является обязательным. Используется для идентификации внешнего пользователя в ELMA365. </p>
<ol style="list-style-type:upper-roman">
<li value="7" class="p_Normal">Так как Keycloak будет являться поставщиком удостоверений, необходимо создать нового пользователя. Для этого из левого меню перейдите в раздел <span style="font-weight: bold;">Users</span> и создайте пользователя. Затем откройте вкладку <span style="font-weight: bold;">Credentials</span> и задайте для него пароль. </li><li value="8" class="p_Normal">На вкладке <span style="font-weight: bold;">Attributes</span> укажите значения для следующих атрибутов: &nbsp;</li></ol>
<ul style="list-style-type:disc">
<li class="p_Normal"><span style="font-weight: bold;">externalCode</span> — идентификатор пользователя, аналог objectGUID в ActiveDirectory; </li><li class="p_Normal"><span style="font-weight: bold;">windowsaccountname</span> — логин пользователя из интерфейса ELMA365. </li></ul>
<p class="p_Normal" style="margin: 0 0 0 36px;">Также укажите электронную почту и имя пользователя. &nbsp;</p>
<ol style="list-style-type:upper-roman">
<li value="9" class="p_Normal">Нажмите <span style="font-weight: bold;">Save</span>. </li></ol>
<h2 class="p_Heading2"><span class="f_Heading2">Удаление SAML-провайдера</span></h2>
<p class="p_Normal">Если в системе нет пользователей, авторизованных через SAML-провайдера, его можно удалить. Для этого в настройках модуля SAML нажмите на значок корзины справа от названия и подтвердите действие.</p>
<p class="p_Normal"><img alt="saml-4" width="603" height="312" style="margin:0;width:603px;height:312px;border:none" src="saml-4.png"/></p>
<div class="bottom-nav">
<a id="prev-link" class="topic__navi_prev" href="saml-with-azure.html">
<span class="bottom-nav__arrow bottom-nav__arrow--prev"></span> <span
class="bottom-nav__link">saml-with-azure.html</span>
</a>
<a id="next-link" class="topic__navi_next" href="audit_service.html">
<span class="bottom-nav__link">audit_service.html</span> <span
class="bottom-nav__arrow bottom-nav__arrow--next"></span>
</a>
</div>
<!-- добавляет на страницу строку блок Была ли статья полезной? -->
<div class="feedback-wrap"><div class="feedback" id="feedback"><span><b>Была ли статья полезной?</b></span><form action="" method="POST" class="feedback-form" id="feedback-form"><div class="feedback__popup feedback__popup-response" id="feedback__popup_thx">Спасибо за ваш отзыв!</div><div id="feedback-success-popup"><div class="wrap"><button type="button" class="feedback-popup-close">×</button><svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_212_2187)"><path d="M22 0.6875C10.2294 0.6875 0.6875 10.2294 0.6875 22C0.6875 33.7706 10.2294 43.3125 22 43.3125C33.7706 43.3125 43.3125 33.7706 43.3125 22C43.3125 10.2294 33.7706 0.6875 22 0.6875ZM22 40.5625C11.8023 40.5625 3.4375 32.3078 3.4375 22C3.4375 11.8024 11.6922 3.4375 22 3.4375C32.1977 3.4375 40.5625 11.6922 40.5625 22C40.5625 32.1976 32.3078 40.5625 22 40.5625ZM34.1713 16.933L18.6613 32.3186C18.257 32.7197 17.604 32.7171 17.203 32.3128L9.82283 24.873C9.42176 24.4686 9.42434 23.8157 9.82867 23.4146L10.5609 22.6884C10.9652 22.2873 11.6181 22.2899 12.0192 22.6942L17.9468 28.6697L31.9926 14.7366C32.3969 14.3356 33.0498 14.3382 33.4509 14.7425L34.1772 15.4747C34.5783 15.879 34.5757 16.532 34.1713 16.933Z" fill="#27AE60"></path></g><defs><clipPath id="clip0_212_2187"><rect width="44" height="44" fill="white"></rect></clipPath></defs></svg><p>Ваш отзыв успешно отправлен!</p><span>Спасибо за обратную связь.</span></div></div><div class="feedback__popup" id="feedback__popup_why"><button type="button" class="feedback-popup-close">×</button><div class="feedback__popup-header">Уточните, почему:</div><input type="radio" name="category" id="bad_recommendation" value="bad_recommendation"><label for="bad_recommendation">Рекомендации не помогли</label><input type="radio" name="category" id="difficult_text" value="difficult_text"><label for="difficult_text">Текст трудно понять</label><input type="radio" name="category" id="no_answer" value="no_answer"><label for="no_answer">Нет ответа на мой вопрос</label><input type="radio" name="category" id="bad_header" value="bad_header"><label for="bad_header">Содержание статьи не соответствует заголовку</label><input type="radio" name="category" id="other_reason" value="other_reason"><label for="other_reason">Другая причина</label></div><div class="feedback__popup" id="feedback__popup-other"><button type="button" class="feedback-popup-close">×</button> <div class="feedback__popup-header">Расскажите, что вам не понравилось в статье:</div><textarea class="feedback__textarea" name="other" id=""></textarea><input type="submit" class="feedback__other-btn" value="Отправить"></div><div class="feedback-form__btn-group"><input type="radio" name="useful" id="feedback__useful_yes" value="true"><label for="feedback__useful_yes"><img src="like.svg"/><span class="feedback-form__btn-group_yes-btn">Да</span></label><input type="radio" name="useful" id="feedback__useful_no" value="false"><label for="feedback__useful_no"><img src="dislike.svg"/><span class="feedback-form__btn-group_no-btn">Нет</span></label></div><select name="category"><option disabled>Выберите вариант</option><option value="bad_recommendation" selected>Рекомендации не помогли</option><option value="difficult_text">Текст трудно понять</option><option value="no_answer">Нет ответа на мой вопрос</option><option value="bad_header">Содержание статьи не соответствует заголовку</option><option value="other_reason">Другая причина</option></select><input type="submit"></form></div></div>
</section>
</div>
<aside class="article__sidebar" style="display:none">
<input type="checkbox" />
<div class="article__arrow"></div>
<div class="table-of-contents elma365-right" id="toc2Content">
<h3 class="h3-toc">В этой статье</h3>
<nav id="toc2"></nav>
</div>
</aside>
</div>
</article>
</main>
<footer class="footer">
<div class="footer-container">
<div class="footer-mobile">
<ul class="footer-mobile__list"><li><a href="https://api.elma365.com/ru/" target="_blank">API</a></li><li><a href="https://tssdk.elma365.com/" target="_blank">TS SDK</a></li><li><a href="https://community.elma365.com/" target="_blank">Community</a></li><li><a href="https://elma-academy.com/ru/elma365" target="_blank">Академия</a></li></ul><ul class="footer-mobile__list"><li><a href="https://elma365.com/ru/help/platform/get-trial.html">Платформа</a></li><li><a href="https://elma365.com/ru/help/ecm/ecm-functions.html">ECM</a></li><li><a href="https://elma365.com/ru/help/service/service-functions.html">Service</a></li><li><a href="https://elma365.com/ru/help/projects/projects-functions.html">Проекты</a></li></ul>
</div>
<div class="container">
<div class="footer-wrap">
<div><span class="mobile-question-popup">Отправить фидбэк</span><form method="POST" action class="question__popup question-xs" id="question__popup"><div class="question-wrap"><span class="close"></span><span class="title">Задать вопрос</span><label for="help_question" style="display: none;"></label><textarea name="help_question" id="help_question"></textarea><input type="submit" value="Отправить"></div></form><div class="hidden fade-in question-success-xs">Ваш фидбэк отправлен.</div></div>
<div class="footer-flex-b">
<div class="footer-top">
<span class="footer-copy">&copy; 2025
ELMA365
</span>
<a href="https://navigator.sk.ru/orn/1122971" target="_blank">
<img src="sk-resident.svg" alt="sk icon" class="footer-img" width="117" height="34">
</a>
</div>
<div class="footer-line">
<div class="footer-line-copy">
<span class="footer-copy">&copy; 2025
ELMA365
</span>
</div>
<ul class="footer-list">
<li class="footer-item"><a href="https://elma365.com/ru/" target="_blank" class="footer-link" style="color: #0D4A75;"><img src="browse.svg" alt="browse icon" class="footer-img">elma365.com</a></li><li class="footer-item"><a href="https://www.youtube.com/user/ELMABPM" target="_blank" class="footer-link"><img src="yt.svg" alt="youtube icon" class="footer-img"></a></li><li class="footer-item"><a href="https://vk.com/elma_bpm" target="_blank" class="footer-link"><img src="vk.svg" alt="vk icon" class="footer-img"></a></li><li class="footer-item"><a href="https://t.me/elmaday" target="_blank" class="footer-link"><img src="tg.svg" alt="telegram icon" class="footer-img"></a></li><li class="footer-item"><a href="https://dzen.ru/elma" target="_blank" class="footer-link"><img src="dzen.svg" alt="dzen icon" class="footer-img"></a></li>
<li class="footer-item">
<a href="https://navigator.sk.ru/orn/1122971" target="_blank">
<img src="sk-resident.svg" alt="sk icon" class="footer-img" width="117" height="34">
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<a href="#" class="arrow-top"></a>
</div>
</footer>
<!-- <script type="text/javascript" src="jquery1.min.js"></script>-->
<iframe name="hmnavigation" style="display:none!important"></iframe>
<!--<script src="./jquery-ui.js"></script> -->
<script src="./jquery-ui.min.js"></script>
<!--script src="//cdn.jsdelivr.net/npm/featherlight@1.7.14/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script-->
<script src="./jquery.tocify.min.js"></script>
<script src="./TypoReporter.min.js"></script>
<script src="./google-search.js"></script>
<script src="./main.js"></script>
</body>
</html>