Контекст
В D7 установка заголовков Set-Cookie делается через объект ответа: вы создаёте экземпляр \Bitrix\Main\Web\Cookie, настраиваете область действия и передаёте его в getResponse()->addCookie(). Чтение — через текущий HttpRequest. Так вы остаетесь в одной модели с остальным ядром, а не смешиваете прямой setcookie() с внутренними правилами префиксов.
Установка значения
Пример: имя и значение, срок жизни 30 дней, распространение на домен, путь /, при необходимости флаги Secure и HttpOnly под вашу схему HTTPS и политику XSS:
$cookie = new \Bitrix\Main\Web\Cookie('CookieName', 'CookieValue', time() + 86400 * 30);
$cookie->setSpread(\Bitrix\Main\Web\Cookie::SPREAD_DOMAIN);
$cookie->setDomain('mydomain.ru');
// либо, например, \Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getHttpHost()
$cookie->setPath('/');
$cookie->setSecure(false);
$cookie->setHttpOnly(false);
\Bitrix\Main\Application::getInstance()->getContext()->getResponse()->addCookie($cookie);Пока ответ реально не ушёл клиенту, браузер cookie не получит: для обычной страницы заголовки уйдут с эпилогом; в нестандартных точках входа смотрите следующий блок.
AJAX и вывод без полного эпилога
Если сохранение выполняется из обработчика AJAX без типового завершения запроса, заголовки нужно отправить явно:
\Bitrix\Main\Context::getCurrent()->getResponse()->writeHeaders();Иначе addCookie() отработает в объекте ответа, но клиент не увидит Set-Cookie.
Чтение значения
Через контекст приложения получают HttpRequest и читают cookie по имени. Два варианта — с учётом префикса из настроек главного модуля и «сырое» имя:
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$value = $request->getCookie('name');
// Префикс BITRIX_SM_ или другой из настроек главного модуля подставляется автоматически
$valueRaw = $request->getCookieRaw('name');
// Имя в том виде, как пришло в запросе, без автоматического префиксаНа что смотреть в продакшене
- Для публичного HTTPS включайте
setSecure(true), если cookie не должны улетать по HTTP. setHttpOnly(true)уместен для служебных меток, которые не должны быть доступны из JS.- Домен и
SPREAD_*должны совпадать с реальной схемой поддоменов, иначе браузер просто проигнорирует заголовок.
Итог
Минимальный цикл в D7: создать Cookie, настроить область (setDomain, setPath, setSpread), добавить через getResponse()->addCookie(), при обрывном сценарии вызвать writeHeaders(), читать через getRequest()->getCookie / getCookieRaw в зависимости от того, нужен ли префикс платформы.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии