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

<rss version="2.0">
 <channel>
	<title>Сообщения блогов сайта  "Рекламное Агентство Гермес" (ra-germes.ru)</title>
	<description>Сообщения блогов сайта  "Рекламное Агентство Гермес" (ra-germes.ru)</description>
	<link>http://ra-germes.ru</link>
	<language>ru</language>
	<docs>http://backend.userland.com/rss2</docs>
	<pubDate>Fri, 24 Apr 2026 16:36:02 +0300</pubDate>

    <item>
      <title>Андрей Чурсин: Не покупайте решения Аспро</title>
      <description><![CDATA[<p><span class="bx-font" style="font-size:16pt; line-height: normal;">Итак, меня реально бомбит!</span></p><p>Вместо того чтобы делать качественные и продуманные решения, партнёр Битрикс и их &quot;лидер по продажам&quot; Aspro выпускает такой код, что, как профессиональный Битрикс-разработчик, я <B>никому и никогда не порекомендую продукты Аспро</B>.</p><p>Кто-то скажет: &quot;Ты просто не умеешь работать с решениями Aspro&quot;. Ну уж нет – разбираться <B>в этой каше кода</B>, честно, удовольствие ниже среднего. Понять, что и откуда подключается: где модули Aspro, где PHP напрямую, где стандартные механизмы Bitrix – это просто ад. Почему разработчики не собрали всё в нормальный компонент? Загадка. И, конечно, никто не объяснит, что им помешало.</p><p>Ведь в Битрикс можно спокойно писать компоненты любой сложности, делать к ним удобные шаблоны... Но нет. В Aspro, например, решили, что для стандартного bitrix:catalog вся их тяжеленная логика должна жить где-то между строк. Работает? Да, работает. Стоит ли этих денег? Сомнительно. <br />&quot;Аспро: Премьер&quot; стоит ~2000 евро вы получаете строго ограниченный шаблон, внести изменения в который сможет разве что избранный круг специалистов – и за дополнительную плату, само собой.</p><p>И, конечно, никакой гарантии, что обновления Aspro или самого Битрикса не похоронят все ваши доработки, никто не даст.</p><p>Не разубедил? Ну что ж, пробуйте – но потом не говорите, что вас не предупреждали...</p><br /><a href="http://ra-germes.ru/blog/bitrix-develop/ne-pokupayte-resheniya-aspro/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/ne-pokupayte-resheniya-aspro/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/ne-pokupayte-resheniya-aspro/</guid>
      <pubDate>Wed, 23 Apr 2025 16:17:32 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Как скачать файл runComponentAction</title>
      <description><![CDATA[PHP
====code====
<pre>/**
 * Экспортирует данные в файл
 * @param int $id
 * @param string $type
 * @param null|array $params
 * @return null|BFile
 */
public function exportAction(int $id, string $type, ?array $params = &#91;&#93;): ?BFile
{
&nbsp;&nbsp;&nbsp;try {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $file = &#92;Bitrix&#92;Main&#92;Engine&#92;Response&#92;BFile::createByFileId(985);
&nbsp;&nbsp;&nbsp;} catch (&#92;Throwable $th) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&#62;addError(new Error($th-&#62;getMessage(), $th-&#62;getCode()));
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;return $file;
}
</pre>
=============
JS
====code====
<pre>BX.ajax.runComponentAction('company:sale.basket.detail', 'export', { 
&nbsp;&nbsp; mode: 'ajax',
&nbsp;&nbsp; data: {id, type},
&nbsp;&nbsp; method: 'POST',
})
?.then(response =&#62; {
&nbsp;&nbsp; if (response.status === 'success' &#38;&#38; response.data?.url) {
&nbsp;&nbsp;&nbsp;&nbsp; window.location.href = response.data.url;
&nbsp;&nbsp; }
})
.catch(response =&#62; {...})</pre>
=============<br /><a href="http://ra-germes.ru/blog/bitrix-develop/286/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/286/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/286/</guid>
      <pubDate>Thu, 12 Oct 2023 14:55:07 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Как скачать сгенерированный файл runComponentAction</title>
      <description><![CDATA[PHP
====code====
<pre>/**
 * Экспортирует данные в файл
 * @param int $id
 * @param string $type
 * @param null|array $params
 * @return null|BFile
 */
public function exportAction(int $id, string $type, ?array $params = &#91;&#93;): ?BFile
{
&nbsp;&nbsp;&nbsp;try {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pFilename = &#92;TEMP_DIR . '/' . 'item.xls';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#92;file_put_contents($pFilename, $data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $arFile = &#92;CFile::MakeFileArray($pFilename, false, true);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $file = new BFile($arFile);
&nbsp;&nbsp;&nbsp;} catch (&#92;Throwable $th) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&#62;addError(new Error($th-&#62;getMessage(), $th-&#62;getCode()));
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;return $file;
}
</pre>
=============
JS
====code====
<pre>BX.ajax.runComponentAction('company:sale.basket.detail', 'export', { 
&nbsp;&nbsp; mode: 'ajax',
&nbsp;&nbsp; data: {id, type},
&nbsp;&nbsp; method: 'POST',
})
?.then(response =&#62; {
&nbsp;&nbsp; if (response.status === 'success' &#38;&#38; response.data?.url) {
&nbsp;&nbsp;&nbsp;&nbsp; window.location.href = response.data.url;
&nbsp;&nbsp; }
})
.catch(response =&#62; {...})</pre>
=============<br /><a href="http://ra-germes.ru/blog/bitrix-develop/287/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/287/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/287/</guid>
      <pubDate>Thu, 12 Oct 2023 14:55:07 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Как загрузить файл runComponentAction</title>
      <description><![CDATA[PHP
====code====
<pre>/**
 * Импортируем файл 
 * @param array $data
 * @param null|array $params
 * @return array
 */
public function importAction(array $data, ?array $params = &#91;&#93;): array
{
&nbsp;&nbsp;&nbsp;try {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... 
&nbsp;&nbsp;&nbsp;} catch (&#92;Throwable $th) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&#62;addError(new Error($th-&#62;getMessage(), $th-&#62;getCode()));
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;return $file;
}
</pre>
=============
JS
====code====
<pre>const data = document.getElementById();
// data = 

BX.ajax.runComponentAction('company:sale.basket.detail', 'import', { 
&nbsp;&nbsp; mode: 'ajax',
&nbsp;&nbsp; data: Default,
})
?.then(response =&#62; {...})
.catch(response =&#62; {...})</pre>
=============<br /><a href="http://ra-germes.ru/blog/bitrix-develop/kak-zagruzit-fayl-runcomponentaction/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/kak-zagruzit-fayl-runcomponentaction/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/kak-zagruzit-fayl-runcomponentaction/</guid>
      <pubDate>Thu, 12 Oct 2023 14:55:07 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Новая документация по Bitrix ui.grid</title>
      <description><![CDATA[Finally!<br />Завезли новую документацию по гридам в БУС:<br /><noindex><a href="https://dev.1c-bitrix.ru/api_d7/bitrix/main/systemcomponents/gridandfilter/mainuigrid/index.php" target="_blank" rel="nofollow">https://dev.1c-bitrix.ru/api_d7/bitrix/main/systemcomponents/gridandfilter/mainuigrid/index.php</a></noindex><br /><br />Если там не понятно - спрашивайте тут, мы активно используем гриды на проектах!<br /><a href="http://ra-germes.ru/blog/bitrix-develop/novaya-dokumentatsiya-po-bitrix-uigrid/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/novaya-dokumentatsiya-po-bitrix-uigrid/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/novaya-dokumentatsiya-po-bitrix-uigrid/</guid>
      <pubDate>Mon, 21 Aug 2023 18:44:02 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Перевод массива меню в многомерный</title>
      <description><![CDATA[Перевод массива меню в многомерный по полям DEPTH_LEVEL LEFT_MARGIN RIGHT_MARGIN<br /><br />Вот пример:<br />
====code====
<pre>$arResult&#91;'SECTIONS'&#93; = &#91;
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test1', 'DEPTH_LEVEL' =&#62; 1, 'LEFT_MARGIN' =&#62; 1, 'RIGHT_MARGIN' =&#62; 14&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test2', 'DEPTH_LEVEL' =&#62; 2, 'LEFT_MARGIN' =&#62; 2, 'RIGHT_MARGIN' =&#62; 5&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test3', 'DEPTH_LEVEL' =&#62; 2, 'LEFT_MARGIN' =&#62; 6, 'RIGHT_MARGIN' =&#62; 13&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test4', 'DEPTH_LEVEL' =&#62; 3, 'LEFT_MARGIN' =&#62; 7, 'RIGHT_MARGIN' =&#62; 12&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test5', 'DEPTH_LEVEL' =&#62; 3, 'LEFT_MARGIN' =&#62; 8, 'RIGHT_MARGIN' =&#62; 11&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test6', 'DEPTH_LEVEL' =&#62; 3, 'LEFT_MARGIN' =&#62; 9, 'RIGHT_MARGIN' =&#62; 10&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;'NAME' =&#62; 'test7', 'DEPTH_LEVEL' =&#62; 2, 'LEFT_MARGIN' =&#62; 14, 'RIGHT_MARGIN' =&#62; 15&#93;,
&#93;;

function buildTree($items, $left = 1, $right = PHP_INT_MAX, $depth = 1): array
{
&nbsp;&nbsp;&nbsp;&nbsp;$outputArray = &#91;&#93;;
&nbsp;&nbsp;&nbsp;&nbsp;foreach ($items as $item) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($item&#91;'LEFT_MARGIN'&#93; &#62; $left &#38;&#38; $item&#91;'RIGHT_MARGIN'&#93; &#60; $right &#38;&#38; $item&#91;'DEPTH_LEVEL'&#93; == $depth) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$item&#91;'ITEMS'&#93; = buildTree($items, $item&#91;'LEFT_MARGIN'&#93;, $item&#91;'RIGHT_MARGIN'&#93;, $item&#91;'DEPTH_LEVEL'&#93; + 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$outputArray&#91;&#93; = $item;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return $outputArray;
}

$arResult&#91;'SECTIONS'&#93; = buildTree($arResult&#91;'SECTIONS'&#93;);</pre>
=============<br /><a href="http://ra-germes.ru/blog/bitrix-develop/perevod-massiva-menyu-v-mnogomernyy/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/perevod-massiva-menyu-v-mnogomernyy/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/perevod-massiva-menyu-v-mnogomernyy/</guid>
      <pubDate>Mon, 21 Aug 2023 18:44:02 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Bitrix GetCurPage to getRequestedPageDirectory D7</title>
      <description><![CDATA[<span class="bx-font" style="font-size:14pt; line-height: normal;">Получить путь текущий страницы БЕЗ index.php</span><br />Старое ядро:
====code====
<pre>$APPLICATION-&#62;GetCurPage();</pre>
=============
Новое ядро:
====code====
<pre>&#92;Bitrix&#92;Main&#92;Context::getCurrent()-&#62;getRequest()-&#62;getRequestedPageDirectory();</pre>
=============
<span class="bx-font" style="font-size:14pt; line-height: normal;">Получить путь текущий страницы с index.php<br /></span>Старое ядро:<br />
====code====
<pre>$APPLICATION-&#62;GetCurPage(true);</pre>
=============
Новое ядро:
====code====
<pre>&#92;Bitrix&#92;Main&#92;Context::getCurrent()-&#62;getRequest()-&#62;getRequestedPage();</pre>
=============<br /><a href="http://ra-germes.ru/blog/bitrix-develop/bitrix-getcurpage-to-getrequestedpagedirectory-d7/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/bitrix-getcurpage-to-getrequestedpagedirectory-d7/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/bitrix-getcurpage-to-getrequestedpagedirectory-d7/</guid>
      <pubDate>Mon, 21 Aug 2023 18:44:02 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Рекурсивный поиск по содержимому файлов</title>
      <description><![CDATA[Рекурсивный поиск по содержимому файлов, может пригодиться для поиска зараженных файлов на проекте:
====code====
<pre>$ find ./ -type f -name "*.php" -exec grep -li 'eval(' {} &#92;;</pre>
=============
где:<br /><ul><li><B>./</B> - путь поиска;<br /><li><B>eval(</B> - строка поиска в файлах;<br /><li><B>*.php</B> - регулярное выражение для фильтра именах файлов;<br /></ul><br /><a href="http://ra-germes.ru/blog/bitrix-develop/282/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/282/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/282/</guid>
      <pubDate>Wed, 01 Mar 2023 16:55:47 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: ORM ExpressionField делаем вычисления для объектов</title>
      <description><![CDATA[Почему-то у меня есть такая идея что все объекты должны быть максимально готовы сразу после извлечения из БД. Для реализации различной логики объекта мы можем воспользоваться виртуальным полем типа ExpressionField<br />Например одним запросом MyOrmTable::getList(&#91;&#39;select&#39; =&gt; &#91;&#39;*&#39;, &#39;RELATED_ITEMS&#39;&#93;&#93;)-&gt;fetchObject() мы можем получить и искомый объект и значение в поле RELATED_ITEMS любого типа!<br /><br />Пример описания поля ORM сущности:<br />
====code====
<pre>(new ExpressionField(
&nbsp;&nbsp;&nbsp;&nbsp;'ANALOGS',
&nbsp;&nbsp;&nbsp;&nbsp;'%s',
&nbsp;&nbsp;&nbsp;&nbsp;array('PRODUCT_ID'),
&nbsp;&nbsp;&nbsp;&nbsp;array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'data_type' =&#62; '&#92;Bitrix&#92;Main&#92;ORM&#92;Fields&#92;ArrayField',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' =&#62; Loc::getMessage('CART_PRODUCT_ANALOGS'),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'fetch_data_modification' =&#62; function () {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function ($value, $query, $data, $alias) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($value) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value = static::getAnalogsFromIblock($value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;)
)),

</pre>
=============
Если есть вопросы или комментарии - прошу не стесняться!<br /><a href="http://ra-germes.ru/blog/bitrix-develop/orm-expressionfield-delaem-vychisleniya-dlya-obektov/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/orm-expressionfield-delaem-vychisleniya-dlya-obektov/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/orm-expressionfield-delaem-vychisleniya-dlya-obektov/</guid>
      <pubDate>Tue, 13 Sep 2022 15:27:36 +0300</pubDate>
    </item>

    <item>
      <title>Андрей Чурсин: Обновление Bitrix Эксперт</title>
      <description><![CDATA[На днях пришёл запрос на продление БУС лицензии &quot;Эксперт&quot;, пришлось выяснять, что это за архивный тип лицензии... <br />Выяснилось, что БУС лицензии &quot;Эксперт&quot; сопоставим с БУС &quot;Стандарт&quot; по ценам и доступным модулям.<br /><br />Редакция &quot;Эксперт&quot; больше, чем &quot;Малый Бизнес&quot;, но нет модуля &quot;Интернет магазин&quot;.<br />Редакция &quot;Стандарт&quot; не имеет таких модулей как &quot;E-mail маркетинг&quot;, &quot;Реклама&quot; и &quot;Веб-аналитика&quot; а так же в 2 раза уменьшается размер облачного бэкапа.<br />( сравнение актуальных редакций <noindex><a href="https://www.1c-bitrix.ru/products/cms/license.php" target="_blank" rel="nofollow">https://www.1c-bitrix.ru/products/cms/license.php</a></noindex> )<br /><br />====quote====<br />Если переходить на редакцию &quot;Малый бизнес&quot;:<br />- стоимость перехода 20 000 руб.<br />- стоимость продления 8 975 руб.<br />понизить до редакции &quot;Стандарт&quot; (подписать документ &quot;&quot; и отправить в Битрикс), а потом покупать переход + продление<br />=============<br /><br /><br />====quote====<br />Если переходить на младшую редакцию &quot;Стандарт&quot;:<br />- стоимость перехода 0 руб.<br />- стоимость продления 3 975 руб.<br />понизить до редакции &quot;Стандарт&quot; (подписать документ и отправить в Битрикс),<br />=============<br /><br /><a href="http://ra-germes.ru/blog/bitrix-develop/279/">Подробнее...</a>]]></description>
      <link>http://ra-germes.ru/blog/bitrix-develop/279/</link>
      <guid>http://ra-germes.ru/blog/bitrix-develop/279/</guid>
      <pubDate>Mon, 25 Jul 2022 12:34:07 +0300</pubDate>
    </item>

  </channel>
</rss>