<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">
 <channel>
	<title>Битрикс. Поваренная книга</title>
	<link>http://dev.1c-bitrix.ru/community/blogs/cookbook/</link>
	<description>desc</description>
	<language>ru</language>
	<docs>http://backend.userland.com/rss2</docs>
	<pubDate>Sun, 19 Apr 2026 08:08:49 +0300</pubDate>

    <item>
      <title>Композитный сайт: tips &amp; tricks</title>
      <description><![CDATA[<b>1. Как сделать динамическую область вне контекста шаблона компонента?</b><br />
====code====
<pre>&#92;Bitrix&#92;Main&#92;Page&#92;Frame::getInstance()-&#62;startDynamicWithID("area");
&nbsp;&nbsp;&nbsp;//динамический контент вне компонента
&#92;Bitrix&#92;Main&#92;Page&#92;Frame::getInstance()-&#62;finishDynamicWithID("area", "Загрузка...");</pre>
=============
Способ с буферизацией. Удобнее в использовании, но нельзя использовать отложенные функции внутри динамической области и в заглушке.<br />
====code====
<pre>$frame = new &#92;Bitrix&#92;Main&#92;Page&#92;FrameHelper("my_dynamic_area");
$frame-&#62;begin();
&nbsp;&nbsp; //динамический контент
$frame-&#62;beginStub();
&nbsp;&nbsp;//заглушка
$frame-&#62;end();</pre>
=============
В следующем обновлении композитного сайта: компонент, находящийся в динамической области, не участвует в голосовании.<br /><br /><br /><b>2. Как отменить композитное кеширование в любом месте страницы (проголосовать &quot;против&quot;) ?</b><br />
====code====
<pre>&#92;Bitrix&#92;Main&#92;Data&#92;StaticHtmlCache::getInstance()-&#62;markNonCacheable();
</pre>
=============
<br /><br /><b>3. Страницы с расширением *.html не обрабатываются. Что делать?</b><br />На странице настроек в поле &quot;Маска включения&quot; добавляем &quot;*.html&quot;.<br /><br /><br /><b>4. Как учитывать композитные страницы в Google Analytics?</b><br />Google Analytics и Яндекс.Метрика собирают данные клиентской загрузки на основе <noindex><a href="http://www.w3.org/TR/navigation-timing/" target="_blank" rel="nofollow" >Navigation Timing</a></noindex>. Эта статистика показывает реальное время, с которым пользователи открывают страницы вашего сайта. Здесь важно понимать, что композит влияет только на время ожидания ответа от сервера (Server Response Time). Он не влияет на время: а) DNS lookup б) TCP-соединения в) загрузки JS, CSS и картинок.<br /><br />По глобальной JS-переменной <i>window.frameRequestStart</i> можно определить, что страница отдалась пользователю из композитного кеша.<br />
====code====
<pre>var _gaq = _gaq || &#91;&#93;;
_gaq.push(&#91;'_setAccount', 'UA-18655900-1'&#93;);
_gaq.push(&#91;'_setCustomVar', 1, 'Cache', window.frameRequestStart ? 'Composite': 'NoComposite', 3&#93;);</pre>
=============
Код для Google Analytics нужно располагать ниже кода, выполняющего фоновый композитный запрос. <br /><br /><br /><b>5. В чем разница между $this-&gt;createFrame()-&gt;begin(); и $this-&gt;createFrame()-&gt;begin(&quot;&quot;); ?</b><br />Есть несколько способов выделить в шаблоне компонента динамическую область.<br />Самый популярный вариант выглядит так:<br />
====code====
<pre>$frame = $this-&#62;createFrame()-&#62;begin();
&nbsp;&nbsp;&nbsp;//динамический контент
$frame-&#62;beginStub();
&nbsp;&nbsp;&nbsp;//заглушка
$frame-&#62;end();</pre>
=============
Метод <i>beginStub</i> может отсутствовать, т.к. в метод <i>begin</i> можно сразу передать текст заглушки. <br />
====code====
<pre>$frame = $this-&#62;createFrame()-&#62;begin("Загрузка...");
&nbsp;&nbsp;&nbsp;//динамический контент
$frame-&#62;end();</pre>
=============
Пустая строка будет означать пустую заглушку.<br />
====code====
<pre>$frame = $this-&#62;createFrame()-&#62;begin("");
&nbsp;&nbsp;&nbsp;//динамический контент
$frame-&#62;end();</pre>
=============
А вот так можно записать контент динамической области в кеш, когда контент заглушки совпадает c контентом динамической части.<br />
====code====
<pre>$frame = $this-&#62;createFrame()-&#62;begin();
&nbsp;&nbsp;&nbsp;//динамический контент = заглушка
$frame-&#62;end();
</pre>
=============
<br />Этот способ позволяет избежать дублирования и повторного выполнения код. <br />С версии main 14.5.2 контент заглушки стал учитываться при подсчете хеш-суммы кеша.<br /><br /><br /><b>6. Какие еще особенности у begin и beginStub?</b><br />Важно понимать, что код между вызовами <i>begin</i>-<i>beginStub</i> и <i>beginStub</i>-<i>end</i> выполняется всегда. И на первом хите к странице (на котором создается кеш) и на аякс-хите. Эти методы занимаются буферизацией контента и не являются аналогами конструкции if-else.<br /><br /><br /><b>7. В теге &lt;head&gt; есть блок php, который проверяет специальный Cookie, и если он установлен, добавляет блок &lt;style&gt; с нужными стилями. Генерируется новая страничка, кеш перезаписывается. Как быть в таких случаях?</b><br />Вынести эту логику в Javascript.<br />
====code====
<pre>&#60;head&#62;
&#60;script&#62;
if (document.cookie.indexOf("my_cookie=yes") &#62;= 0)
{
&nbsp;&nbsp;&nbsp;//Устанавливаем класс для тега &#60;html&#62;
&nbsp;&nbsp;&nbsp;document.documentElement.className += " has-cookie";
}
&#60;/script&#62;
&#60;/head&#62;

&#60;style&#62;
.block { display: none; }
.has-cookie .block { display: block; }
&#60;/style&#62;
</pre>
=============
<br /><br /><b>8. Что является причиной перезаписи кеша?</b><br />Причин много. Вот самые популярные:<br />- Случайные ID в HTML и Javascript. Метод randString поможет решить эту проблему.<br />- Вывод данных из сессии (id, login).<br />- Контент страницы зависит от User Agent.<br />- Разный контент для анонимного и для авторизованного пользователя.<br />- Добавление на страницу CSS- и JS-файлов в зависимости от пользователя.<br /><br /><br /><b>9. Поменяли верстку в шаблоне сайта, но страницы из кеша отдаются в старом дизайне.</b><br />Кеш обновляется фоновым аякс-запросом, поэтому первый хит будет еще со старым дизайном.<br />После подобных изменений сайта эффективнее очистить весь композитный кеш.<br /><br /><br /><b>10. Счетчик товаров в корзине пользователя находится в динамической области. Некрасиво прыгает цифра: сначала ноль, потом один.</b><br />Давайте подобно посмотрим, из-за чего это происходит.<br />- В файл кеша записывается заглушка &quot;0 товаров в корзине&quot;.<br />- Страница из кеша отдается пользователю и показывается. <br />- Даже если аяксовый хит с нужными данными приходит раньше, чем отрендерилась страница, все равно пользователь на мгновение видит заглушку. <br />- Это происходит из-за того, что все вставки в innerHTML (в том числе из sqlite) происходят на событии DOMContentLoaded.<br />- Хотя в большинстве случае виноват даже не DOMContentLoaded, а долгое выполнение аяксового запроса.<br /><br />Чтобы побороть моргание, нужно вставить актуальные данные в страницу до того, как она покажется пользователю.<br /><br />Как вставить до рендеринга?<br /><br />а) document.write - это конструкция останавливает рендеринг страницы, для того, чтобы на лету вставить в DOM новый HTML. Разработчики браузеров не рекомендуют ее использовать, но она работает.<br /><br />б) Разместить Javascript в странице так, чтобы он располагался после HTML'я, к которому обращается.<br />Это старый забытый способ начала 2000-x годов, когда еще jQuery'ая $.ready() не замылила всем глаза.<br />$.ready() или битриксовая BX.ready - это выполнение кода на событии DOMContentLoaded. Это событие гарантирует, что DOM построен и к нему можно безопасно обращаться. Минус этого события в том, что на больших страницах интерфейс уже успевает пользователю показаться, отсюда и моргание.<br />
====code====
<pre>&#60;!doctype html&#62;
&#60;html&#62;
&#60;body&#62;
&#60;div id="box" style="width: 100px; height: 100px; background: red;"&#62;&#60;/div&#62;
&#60;script&#62;document.getElementById("box").style.background = "blue";&#60;/script&#62;
&#60;table&#62;&#60;tr&#62;&#60;td&#62;some html below&#60;/td&#62;&#60;/tr&#62;&#60;/table&#62;
&#60;/body&#62;
&#60;/html&#62;
</pre>
=============
<br />Да, есть вероятность нарваться на Exception, поэтому можно подстраховаться:<br />
====code====
<pre>function changeBox()
{
&nbsp;&nbsp; document.getElementById("box").style.background = "blue";
}

var box = document.getElementById("box");
if (box)
{
&nbsp;&nbsp; changeBox();
}
else
{
&nbsp;&nbsp; BX.ready(function() { changeBox(); });
}
</pre>
=============
<br />Откуда взять актуальные данные?<br /><br />Три варианта:<br />- Cookies<br />- SQLite<br />- LocalStorage<br /><br />Самый приемлемый вариант - это localStorage. Это key-value хранилище, которое поддерживается всеми браузерами, даже IE8.<br />Данные localStorage доступны мгновенно сразу во всех вкладках. Т.е. если у пользователя открыто 10 вкладок магазина и он в одной из них жмет &quot;Добавить в корзину&quot;, то через событие localStorage'а можно мгновенно поменять во всех вкладках счетчик корзины.<br /><br />Для localStorage в Битриксе есть своя обвязка под названием BX.localStorage. Она позволяет указывать время хранения данных.<br /><br />Основные методы:<br />BX.localStorage.set(key, value, ttl)<br />BX.localStorage.get(key)<br />BX.localStorage.remove(key)<br /><br />События:<br />BX.addCustomEvent(&quot;onLocalStorageSet&quot;, function(data) { console.log(data.key, data.value) });<br />BX.addCustomEvent(&quot;onLocalStorageRemove&quot;, function(data) {});<br />BX.addCustomEvent(&quot;onLocalStorageChange&quot;, function(data) {});<br /><br />В итоге: счетчик корзины и имя пользователя можно кешировать в localStorage и использовать эти данные для борьбы с морганием.<br /><br /><br /><b>11. Если еще какие-нибудь способы борьбы с морганием?</b><br />Все зависит от дизайна сайта и от контента динамических областей. <br />Старайтесь делать верстку так, чтобы вставка динамических областей не приводила к прыганию соседних элементов.<br />C помощью метода <i>setAnimation(true)</i> можно добавить эффект плавного появления контента. <br />Экспериментируйте с содержимым заглушек. Заглушка может быть пустой, а может повторять содержимое динамической области (см. пункт 5).<br /><br /><br /><b>12. Динамическая область автоматически оборачивает свой контент в дополнительный div, который портит верстку сайта.</b><br />Композитному кешированию необходимы html-контейнеры для вставки в них содержимого динамических областей. <br />Можно использовать свои контейнеры:<br />
====code====
<pre>echo '&#60;div id="my_div"&#62;';
$frame = $this-&#62;createFrame("my_div", false)-&#62;begin();
&nbsp;&nbsp;&nbsp;//динамический контент
$frame-&#62;beginStub();
&nbsp;&nbsp;&nbsp;//заглушка
$frame-&#62;end();
echo '&#60;/div&#62;';
</pre>
=============<br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/10848.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/10848.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/10848.php</guid>
      <pubDate>Tue, 24 Jun 2014 13:48:23 +0400</pubDate>
    </item>

    <item>
      <title>Композитные новости</title>
      <description><![CDATA[В ближайших обновлениях главного модуля композитный режим получит ряд изменений.<br />Список улучшений выглядит так:<br /><br />main 14.5.1<br />- Административная панель отключает композитный режим на странице и не может быть записана в кеш; <br />- Константа POST_FORM_ACTION_URI дает одинаковый результат для адресов /folder/ и /folder/index.php;<br />- Решена проблема с адресами, которые заканчиваются на .html и с адресами без слеша в конце.<br /><br />main 14.5.2<br />- Поддержка memcached;<br />- Отказ от поддержки IE9 и ниже;<br />- Централизованная обработка bitrix_sessid_post();<br />- Учет голосования закешированных шаблонов;<br />- Учет контента "заглушек" динамических областей при подсчете хеша страницы.<br /><br />Главная фича - это поддержка memcached, как хранилища для кеша страниц. На странице настройки композитного режима можно указать, где хранить кеш: в файлах или в memcached.<br /><br /><img src="https://site-cloud-files.bitrix24.tech/resize_cache/876736/04dbd6b4c314fe48f655aad84339ad15/main/9e8/9e8a10556d896ba2edae58cbe798980c/composite_settings.png" title="" alt="composite_settings.png" border="0"style=" width:800px; height:439px;" data-bx-image="http://dev.1c-bitrix.ru/bitrix/components/bitrix/blog/show_file.php?fid=11062" /><br /><br />Кластерный вариант memcached использует настройки модуля Веб-кластер. Требуется наличие этого модуля. <br /><br />Остальные изменения направлены на минимизацию ситуаций, при которых происходит перезапись кеша.<br /><br />1. Функция bitrix_sessid_post() генерирует hidden поле с хешом от ID сессии, чтобы "подписывать" все формы в компонентах (защита от CSRF). Теперь эта функция вернет пустой value, а реальное значение установится через JavaScript.<br /><br />2. Старые версии Internet Explorer имеют ограничения на количество элементов &lt;style&gt; и &lt;link type="text/css"&gt;. В определенных ситуациях часть CSS для этих браузеров выводится в inline-виде. Также существует вероятность отдать страницу из кеша, в которой не будет работать часть CSS-правил. Мы приняли решение отключить композитный режим для IE6-9.<br /><br />3. Административная панель отключает на странице композит. В кеш она никогда не запишется. Это связанно с особенностями ее работы, а также с безопасностью.<br /><br />4. Если шаблон компонента отдается из кеша (через $this-&gt;StartResultCache()) и при этом шаблон голосовал "против", то композитный режим будет отменен. <br />До версии main 14.5.2 закешированный шаблон всегда голосовал "за". <br />Проверьте свои страницы, в отладочном логе будет присутствовать специальная пометка "(from component cache)".<br /><br />5. Константа POST_FORM_ACTION_URI перестала быть причиной перезаписи кеша. На страницах /folder/ и /folder/index.php ее значение будет одинаковым.<br /><br />С учетом вышеперечисленных обновлений мы изменили на странице курса настройки для nginx.<br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/10841.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/10841.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/10841.php</guid>
      <pubDate>Mon, 23 Jun 2014 15:38:40 +0400</pubDate>
    </item>

    <item>
      <title>Устанавливаем на сайт модуль социальной сети</title>
      <description><![CDATA[Как известно, мы выпустили новый модуль "Социальная сеть". Социальная сеть может быть полезна проектам, которые уже объединяют аудиторию по каким-либо интересам. Новый модуль поможет еще лучше наладить общение между посетителями сайта. Модуль включен в редакции "Бизнес", "Портал", "Большой бизнес".<br /><br />Рассмотрим, как новый модуль может быть интегрирован на уже существующий сайт на примере сата <noindex><a href="http://www.flowersweb.info/" target="_blank" rel="nofollow" >Комнатные растения</a></noindex>.<br /><br /><img src="https://site-cloud-files.bitrix24.tech/blog/772/2008-11-01_160622.png" title="" alt="" border="0"style=" width:600px; height:336px;" data-bx-image="http://dev.1c-bitrix.ru/bitrix/components/bitrix/blog/show_file.php?fid=783" /><br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/461.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/461.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/461.php</guid>
      <pubDate>Sat, 01 Nov 2008 16:44:32 +0300</pubDate>
    </item>

    <item>
      <title>Установка продукта в существующую базу данных</title>
      <description><![CDATA[На пятом шаге мастера установки есть возможность указать имя существующей базы данных, в которую будет установлен продукт. <br /><br /><img src="https://site-cloud-files.bitrix24.tech/blog/3c7/wizard.gif" title="" alt="" border="0"style=" width:530px; height:429px;" data-bx-image="http://dev.1c-bitrix.ru/bitrix/components/bitrix/blog/show_file.php?fid=588" /><br /><br />Если в указанную базу данных ранее был установлен Битрикс, мастер выдаст сообщение об ошибке и не позволит перейти на следующий шаг.<br />Запустив мастер c параметром clear_db=Y (например, <noindex><a href="http://localhost/?clear_db=Y)" target="_blank" rel="nofollow" >http://localhost/?clear_db=Y)</a></noindex>, перед установкой продукта в указанной базе данных будут удалены все таблицы и связанные с ними сущности.<br /><br />Данный способ удобен для переустановки продукта на хостинге, а также когда лень лезть в sql-менеджер <img src="http://dev.1c-bitrix.ru/upload/main/smiles/3/bx_smile_smile.png" border="0" data-code=":)" data-definition="UHD" alt=":)" style="width:20px;height:20px;" title="С улыбкой" class="bx-smile" />.<br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/362.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/362.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/362.php</guid>
      <pubDate>Fri, 25 Jul 2008 22:55:32 +0400</pubDate>
    </item>

    <item>
      <title>Используем RSS агрегатор для автоматического наполения ленты новостей нашего сайта</title>
      <description><![CDATA[Иногда возникает задача вывода новостей, новостных блоков на сайте используя RSS.<br /><br />Например, у Вас сайт посвящён обзору компьютерных игр, и Вы желаете иметь новостную ленту, которая будет наполняться сразу из нескольких источников. <br />К сожалению, при стандартной организации такого вывода мы сильно зависим от RSS источников. Если источник не работает, то соответственно раздел нашего сайта тоже не работает. Также нет возможности вести собственный архив новостей и статей, что делает нашу новостную ленту не особо привлекательной.<br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/350.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/350.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/350.php</guid>
      <pubDate>Wed, 16 Jul 2008 12:47:33 +0400</pubDate>
    </item>

    <item>
      <title>И опять про Ajax 2.0</title>
      <description><![CDATA[Поговорим про новую технологию, названную в 1С-БУС Ajax 2.0. Про нее уже было много чего сказано на партнерской конференции, общий принцип работы Сергей <noindex><a href="http://www.1c-bitrix.ru/blog/rsv/253.php" target="_blank" rel="nofollow" >описал в своем блоге</a></noindex>, выпущена <noindex><a href="http://www.1c-bitrix.ru/sitemanager/doc.php#ajax" target="_blank" rel="nofollow" >документация</a></noindex>. Мне же осталось добавить несколько деталей.<br /><br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/255.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/255.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/255.php</guid>
      <pubDate>Fri, 28 Dec 2007 14:40:33 +0300</pubDate>
    </item>

    <item>
      <title>How To: Создаем windows приложение для добавления новостей</title>
      <description><![CDATA[С версии 6.5 в редакции "Бизнес" и "Эксперт" был включен новый модуль "Веб-сервисы". Помимо красивого гаджета для Висты, он содержит в себе еще множество возможностей. Рассмотрим, как на его основе можно сделать простейшее Windows-приложение для добавления новостей при помощи Visual Studio 2005 и .NET Framework 2.0<br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/198.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/198.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/198.php</guid>
      <pubDate>Wed, 03 Oct 2007 17:20:12 +0400</pubDate>
    </item>

    <item>
      <title>Используем AJAX в публичном разделе сайта</title>
      <description><![CDATA[Начиная с версии 6.5 в поставку входят средства для использования AJAX ("аякс", с вашего позволения) на публичных страницах сайта.<br /><br />Сразу должен заметить, что полноценной библиотекой это назвать пока что нельзя, но на практике использовать вполне можно. Например, компонент ввода облака тегов использует новую библиотеку для показа списка похожих тегов при вводе тега.<br /><br /><img src="https://site-cloud-files.bitrix24.tech/blog/f58/scr3.png" title="" alt="" border="0"style=" width:431px; height:429px;" data-bx-image="http://dev.1c-bitrix.ru/bitrix/components/bitrix/blog/show_file.php?fid=369" /><br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/197.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/197.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/197.php</guid>
      <pubDate>Mon, 01 Oct 2007 20:32:32 +0400</pubDate>
    </item>

    <item>
      <title>Кастомизируем стандартный компонент форума</title>
      <description><![CDATA[Итак, мы решились поставить на свой сайт компонент 2.0 форума, комплексный. Перетащили в визуальном редакторе компонент на страницу, настроили параметры, сохранили.<br /><br />Все замечательно работает, но есть одна неприятная мелочь - сайт у нас зеленый, а форумы по умолчанию показываются в синих тонах.<br /><br />Конечно, хочется раскрасить форум в свои цвета. Посмотрим, какие у нас есть для этого возможности.<br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/176.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/176.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/176.php</guid>
      <pubDate>Tue, 10 Jul 2007 15:44:30 +0400</pubDate>
    </item>

    <item>
      <title>Как прикрутить набираемые пользовательские свойства к своему модулю</title>
      <description><![CDATA[Пока готовится документация по API набираемых свойств, давайте разберем, как эти свойства использовать.<br /><br />Посмотрим, как свойства "работают" для объектов "Пользователи".<br /><br />Коротко процесс выглядит так:<br />1)выведем закладку со свойствами в форме редактирования пользователя;<br />2)изменим класс CUser, чтобы сохранять введенные значения;<br />3)изменим класс CUser, чтобы возвращать значения свойств;<br />4)выведем значения свойств в списке пользователей.<br /><br /><a href="http://dev.1c-bitrix.ru/community/blogs/cookbook/172.php">Подробнее...</a>]]></description>
      <link>http://dev.1c-bitrix.ru/community/blogs/cookbook/172.php</link>
      <guid>http://dev.1c-bitrix.ru/community/blogs/cookbook/172.php</guid>
      <pubDate>Fri, 06 Jul 2007 12:30:30 +0400</pubDate>
    </item>

  </channel>
</rss>