<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0">
  <channel>
    <pubDate>Fri, 10 Apr 2026 10:56:32 +0300</pubDate>
    <generator>HostCMS</generator>
    <title>Блог</title>
    <description></description>
    <link>https://syrbek.ru/blog/</link>
    <image>
      <url>http://syrbek.ru/images/logo.png</url>
      <title>Блог</title>
      <link>http://syrbek.ru/</link>
    </image>
    <yandex:logo>http://syrbek.ru/images/logo.png</yandex:logo>
    <yandex:logo type="square">http://syrbek.ru/images/logo.png</yandex:logo>
    <turbo:cms_plugin>E002780CE3D29DFF362D7A37943187B5</turbo:cms_plugin>
    <item turbo="true">
      <pubDate>Thu, 12 Feb 2026 09:38:44 +0300</pubDate>
      <title>Современный формат телефона Bootstrap 5</title>
      <description>Во многих сайтах встречаются красивые и удобные форматы телефона. Например выбираешь из списка страну и формат номера телефона в поле ввода меняется по маске соответсвенно. Отображение флагов стран. Решил разобраться как это делается для Веб страниц и поделиться.&#13;
</description>
      <yandex:full-text>&lt;p&gt;Во многих сайтах встречаются красивые и удобные форматы телефона. Например выбираешь из списка страну и формат номера телефона в поле ввода меняется по маске соответсвенно. Отображение флагов стран. Решил разобраться как это делается для Веб страниц и поделиться.&lt;/p&gt;&#13;
&lt;p&gt;&lt;img src="/upload-files/bootstrap-phones.png" width="700" alt=""&gt;&lt;/p&gt;&#13;
&lt;p&gt;Использовал CDN - Bootstrap 5&lt;/p&gt;&#13;
&lt;pre class="line-numbers language-css"&gt;&lt;!-- Стили --&gt;&#13;
&lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous"&gt;&#13;
&lt;!-- Скрипты --&gt;&#13;
&lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"&gt;&lt;/script&gt;&lt;/pre&gt;&#13;
&lt;p&gt;Элементы в контейнере:&lt;/p&gt;&#13;
&lt;pre class="language-markup"&gt;&lt;div class="container"&gt;&#13;
    &lt;div class="row mt-5"&gt;&#13;
        &lt;div class="col-sm-6 mb-3 mb-sm-0"&gt;&#13;
            &lt;div class="card"&gt;&#13;
                &lt;div class="card-body"&gt;&#13;
                    &lt;h5 class="card-title"&gt;Телефон&lt;/h5&gt;&#13;
                    &lt;div class="input-group mb-3 form-drop"&gt;&#13;
                        &lt;button class="btn btn-outline-secondary dropdown-toggle js-form-drop-toggle js-dropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false"&gt;&#13;
                            &lt;img src="/images/flag/flag-ru.png" class="" alt=""/&gt;&#13;
                        &lt;/button&gt;&#13;
                        &lt;ul class="dropdown-menu"&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+7" checked="checked"/&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-ru.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Россия &lt;span&gt;+7&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+375"/&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-by.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Беларусь &lt;span&gt;+375&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+7"/&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-kz.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Казахстан &lt;span&gt;+7&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                            &lt;li&gt;&lt;hr class="dropdown-divider"&gt;&lt;/li&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+996"&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&#13;
                                        &lt;img src="/images/flag/flag-kg.png" alt=""&gt;&#13;
                                    &lt;/span&gt;&#13;
                                    &lt;span class="form-drop__text"&gt;Кыргызстан &lt;span&gt;+996&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+998"&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&#13;
                                        &lt;img src="/images/flag/flag-uz.png" alt=""&gt;&#13;
                                    &lt;/span&gt;&#13;
                                    &lt;span class="form-drop__text"&gt;Узбекистан &lt;span&gt;+998&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+992"&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&#13;
                                        &lt;img src="/images/flag/flag-tj.png" alt=""&gt;&#13;
                                    &lt;/span&gt;&#13;
                                    &lt;span class="form-drop__text"&gt;Таджикистан &lt;span&gt;+992&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                            &lt;li&gt;&#13;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;&#13;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+994"/&gt;&#13;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-az.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Азербайджан &lt;span&gt;+994&lt;/span&gt;&lt;/span&gt;&#13;
                                &lt;/label&gt;&#13;
                            &lt;/li&gt;&#13;
                        &lt;/ul&gt;&#13;
                        &lt;input type="text" class="form-control js-code-tel" aria-label="Text input with dropdown button"&gt;&#13;
                    &lt;/div&gt;&#13;
                &lt;/div&gt;&#13;
            &lt;/div&gt;&#13;
        &lt;/div&gt;&#13;
    &lt;/div&gt;&#13;
&lt;/div&gt;&lt;/pre&gt;&#13;
&lt;p&gt;CDN Библиотека для маски телефона &lt;/p&gt;&#13;
&lt;pre class="language-markup"&gt; &lt;script src="https://unpkg.com/imask"&gt;&lt;/script&gt;&lt;/pre&gt;&#13;
&lt;p&gt;Стилистика для элемента dropdown-toggle&lt;/p&gt;&#13;
&lt;pre class="language-css"&gt;.js-dropdown {&#13;
    display: flex;&#13;
    justify-content: center;&#13;
    align-items: center;&#13;
    user-select: none;&#13;
    height: 40px;&#13;
}&#13;
&#13;
.js-form-drop-toggle img {&#13;
    max-width: 100%;&#13;
    max-height: 100%;&#13;
}&#13;
&#13;
.dropdown-item input {&#13;
    -webkit-appearance: none;&#13;
    -moz-appearance: none;&#13;
    appearance: none;&#13;
}&#13;
&#13;
.form-drop__pic {&#13;
    margin-right: 10px;&#13;
    width: 30px;&#13;
    display: flex;&#13;
}&#13;
&#13;
.form-drop__pic img {&#13;
    max-width: 100%;&#13;
    max-height: 100%;&#13;
}&#13;
&#13;
.form-drop__text {&#13;
    display: block;&#13;
    flex: 1;&#13;
    color: #000;&#13;
    font-size: 14px;&#13;
    line-height: 1;&#13;
    font-weight: 400;&#13;
}&#13;
&#13;
.form-drop__text span {&#13;
    color: #B5BBC2;&#13;
}&#13;
&#13;
.form-drop .dropdown-menu &gt; li &gt; label {&#13;
    cursor: pointer;&#13;
}&lt;/pre&gt;&#13;
&lt;p&gt;Javascript код:&lt;/p&gt;&#13;
&lt;pre class="language-javascript"&gt;let maskCodeTelArray = {};&#13;
&#13;
function initMaskCode(e, t, n = 16) {&#13;
    let i = null;&#13;
    void 0 === e.dataset.tmpid ? (e.dataset.tmpid = Math.random().toString(36).substr(2, 9), maskCodeTelArray[e.dataset.tmpid] = {&#13;
        element: e,&#13;
        maskCode: null&#13;
    }, i = maskCodeTelArray[e.dataset.tmpid]) : i = maskCodeTelArray[e.dataset.tmpid], void 0 === e.dataset.minlength &amp;&amp; e.setAttribute("minlength", n), i.maskCode &amp;&amp; (i.maskCode.destroy(), i.maskCode = null), i.maskCode = "+7" === t ? new IMask(e, {&#13;
        mask: "+{7} 000 000-00-00",&#13;
        prepare: function (e, t) {&#13;
            return "8" === e &amp;&amp; "" === t.value ? "" : e&#13;
        }&#13;
    }) : new IMask(e, {mask: `{${t}} 000 000-00-00`})&#13;
}&#13;
&#13;
function setMaskOnTel(e, t = !0, n) {&#13;
    const i = e.value, r = e.parentNode, s = r.querySelector("img"), o = r.closest(".form-drop"),&#13;
        a = o.querySelector(".js-code-tel");&#13;
    console.log(s.getAttribute("src"));&#13;
    o.querySelector(".js-form-drop-toggle img").setAttribute("src", s.getAttribute("src"));&#13;
    const l = a.value.replace(/[^ ]+ /, "");&#13;
    a.value = i + " " + l, 2 === i.length ? initMaskCode(a, i, 16) : 4 === i.length ? initMaskCode(a, i, 18) : initMaskCode(a, i), t &amp;&amp; a.focus()&#13;
}&#13;
&#13;
function checkDefMaskPhone() {&#13;
    $(".js-form-drop-control:checked").each((function () {&#13;
        console.log("checkDefMaskPhone other", this), setMaskOnTel(this, !1, !0)&#13;
    }))&#13;
}&#13;
&#13;
$(document).on("change", ".js-form-drop-control", (function () {&#13;
    setMaskOnTel(this)&#13;
}))&#13;
&#13;
checkDefMaskPhone();&lt;/pre&gt;&#13;
&lt;p&gt;&lt;img src="/upload-files/bootstrap-phones.png" width="700" alt=""&gt;&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/sovremennyj-format-telefona-bootstrap-5/</guid>
      <link>https://syrbek.ru/blog/sovremennyj-format-telefona-bootstrap-5/</link>
      <turbo:content><![CDATA[
<header>
<h1>Современный формат телефона Bootstrap 5</h1>
</header>
<p>Во многих сайтах встречаются красивые и удобные форматы телефона. Например выбираешь из списка страну и формат номера телефона в поле ввода меняется по маске соответсвенно. Отображение флагов стран. Решил разобраться как это делается для Веб страниц и поделиться.</p>
<p><img src="/upload-files/bootstrap-phones.png" width="700" alt=""></p>
<p>Использовал CDN - Bootstrap 5</p>
<pre class="line-numbers language-css">&lt;!-- Стили --&gt;
&lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous"&gt;
&lt;!-- Скрипты --&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"&gt;&lt;/script&gt;</pre>
<p>Элементы в контейнере:</p>
<pre class="language-markup">&lt;div class="container"&gt;
    &lt;div class="row mt-5"&gt;
        &lt;div class="col-sm-6 mb-3 mb-sm-0"&gt;
            &lt;div class="card"&gt;
                &lt;div class="card-body"&gt;
                    &lt;h5 class="card-title"&gt;Телефон&lt;/h5&gt;
                    &lt;div class="input-group mb-3 form-drop"&gt;
                        &lt;button class="btn btn-outline-secondary dropdown-toggle js-form-drop-toggle js-dropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false"&gt;
                            &lt;img src="/images/flag/flag-ru.png" class="" alt=""/&gt;
                        &lt;/button&gt;
                        &lt;ul class="dropdown-menu"&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+7" checked="checked"/&gt;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-ru.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Россия &lt;span&gt;+7&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+375"/&gt;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-by.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Беларусь &lt;span&gt;+375&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+7"/&gt;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-kz.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Казахстан &lt;span&gt;+7&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                            &lt;li&gt;&lt;hr class="dropdown-divider"&gt;&lt;/li&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+996"&gt;
                                    &lt;span class="form-drop__pic"&gt;
                                        &lt;img src="/images/flag/flag-kg.png" alt=""&gt;
                                    &lt;/span&gt;
                                    &lt;span class="form-drop__text"&gt;Кыргызстан &lt;span&gt;+996&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+998"&gt;
                                    &lt;span class="form-drop__pic"&gt;
                                        &lt;img src="/images/flag/flag-uz.png" alt=""&gt;
                                    &lt;/span&gt;
                                    &lt;span class="form-drop__text"&gt;Узбекистан &lt;span&gt;+998&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+992"&gt;
                                    &lt;span class="form-drop__pic"&gt;
                                        &lt;img src="/images/flag/flag-tj.png" alt=""&gt;
                                    &lt;/span&gt;
                                    &lt;span class="form-drop__text"&gt;Таджикистан &lt;span&gt;+992&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                            &lt;li&gt;
                                &lt;label class="dropdown-item d-flex align-items-center"&gt;
                                    &lt;input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+994"/&gt;
                                    &lt;span class="form-drop__pic"&gt;&lt;img src="/images/flag/flag-az.png" alt=""/&gt;&lt;/span&gt;&lt;span class="form-drop__text"&gt;Азербайджан &lt;span&gt;+994&lt;/span&gt;&lt;/span&gt;
                                &lt;/label&gt;
                            &lt;/li&gt;
                        &lt;/ul&gt;
                        &lt;input type="text" class="form-control js-code-tel" aria-label="Text input with dropdown button"&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>CDN Библиотека для маски телефона </p>
<pre class="language-markup"> &lt;script src="https://unpkg.com/imask"&gt;&lt;/script&gt;</pre>
<p>Стилистика для элемента dropdown-toggle</p>
<pre class="language-css">.js-dropdown {
    display: flex;
    justify-content: center;
    align-items: center;
    user-select: none;
    height: 40px;
}

.js-form-drop-toggle img {
    max-width: 100%;
    max-height: 100%;
}

.dropdown-item input {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

.form-drop__pic {
    margin-right: 10px;
    width: 30px;
    display: flex;
}

.form-drop__pic img {
    max-width: 100%;
    max-height: 100%;
}

.form-drop__text {
    display: block;
    flex: 1;
    color: #000;
    font-size: 14px;
    line-height: 1;
    font-weight: 400;
}

.form-drop__text span {
    color: #B5BBC2;
}

.form-drop .dropdown-menu &gt; li &gt; label {
    cursor: pointer;
}</pre>
<p>Javascript код:</p>
<pre class="language-javascript">let maskCodeTelArray = {};

function initMaskCode(e, t, n = 16) {
    let i = null;
    void 0 === e.dataset.tmpid ? (e.dataset.tmpid = Math.random().toString(36).substr(2, 9), maskCodeTelArray[e.dataset.tmpid] = {
        element: e,
        maskCode: null
    }, i = maskCodeTelArray[e.dataset.tmpid]) : i = maskCodeTelArray[e.dataset.tmpid], void 0 === e.dataset.minlength &amp;&amp; e.setAttribute("minlength", n), i.maskCode &amp;&amp; (i.maskCode.destroy(), i.maskCode = null), i.maskCode = "+7" === t ? new IMask(e, {
        mask: "+{7} 000 000-00-00",
        prepare: function (e, t) {
            return "8" === e &amp;&amp; "" === t.value ? "" : e
        }
    }) : new IMask(e, {mask: `{${t}} 000 000-00-00`})
}

function setMaskOnTel(e, t = !0, n) {
    const i = e.value, r = e.parentNode, s = r.querySelector("img"), o = r.closest(".form-drop"),
        a = o.querySelector(".js-code-tel");
    console.log(s.getAttribute("src"));
    o.querySelector(".js-form-drop-toggle img").setAttribute("src", s.getAttribute("src"));
    const l = a.value.replace(/[^ ]+ /, "");
    a.value = i + " " + l, 2 === i.length ? initMaskCode(a, i, 16) : 4 === i.length ? initMaskCode(a, i, 18) : initMaskCode(a, i), t &amp;&amp; a.focus()
}

function checkDefMaskPhone() {
    $(".js-form-drop-control:checked").each((function () {
        console.log("checkDefMaskPhone other", this), setMaskOnTel(this, !1, !0)
    }))
}

$(document).on("change", ".js-form-drop-control", (function () {
    setMaskOnTel(this)
}))

checkDefMaskPhone();</pre>
<p><img src="/upload-files/bootstrap-phones.png" width="700" alt=""></p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Wed, 22 Oct 2025 10:07:16 +0300</pubDate>
      <title>Ошибка 504 Gateway Time-out при выгрузке из 1С</title>
      <description>Ошибка 504 Gateway Timeout при экспорте товаров в 1С Битрикс встречается довольно часто. Ошибка 504 Gateway Timeout связана с тем, что по умолчанию сервер ограничивает выполнение PHP скриптов 60 секундами, а если у Вас, допустим 15 или 20 тысяч товаров, то этого времени не хватит.</description>
      <yandex:full-text>&lt;h2&gt;Настройки PHP в ISPmanager 6&lt;/h2&gt;&#13;
&lt;p&gt;&lt;img src="/uploaded_files/isp_set_php.png" alt=""&gt;&lt;/p&gt;&#13;
&lt;p&gt;«Время выполнения». При количестве товаров около 20 тысяч, ставьте 600, что будет соответствовать 10 минутам. Этого времени должно хватить для выполнения скрипта. Изменяйте значение, и нажимайте «Ок» для сохранения настроек.&lt;/p&gt;&#13;
&lt;p&gt;&lt;img src="/uploaded_files/isp_set_php_opcache.png" alt=""&gt;&lt;/p&gt;&#13;
&lt;p&gt;Здесь нам надо поменять значение 10000 на 100000 (сто тысяч). Чтобы это сделать, просто кликните дважды мышкой по строчке с переменной и поменяйте значение.&lt;/p&gt;&#13;
&lt;p&gt;Если у вас сервер VPS/VDS то меняем конфигурацию nginx.&lt;/p&gt;&#13;
&lt;p&gt;Заходим в /etc/nginx/nginx.conf&lt;br&gt;Находим директиву http {}, и уже в ней пишем:&lt;/p&gt;&#13;
&lt;pre class="language-markup"&gt;http {&#13;
    # ... (существующие директивы)&#13;
&#13;
    proxy_connect_timeout       600;&#13;
    proxy_send_timeout          600;&#13;
    proxy_read_timeout          600;&#13;
    send_timeout                600;&#13;
&#13;
    # ... (существующие директивы)&#13;
}&lt;/pre&gt;&#13;
&lt;p&gt;Но обязательно проверяйте до перезагрузки корректность конфиг файла, иначе проблем не оберетесь: &lt;/p&gt;&#13;
&lt;pre class="language-markup"&gt;nginx -c /etc/nginx/nginx.conf -t&lt;/pre&gt;&#13;
&lt;p&gt;Перезапустите Nginx, например в Debian:&lt;/p&gt;&#13;
&lt;pre class="language-markup"&gt;/etc/init.d/nginx restart&lt;/pre&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/exchange-1c/</guid>
      <link>https://syrbek.ru/blog/exchange-1c/</link>
      <turbo:content><![CDATA[
<header>
<h1>Ошибка 504 Gateway Time-out при выгрузке из 1С</h1>
</header>
<h2>Настройки PHP в ISPmanager 6</h2>
<p><img src="/uploaded_files/isp_set_php.png" alt=""></p>
<p>«Время выполнения». При количестве товаров около 20 тысяч, ставьте 600, что будет соответствовать 10 минутам. Этого времени должно хватить для выполнения скрипта. Изменяйте значение, и нажимайте «Ок» для сохранения настроек.</p>
<p><img src="/uploaded_files/isp_set_php_opcache.png" alt=""></p>
<p>Здесь нам надо поменять значение 10000 на 100000 (сто тысяч). Чтобы это сделать, просто кликните дважды мышкой по строчке с переменной и поменяйте значение.</p>
<p>Если у вас сервер VPS/VDS то меняем конфигурацию nginx.</p>
<p>Заходим в /etc/nginx/nginx.conf<br>Находим директиву http {}, и уже в ней пишем:</p>
<pre class="language-markup">http {
    # ... (существующие директивы)

    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;

    # ... (существующие директивы)
}</pre>
<p>Но обязательно проверяйте до перезагрузки корректность конфиг файла, иначе проблем не оберетесь: </p>
<pre class="language-markup">nginx -c /etc/nginx/nginx.conf -t</pre>
<p>Перезапустите Nginx, например в Debian:</p>
<pre class="language-markup">/etc/init.d/nginx restart</pre>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Wed, 22 Oct 2025 10:01:12 +0300</pubDate>
      <title>MiniTool Partition Wizard</title>
      <description>MiniTool Partition Wizard – это удобное программное решение для работы с разделами: слияние / расщепление, копирование, изменение размеров, создание, удаление, форматирование и даже безопасное стирание. С помощью данного продукта вы с легкостью можете обновить или преобразовать жесткий диск.</description>
      <yandex:full-text>&lt;h2&gt;Функционал Minitool Partition Wizard&lt;/h2&gt;&#13;
&lt;p&gt;Одна из главных особенностей программы – функция Disk Map. Она визуализирует структуру жесткого диска, что облегчает работу с ним.&lt;/p&gt;&#13;
&lt;p&gt;У Minitool Partition Wizard огромное количество возможностей:&lt;/p&gt;&#13;
&lt;ul&gt;&#13;
&lt;li&gt;&lt;strong&gt;Создание разделов&lt;/strong&gt;. Если на диске есть свободное пространство, можно создать новый раздел. Пользователь выбирает название, размер и файловую систему раздела.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Деление&lt;/strong&gt;. Уже готовые разделы можно поделить на несколько маленьких частей или освободить некоторое пространство.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Форматирование&lt;/strong&gt;. Minitool Partition Wizard позволяет очистить раздел, изменить его название и сменить файловую систему. Для полного удаления данных можно использовать инструмент затирания разделов.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Расширение разделов&lt;/strong&gt;. Если в какой-то области недостаточно места, можно расширить его за счет свободного пространства или других разделов. Пользователь сам решает откуда и сколько нужно отрезать.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Слияние&lt;/strong&gt;. Несколько разделов можно объединить в один, если они работают на основе одинаковой файловой системы.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Клонирование&lt;/strong&gt;. Minitool Partition Wizard копирует отдельные разделы и вставляет их в свободное пространство. Если на ПК установлен дополнительный накопитель, можно клонировать диск полностью.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Изменение параметров&lt;/strong&gt;. Пользователю дается возможность ставить на тома метки и менять буквы разделов. Также можно менять Type ID и параметры серийного номера.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Скрытие&lt;/strong&gt;. Minitool Partition Wizard позволяет скрыть диск или раздел из проводника ПК. Для этого надо удалить букву в интерфейсе программы. При желании раздел можно снова сделать видимым.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Диагностика&lt;/strong&gt;. Чтобы повысить быстродействие диска, можно провести анализ ошибок чтения и исправить их.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Переезд ОС&lt;/strong&gt;. Мастер миграции позволяет перенести операционную систему на другой SD или HDD диск.&lt;/li&gt;&#13;
&lt;li&gt;&lt;strong&gt;Конвертация&lt;/strong&gt;. Программа позволяет сменить файловую систему раздела с Fat на NTFS и наоборот. Также можно конвертировать базовые разделы в динамичные.&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;p&gt;&lt;img src="/uploaded_files/copy-partition-6.png" alt=""&gt;&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/minitool-partition-wizard/</guid>
      <link>https://syrbek.ru/blog/minitool-partition-wizard/</link>
      <turbo:content><![CDATA[
<header>
<h1>MiniTool Partition Wizard</h1>
</header>
<h2>Функционал Minitool Partition Wizard</h2>
<p>Одна из главных особенностей программы – функция Disk Map. Она визуализирует структуру жесткого диска, что облегчает работу с ним.</p>
<p>У Minitool Partition Wizard огромное количество возможностей:</p>
<ul>
<li><strong>Создание разделов</strong>. Если на диске есть свободное пространство, можно создать новый раздел. Пользователь выбирает название, размер и файловую систему раздела.</li>
<li><strong>Деление</strong>. Уже готовые разделы можно поделить на несколько маленьких частей или освободить некоторое пространство.</li>
<li><strong>Форматирование</strong>. Minitool Partition Wizard позволяет очистить раздел, изменить его название и сменить файловую систему. Для полного удаления данных можно использовать инструмент затирания разделов.</li>
<li><strong>Расширение разделов</strong>. Если в какой-то области недостаточно места, можно расширить его за счет свободного пространства или других разделов. Пользователь сам решает откуда и сколько нужно отрезать.</li>
<li><strong>Слияние</strong>. Несколько разделов можно объединить в один, если они работают на основе одинаковой файловой системы.</li>
<li><strong>Клонирование</strong>. Minitool Partition Wizard копирует отдельные разделы и вставляет их в свободное пространство. Если на ПК установлен дополнительный накопитель, можно клонировать диск полностью.</li>
<li><strong>Изменение параметров</strong>. Пользователю дается возможность ставить на тома метки и менять буквы разделов. Также можно менять Type ID и параметры серийного номера.</li>
<li><strong>Скрытие</strong>. Minitool Partition Wizard позволяет скрыть диск или раздел из проводника ПК. Для этого надо удалить букву в интерфейсе программы. При желании раздел можно снова сделать видимым.</li>
<li><strong>Диагностика</strong>. Чтобы повысить быстродействие диска, можно провести анализ ошибок чтения и исправить их.</li>
<li><strong>Переезд ОС</strong>. Мастер миграции позволяет перенести операционную систему на другой SD или HDD диск.</li>
<li><strong>Конвертация</strong>. Программа позволяет сменить файловую систему раздела с Fat на NTFS и наоборот. Также можно конвертировать базовые разделы в динамичные.</li>
</ul>
<p><img src="/uploaded_files/copy-partition-6.png" alt=""></p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Mon, 11 Aug 2025 11:18:32 +0300</pubDate>
      <title>Ошибка 2 "Не удается найти указанный файл" при запуске службы удаленного рабочего стола RDP в Windows 10</title>
      <description>Решение 2. Измените ServiceDLL&#13;
Еще одной возможной причиной этой проблемы может быть ServiceDLL служб удаленного рабочего стола, который может быть направлен на сторонний модуль, например, "%ProgramFiles%\RDP Wrapper\rdpwrap.dll" (известный как "RDP Wrapper"). Чтобы устранить ошибку удаленных служб рабочего стола (TermService) 126, выполните следующие действия:</description>
      <yandex:full-text>&lt;p&gt;Шаг 1. Запустите Regedit.exe, нажав &lt;strong&gt;WIN&lt;/strong&gt; &lt;strong&gt;R&lt;/strong&gt;, и введите "&lt;strong&gt;regedit&lt;/strong&gt;".&lt;/p&gt;&#13;
&lt;p class="align-center"&gt;&lt;img src="/upload-files/run-box-regedit.webp" alt="Окно выполнения Regedit " height="205" width="397" class="mg-responsive"&gt;&lt;/p&gt;&#13;
&lt;p&gt;Шаг 2. Перейдите по пути: &lt;strong&gt;HKEY_LOCAL_MACHINE&lt;/strong&gt; &gt; &lt;strong&gt;SYSTEM&lt;/strong&gt; &gt; &lt;strong&gt;CurrentControlSet&lt;/strong&gt; &gt; &lt;strong&gt;Services&lt;/strong&gt; &gt; &lt;strong&gt;TermService&lt;/strong&gt; &gt; &lt;strong&gt;Parameters&lt;/strong&gt;.&lt;/p&gt;&#13;
&lt;p&gt;Шаг 3. Дважды щелкните "&lt;strong&gt;ServiceDll&lt;/strong&gt;" и измените его данные на &lt;strong&gt;%SystemRoot%\System32\termsrv.dll&lt;/strong&gt;. Подтвердите, что тип значения является "REG_EXPAND_SZ", а не "REG_SZ".&lt;/p&gt;&#13;
&lt;p class="align-center"&gt;&lt;img src="/upload-files/servicedll.webp" alt="ServiceDLL" height="173" width="700" class="mg-responsive"&gt;&lt;/p&gt;&#13;
&lt;p&gt;Шаг 4. Если файл "ServiceDll" не находится по указанному пути, рассмотрите возможность копирования файла с функционального сервера с той же версией ОС и пакетом обновлений.&lt;/p&gt;&#13;
&lt;p&gt;Шаг 5. Продолжайте запуск службы, и она теперь должна запуститься без проблем.&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/oshibka-2-ne-udaetsya-najti-ukazannyj-fajl-pri-zapuske-sluzhby-udalennogo-rabochego-stola-rdp-v-windows-10/</guid>
      <link>https://syrbek.ru/blog/oshibka-2-ne-udaetsya-najti-ukazannyj-fajl-pri-zapuske-sluzhby-udalennogo-rabochego-stola-rdp-v-windows-10/</link>
      <turbo:content><![CDATA[
<header>
<h1>Ошибка 2 &quot;Не удается найти указанный файл&quot; при запуске службы удаленного рабочего стола RDP в Windows 10</h1>
</header>
<p>Шаг 1. Запустите Regedit.exe, нажав <strong>WIN</strong> <strong>R</strong>, и введите "<strong>regedit</strong>".</p>
<p class="align-center"><img src="/upload-files/run-box-regedit.webp" alt="Окно выполнения Regedit " height="205" width="397" class="mg-responsive"></p>
<p>Шаг 2. Перейдите по пути: <strong>HKEY_LOCAL_MACHINE</strong> &gt; <strong>SYSTEM</strong> &gt; <strong>CurrentControlSet</strong> &gt; <strong>Services</strong> &gt; <strong>TermService</strong> &gt; <strong>Parameters</strong>.</p>
<p>Шаг 3. Дважды щелкните "<strong>ServiceDll</strong>" и измените его данные на <strong>%SystemRoot%\System32\termsrv.dll</strong>. Подтвердите, что тип значения является "REG_EXPAND_SZ", а не "REG_SZ".</p>
<p class="align-center"><img src="/upload-files/servicedll.webp" alt="ServiceDLL" height="173" width="700" class="mg-responsive"></p>
<p>Шаг 4. Если файл "ServiceDll" не находится по указанному пути, рассмотрите возможность копирования файла с функционального сервера с той же версией ОС и пакетом обновлений.</p>
<p>Шаг 5. Продолжайте запуск службы, и она теперь должна запуститься без проблем.</p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Wed, 06 Aug 2025 11:37:44 +0300</pubDate>
      <title>iPhone 16 iOS экран при блокировке не выключается автоматически</title>
      <description>При блокировке экрана, сам экран затемняется но не полностью отключается. В чем причина? Почему остается затемненным но не черным экраном?</description>
      <yandex:full-text>&lt;h2&gt;Отображение экрана блокировки в активном состоянии с помощью функции «Экран всегда включен»&lt;/h2&gt;&#13;
&lt;p&gt;На поддерживаемых моделях при использовании функции «Экран всегда включен» затемненный экран блокировки будет всегда активен, даже если iPhone заблокирован. На затемненном экране можно просматривать важную информацию, например уведомления, дату, время и информацию из виджетов.&lt;/p&gt;&#13;
&lt;p&gt;Дисплей автоматически выключается, если iPhone лежит экраном вниз или его экран недоступен для просмотра, если рядом нет часов Apple Watch, объединенных с ним в пару, если включается функция CarPlay, если используется функция непрерывности для Камеры, если включен режим энергосбережения, если включен режим фокусирования «Сон» или если наступило время Вашего обычного отхода ко сну.&lt;/p&gt;&#13;
&lt;p&gt;Функция «Экран всегда включен» активна по умолчанию. Чтобы выключить эту функцию, откройте «Настройки»&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/iphone-16-ios-ekran-pri-blokirovke-ne-vyklyuchaetsya-avtomaticheski/</guid>
      <link>https://syrbek.ru/blog/iphone-16-ios-ekran-pri-blokirovke-ne-vyklyuchaetsya-avtomaticheski/</link>
      <turbo:content><![CDATA[
<header>
<h1>iPhone 16 iOS экран при блокировке не выключается автоматически</h1>
</header>
<h2>Отображение экрана блокировки в активном состоянии с помощью функции «Экран всегда включен»</h2>
<p>На поддерживаемых моделях при использовании функции «Экран всегда включен» затемненный экран блокировки будет всегда активен, даже если iPhone заблокирован. На затемненном экране можно просматривать важную информацию, например уведомления, дату, время и информацию из виджетов.</p>
<p>Дисплей автоматически выключается, если iPhone лежит экраном вниз или его экран недоступен для просмотра, если рядом нет часов Apple Watch, объединенных с ним в пару, если включается функция CarPlay, если используется функция непрерывности для Камеры, если включен режим энергосбережения, если включен режим фокусирования «Сон» или если наступило время Вашего обычного отхода ко сну.</p>
<p>Функция «Экран всегда включен» активна по умолчанию. Чтобы выключить эту функцию, откройте «Настройки»</p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Sun, 29 Sep 2024 09:40:52 +0300</pubDate>
      <title>Установка SASS (SCSS) настройка PhpStorm 2018.1.4 ошибка 'env: node: No such file or directory' macOS Monterey</title>
      <description>Автоматическая генерация css файлов из sass/scss&#13;
&#13;
Установка Node.js для macOS.&#13;
Установка SASS&#13;
Настройка PhpStorm&#13;
</description>
      <yandex:full-text>&lt;h2&gt;Подготовка&lt;/h2&gt;&#13;
&lt;p&gt;Если у вас установлена ​​старая версия Node.js, рекомендуется сначала удалить ее. Также убедитесь, что папки npm и npm-cache удалены. Для удаление выполните команду в консоле:&lt;/p&gt;&#13;
&lt;pre class="language-python"&gt;$ brew uninstall --force node&#13;
$ brew uninstall --force npm&lt;/pre&gt;&#13;
&lt;h2&gt;Установка Node.js для macOS.&lt;/h2&gt;&#13;
&lt;p&gt;Откройте &lt;a href="https://nodejs.org/en/download/package-manager" target="_blank" rel="noreferrer noopener nofollow"&gt;https://nodejs.org/en/download/package-manager&lt;/a&gt;, загрузите и установите последнюю версию для macOS.&lt;/p&gt;&#13;
&lt;h2&gt;Установите SASS&lt;/h2&gt;&#13;
&lt;p&gt;После установки Node.js откройте консоль macOS и выполните следующую команду:&lt;/p&gt;&#13;
&lt;pre class="language-c"&gt;$ node -v   &#13;
// v20.17.0&#13;
$ npm -v&#13;
// 10.8.2&lt;/pre&gt;&#13;
&lt;p&gt;Для установка Sass выполните команду в консоли:&lt;/p&gt;&#13;
&lt;pre class="language-cpp"&gt;npm install -g sass&lt;/pre&gt;&#13;
&lt;p&gt;После установки можно проверить версию&lt;/p&gt;&#13;
&lt;pre class="language-c"&gt;$ sass --version&#13;
// 1.79.4 &lt;/pre&gt;&#13;
&lt;p&gt;Необходимые установки выполнены. Теперь можно приступать к настройке PhpStorm. &lt;/p&gt;&#13;
&lt;p&gt;Теперь нам нужно настроить &lt;strong&gt;File Watcher&lt;/strong&gt; в PhpStorm.&lt;/p&gt;&#13;
&lt;p&gt;Перейдите в &lt;strong&gt;File &gt; Settings &gt; Tools &gt; File Watchers &gt; {нажать на + внизу слева} &gt; выбрать (SCSS or Sass)&lt;/strong&gt;&lt;strong&gt;. &lt;/strong&gt;Если вы не уверены, какой шаблон использовать, я бы порекомендовал SCSS.&lt;/p&gt;&#13;
&lt;div class="row"&gt;&#13;
&lt;div class="col-xs-12 col-sm-4"&gt;&lt;img class="img-responsive" src="/images/phpstorm_prefe.jpg" width="432" height="514" alt=""&gt;&lt;/div&gt;&#13;
&lt;div class="col-xs-12 col-sm-8"&gt;&lt;img class="img-responsive" src="/images/phpstorm_filewatchers.jpg" width="1384" height="807" alt=""&gt;&lt;/div&gt;&#13;
&lt;/div&gt;&#13;
&lt;p&gt;&lt;img class="img-responsive" src="/images/phpstorm_editwatchers.jpg" alt=""&gt;&lt;/p&gt;&#13;
&lt;p&gt;Если все настроено как выше то все будет работать. &lt;/p&gt;&#13;
&lt;p&gt;Установки обычно PhpStorm подтягивает автоматически. Бывают ситуации что приходится настраивать вручную если автоматически не применились настройки установки среды.&lt;/p&gt;&#13;
&lt;p&gt;В частности после установки и проверки синтаксиса sass/scss в PhpStorm бывают ошибки. Ошибка при компиляции scss в css например:&lt;/p&gt;&#13;
&lt;pre class="language-c"&gt;env: node: No such file or directory&#13;
Process finished with exit code 127&lt;/pre&gt;&#13;
&lt;p&gt;В ошибке пишется что не найден путь для запуска программы. &lt;/p&gt;&#13;
&lt;p&gt;Решение этой проблемы:&lt;/p&gt;&#13;
&lt;ol&gt;&#13;
&lt;li&gt;введите в свой терминал &lt;strong&gt;echo $PATH&lt;/strong&gt;&lt;/li&gt;&#13;
&lt;li&gt;скопируйте результат, он должен быть примерно таким /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&lt;/li&gt;&#13;
&lt;li&gt;Перейдите в &lt;strong&gt;Preferences &gt; Tools &gt; File Watchers&lt;/strong&gt;.&lt;/li&gt;&#13;
&lt;li&gt;Выберите SASS, нажмите «Изменить»&lt;/li&gt;&#13;
&lt;li&gt;Нажмите «Другие параметры» и «Переменные среды».&lt;/li&gt;&#13;
&lt;li&gt;Нажмите «+»&lt;/li&gt;&#13;
&lt;li&gt;Введите «PATH» в столбце «Имя».&lt;/li&gt;&#13;
&lt;li&gt;Вставьте скопированный текст в столбец «Значение» /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&lt;/li&gt;&#13;
&lt;li&gt;Нажмите Ok&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;p&gt;&lt;img class="img-responsive" src="/images/phpstorm_env_var.jpg" alt=""&gt;&lt;/p&gt;&#13;
&lt;p&gt;Все будет работать!&lt;/p&gt;&#13;
&lt;p&gt;Если возникнут проблемы с установкой или будут вопросы или пожелание, напишите пожалуйста мне. Постараюсь вам помочь.&lt;br&gt;Желаю всем творческих успехов!&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/ustanovka-sass-scss-nastrojka-phpstorm-202814-oshibka-env-node-no-such-file-or-directory/</guid>
      <link>https://syrbek.ru/blog/ustanovka-sass-scss-nastrojka-phpstorm-202814-oshibka-env-node-no-such-file-or-directory/</link>
      <turbo:content><![CDATA[
<header>
<h1>Установка SASS (SCSS) настройка PhpStorm 2018.1.4 ошибка 'env: node: No such file or directory' macOS Monterey</h1>
</header>
<h2>Подготовка</h2>
<p>Если у вас установлена ​​старая версия Node.js, рекомендуется сначала удалить ее. Также убедитесь, что папки npm и npm-cache удалены. Для удаление выполните команду в консоле:</p>
<pre class="language-python">$ brew uninstall --force node
$ brew uninstall --force npm</pre>
<h2>Установка Node.js для macOS.</h2>
<p>Откройте <a href="https://nodejs.org/en/download/package-manager" target="_blank" rel="noreferrer noopener nofollow">https://nodejs.org/en/download/package-manager</a>, загрузите и установите последнюю версию для macOS.</p>
<h2>Установите SASS</h2>
<p>После установки Node.js откройте консоль macOS и выполните следующую команду:</p>
<pre class="language-c">$ node -v   
// v20.17.0
$ npm -v
// 10.8.2</pre>
<p>Для установка Sass выполните команду в консоли:</p>
<pre class="language-cpp">npm install -g sass</pre>
<p>После установки можно проверить версию</p>
<pre class="language-c">$ sass --version
// 1.79.4 </pre>
<p>Необходимые установки выполнены. Теперь можно приступать к настройке PhpStorm. </p>
<p>Теперь нам нужно настроить <strong>File Watcher</strong> в PhpStorm.</p>
<p>Перейдите в <strong>File &gt; Settings &gt; Tools &gt; File Watchers &gt; {нажать на + внизу слева} &gt; выбрать (SCSS or Sass)</strong><strong>. </strong>Если вы не уверены, какой шаблон использовать, я бы порекомендовал SCSS.</p>
<div class="row">
<div class="col-xs-12 col-sm-4"><img class="img-responsive" src="/images/phpstorm_prefe.jpg" width="432" height="514" alt=""></div>
<div class="col-xs-12 col-sm-8"><img class="img-responsive" src="/images/phpstorm_filewatchers.jpg" width="1384" height="807" alt=""></div>
</div>
<p><img class="img-responsive" src="/images/phpstorm_editwatchers.jpg" alt=""></p>
<p>Если все настроено как выше то все будет работать. </p>
<p>Установки обычно PhpStorm подтягивает автоматически. Бывают ситуации что приходится настраивать вручную если автоматически не применились настройки установки среды.</p>
<p>В частности после установки и проверки синтаксиса sass/scss в PhpStorm бывают ошибки. Ошибка при компиляции scss в css например:</p>
<pre class="language-c">env: node: No such file or directory
Process finished with exit code 127</pre>
<p>В ошибке пишется что не найден путь для запуска программы. </p>
<p>Решение этой проблемы:</p>
<ol>
<li>введите в свой терминал <strong>echo $PATH</strong></li>
<li>скопируйте результат, он должен быть примерно таким /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</li>
<li>Перейдите в <strong>Preferences &gt; Tools &gt; File Watchers</strong>.</li>
<li>Выберите SASS, нажмите «Изменить»</li>
<li>Нажмите «Другие параметры» и «Переменные среды».</li>
<li>Нажмите «+»</li>
<li>Введите «PATH» в столбце «Имя».</li>
<li>Вставьте скопированный текст в столбец «Значение» /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</li>
<li>Нажмите Ok</li>
</ol>
<p><img class="img-responsive" src="/images/phpstorm_env_var.jpg" alt=""></p>
<p>Все будет работать!</p>
<p>Если возникнут проблемы с установкой или будут вопросы или пожелание, напишите пожалуйста мне. Постараюсь вам помочь.<br>Желаю всем творческих успехов!</p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Thu, 30 Nov 2023 10:49:13 +0300</pubDate>
      <title>Исправляем в ISPmanager зависло оповещение</title>
      <description>ISPmanager в нашей всеми любимой панели управления серверами, иногда случается такое что в столбце (фоновые задания) на главной странице ISPmanager Lite, оповещение о невыполненном фоновом задание не удаляются и продолжают там находится всегда. Причину появления предупреждения я думаю объяснять не нужно, а вот по какой причине оно не удаляется, или почему его нельзя удалить после перехода непосредственно в него из интерфейса самой панели ISPmanager , это для меня непонятно.</description>
      <yandex:full-text>&lt;p&gt;ISPmanager в нашей всеми любимой панели управления серверами, иногда случается такое что в столбце (фоновые задания) на главной странице ISPmanager Lite, оповещение о невыполненном фоновом задание не удаляются и продолжают там находится всегда. Причину появления предупреждения я думаю объяснять не нужно, а вот по какой причине оно не удаляется, или почему его нельзя удалить после перехода непосредственно в него из интерфейса самой панели ISPmanager , это для меня непонятно.&lt;/p&gt;&#13;
&lt;p&gt;Чтобы удалить это предупреждение достаточно зайти по пути:&lt;/p&gt;&#13;
&lt;pre class="language-cpp"&gt;/usr/local/mgr5/var/run/&lt;/pre&gt;&#13;
&lt;p&gt;далее найти папку под одноименным названием задания, пройти в нее и удалить оттуда PID файл.&lt;br&gt;После этого назойливое предупреждение пропадет.&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/ispravlyaem-v-ispmanager-zavislo-opoveshhenie/</guid>
      <link>https://syrbek.ru/blog/ispravlyaem-v-ispmanager-zavislo-opoveshhenie/</link>
      <turbo:content><![CDATA[
<header>
<h1>Исправляем в ISPmanager зависло оповещение</h1>
</header>
<p>ISPmanager в нашей всеми любимой панели управления серверами, иногда случается такое что в столбце (фоновые задания) на главной странице ISPmanager Lite, оповещение о невыполненном фоновом задание не удаляются и продолжают там находится всегда. Причину появления предупреждения я думаю объяснять не нужно, а вот по какой причине оно не удаляется, или почему его нельзя удалить после&nbsp;перехода непосредственно в него из интерфейса самой панели ISPmanager , это для меня непонятно.</p>
<p>Чтобы удалить это предупреждение достаточно зайти по пути:</p>
<pre class="language-cpp">/usr/local/mgr5/var/run/</pre>
<p>далее найти папку под одноименным названием задания, пройти в нее и удалить оттуда PID файл.<br>После этого назойливое предупреждение пропадет.</p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Thu, 19 May 2022 13:36:25 +0300</pubDate>
      <title>Инструкция для обновления версии Windows с Home до Pro без переустановки системы и приложений</title>
      <description>Специальная инструкция, описывающую как можно без переустановки системы, с сохранением всех установленных программ, настроек и файлов, повысить версию Windows 10 с "домашней" до "профессиональной". Способ полностью легальный, рабочий и уже многократно проверен нами и нашими клиентами. И уже после этого её можно будет активировать ключом от Windows 10 Pro. Учтите, что если ваша текущая система уже активирована лицензионным ключом, то после повышения версии активация исчезнет (это логично, т.к. ключи от разных версий не подходят друг к другу).</description>
      <yandex:full-text>&lt;ol&gt;&#13;
&lt;li&gt;&#13;
&lt;p&gt;Перед повышением версии желательно установить все последние обновления. Убедиться что ваша Виндоус находится в актуальном состоянии можно зайдя в "Пуск -&gt; Параметры -&gt; Обновление и безопасность -&gt; Центр обновления".&lt;/p&gt;&#13;
&lt;/li&gt;&#13;
&lt;li&gt;&#13;
&lt;p&gt;Отключите интернет-соединение (кнопкой на роутере, с помощью провайдера или просто отключив провод интернета от компьютера). Это обязательный шаг, интернет должен быть выключен на момент начала повышения версии Windows.&lt;/p&gt;&#13;
&lt;/li&gt;&#13;
&lt;li&gt;&#13;
&lt;p&gt;Откройте раздел активации Windows. Это делается в "Пуск -&gt; Параметры -&gt; Обновление и безопасность -&gt; Активация". Или наберите в поиске по системе "активац" и увидите пункт "Параметры активации".&lt;/p&gt;&#13;
&lt;p&gt;&lt;img src="/media/MEKLUrh53MU.jpeg" class="img-responsive" alt="" /&gt;&lt;/p&gt;&#13;
&lt;/li&gt;&#13;
&lt;li&gt;&#13;
&lt;p&gt;Измените (обновите) ключ продукта на указанный ниже:&lt;br /&gt;VK7JG-NPHTM-C97JM-9MPGT-3V66T&lt;br /&gt;Это специальный технический ключ, которые не активируют систему, а указывают ей на необходимость повышения версии.&lt;/p&gt;&#13;
&lt;/li&gt;&#13;
&lt;li&gt;&#13;
&lt;p&gt;Разрешите системе обновиться (кнопка "Начать").&lt;br /&gt;Само обновление займет некоторое время (зависит от мощности вашего компьютера). Затем компьютер перезагрузится. В результате ваша система обновится до Pro версии. Но она будет, естественно, не активирована. После завершения обновления необходимо включить интернет обратно и уже тогда использовать купленный у нас лицензионный ключ активации.&lt;/p&gt;&#13;
&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;p&gt;Заметки:&lt;/p&gt;&#13;
&lt;ul&gt;&#13;
&lt;li&gt;Если в процессе обновления (повышения версии) системы процент выполнения застыл на одном месте и долго (10-20 минут) не меняется, попробуйте включить интернет обратно.&lt;/li&gt;&#13;
&lt;li&gt;Если в конце обновления система выдает ошибку 0x80010105 (&lt;em&gt;Не удалось обновить данный выпуск&lt;/em&gt;), просто перезагрузите компьютер. После этого система должна будет измениться на Профессиональную.&lt;/li&gt;&#13;
&lt;/ul&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/instrukcziya-dlya-obnovleniya-versii-windows-s-home-do-pro-bez-pereustanovki-sistemy-i-prilozhenij/</guid>
      <link>https://syrbek.ru/blog/instrukcziya-dlya-obnovleniya-versii-windows-s-home-do-pro-bez-pereustanovki-sistemy-i-prilozhenij/</link>
      <turbo:content><![CDATA[
<header>
<h1>Инструкция для обновления версии Windows с Home до Pro без переустановки системы и приложений</h1>
</header>
<ol>
<li>
<p>Перед повышением версии желательно установить все последние обновления. Убедиться что ваша Виндоус находится в актуальном состоянии можно зайдя в "Пуск -&gt; Параметры -&gt; Обновление и безопасность -&gt; Центр обновления".</p>
</li>
<li>
<p>Отключите интернет-соединение (кнопкой на роутере, с помощью провайдера или просто отключив провод интернета от компьютера). Это обязательный шаг, интернет должен быть выключен на момент начала повышения версии Windows.</p>
</li>
<li>
<p>Откройте раздел активации Windows. Это делается в "Пуск -&gt; Параметры -&gt; Обновление и безопасность -&gt; Активация". Или наберите в поиске по системе "активац" и увидите пункт "Параметры активации".</p>
<p><img src="/media/MEKLUrh53MU.jpeg" class="img-responsive" alt="" /></p>
</li>
<li>
<p>Измените (обновите) ключ продукта на указанный ниже:<br />VK7JG-NPHTM-C97JM-9MPGT-3V66T<br />Это специальный технический ключ, которые не активируют систему, а указывают ей на необходимость повышения версии.</p>
</li>
<li>
<p>Разрешите системе обновиться (кнопка "Начать").<br />Само обновление займет некоторое время (зависит от мощности вашего компьютера). Затем компьютер перезагрузится. В результате ваша система обновится до Pro версии. Но она будет, естественно, не активирована. После завершения обновления необходимо включить интернет обратно и уже тогда использовать купленный у нас лицензионный ключ активации.</p>
</li>
</ol>
<p>Заметки:</p>
<ul>
<li>Если в процессе обновления (повышения версии) системы процент выполнения застыл на одном месте и долго (10-20 минут) не меняется, попробуйте включить интернет обратно.</li>
<li>Если в конце обновления система выдает&nbsp;ошибку&nbsp;0x80010105 (<em>Не удалось обновить данный выпуск</em>), просто перезагрузите компьютер. После этого система должна будет измениться на Профессиональную.</li>
</ul>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Thu, 25 Jun 2020 00:02:39 +0300</pubDate>
      <title>HostCMS элементы ИС вывести даже если дата публикации завершена</title>
      <description>В «Информационные системы» для записи элемента можно указать «Дата завершения публикации». Штатно элемент перестанет быть виден и доступен когда наступит указанная дата завершения публикации. Иногда хочется что бы в списке были видны те элементы которые уже завершены дата публикации.</description>
      <yandex:full-text>&lt;p&gt;В «Информационные системы» для записи элемента можно указать «Дата завершения публикации». Штатно элемент перестанет быть виден и доступен когда наступит указанная дата завершения публикации. Иногда хочется что бы в списке были видны те элементы которые уже завершены дата публикации.&lt;/p&gt;&#13;
&lt;p&gt;Например такое решение подходит для страницы акции. Где будут опубликованы акции на определенный срок. Но пользователем сайта всегда интересно быть в курсе какие выгодные бывают акции если даже они уже не актуальные. Для решение этой задачи необходимо пере определил контроллер, далее написать свои условие:&lt;/p&gt;&#13;
&lt;p&gt;В свой ТДС пишем пере определение:&lt;/p&gt;&#13;
&lt;pre class="language-php"&gt;class My_Informationsystem_Controller_Show extends Informationsystem_Controller_Show&#13;
{&#13;
    protected function _applyItemConditions(Informationsystem_Item_Model $oInformationsystem_Items)&#13;
    {&#13;
        $dateTime = Core_Date::timestamp2sql(time());&#13;
        $oInformationsystem_Items&#13;
            -&gt;queryBuilder()&#13;
            -&gt;open()&#13;
            -&gt;where('informationsystem_items.start_datetime', '&lt;', $dateTime)&#13;
            -&gt;setOr()&#13;
            -&gt;where('informationsystem_items.start_datetime', '=', '0000-00-00 00:00:00')&#13;
            -&gt;close()&#13;
            -&gt;where('informationsystem_items.siteuser_group_id', 'IN', $this-&gt;_aSiteuserGroups);&#13;
&#13;
        return $this;&#13;
    }&#13;
&#13;
}&#13;
&#13;
class Info_Item_Observer&#13;
{&#13;
    static public function onBeforeGetXml($object, $args)&#13;
    {&#13;
        $bRightTime =&#13;
            ($object-&gt;start_datetime == '0000-00-00 00:00:00' || time() &gt; Core_Date::sql2timestamp($object-&gt;start_datetime))&#13;
            &amp;&amp; ($object-&gt;end_datetime == '0000-00-00 00:00:00' || time() &lt; Core_Date::sql2timestamp($object-&gt;end_datetime));&#13;
&#13;
        !$bRightTime &amp;&amp; $object-&gt;addXmlTag('wrongTime', 1);&#13;
        $bRightTime &amp;&amp; $object-&gt;addXmlTag('countDown', date('Y/m/d H:i:s', Core_Date::datetime2timestamp($object-&gt;end_datetime)));&#13;
    }&#13;
}&#13;
&#13;
$oInformationsystem = Core_Entity::factory('Informationsystem', Core_Array::get(Core_Page::instance()-&gt;libParams, 'informationsystemId'));&#13;
&#13;
$Informationsystem_Controller_Show = new My_Informationsystem_Controller_Show($oInformationsystem);&#13;
&#13;
$Informationsystem_Controller_Show&#13;
    -&gt;limit($oInformationsystem-&gt;items_on_page)&#13;
    -&gt;parseUrl();&#13;
&#13;
if ($Informationsystem_Controller_Show-&gt;item &gt; 0) {&#13;
    $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show-&gt;item);&#13;
    if ($oInformationsystem_Item-&gt;end_datetime &lt; Core_Date::timestamp2sql(time()) &amp;&amp; $oInformationsystem_Item-&gt;end_datetime != '0000-00-00 00:00:00') {&#13;
        $Informationsystem_Controller_Show-&gt;error404();&#13;
    }&#13;
}&#13;
&#13;
Core_Event::attach('informationsystem_item.onBeforeGetXml', array ('Info_Item_Observer', 'onBeforeGetXml'));&#13;
&#13;
Core_Page::instance()-&gt;object = $Informationsystem_Controller_Show;&lt;/pre&gt;&#13;
&lt;p&gt;В коде есть Тег wrongTime которая определяет у элемента истек дата публикации. Если же еще не завершена то передаем в Тег countDown формат даты до которого действует акция и можно сделать обратный счетчик на странице.&lt;/p&gt;&#13;
&lt;p&gt;&lt;img src="/upload-files/countdown.png" alt="обратный счетчик на странице" class="img-thumbnail" /&gt;&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/hostcms-elementy-is-vyvesti-dazhe-esli-data-publikaczii-zavershena/</guid>
      <link>https://syrbek.ru/blog/hostcms-elementy-is-vyvesti-dazhe-esli-data-publikaczii-zavershena/</link>
      <turbo:content><![CDATA[
<header>
<h1>HostCMS элементы ИС вывести даже если дата публикации завершена</h1>
</header>
<p>В &laquo;Информационные системы&raquo; для записи элемента можно указать &laquo;Дата завершения публикации&raquo;. Штатно элемент перестанет быть виден и доступен когда наступит указанная дата завершения публикации. Иногда хочется что бы в списке были видны те элементы которые уже завершены дата публикации.</p>
<p>Например такое решение подходит для страницы акции. Где будут опубликованы акции на определенный срок. Но пользователем сайта всегда интересно быть в курсе какие выгодные бывают акции если даже они уже не актуальные. Для решение этой задачи необходимо пере определил контроллер, далее написать свои условие:</p>
<p>В свой ТДС пишем пере определение:</p>
<pre class="language-php">class My_Informationsystem_Controller_Show extends Informationsystem_Controller_Show
{
    protected function _applyItemConditions(Informationsystem_Item_Model $oInformationsystem_Items)
    {
        $dateTime = Core_Date::timestamp2sql(time());
        $oInformationsystem_Items
            -&gt;queryBuilder()
            -&gt;open()
            -&gt;where('informationsystem_items.start_datetime', '&lt;', $dateTime)
            -&gt;setOr()
            -&gt;where('informationsystem_items.start_datetime', '=', '0000-00-00 00:00:00')
            -&gt;close()
            -&gt;where('informationsystem_items.siteuser_group_id', 'IN', $this-&gt;_aSiteuserGroups);

        return $this;
    }

}

class Info_Item_Observer
{
    static public function onBeforeGetXml($object, $args)
    {
        $bRightTime =
            ($object-&gt;start_datetime == '0000-00-00 00:00:00' || time() &gt; Core_Date::sql2timestamp($object-&gt;start_datetime))
            &amp;&amp; ($object-&gt;end_datetime == '0000-00-00 00:00:00' || time() &lt; Core_Date::sql2timestamp($object-&gt;end_datetime));

        !$bRightTime &amp;&amp; $object-&gt;addXmlTag('wrongTime', 1);
        $bRightTime &amp;&amp; $object-&gt;addXmlTag('countDown', date('Y/m/d H:i:s', Core_Date::datetime2timestamp($object-&gt;end_datetime)));
    }
}

$oInformationsystem = Core_Entity::factory('Informationsystem', Core_Array::get(Core_Page::instance()-&gt;libParams, 'informationsystemId'));

$Informationsystem_Controller_Show = new My_Informationsystem_Controller_Show($oInformationsystem);

$Informationsystem_Controller_Show
    -&gt;limit($oInformationsystem-&gt;items_on_page)
    -&gt;parseUrl();

if ($Informationsystem_Controller_Show-&gt;item &gt; 0) {
    $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show-&gt;item);
    if ($oInformationsystem_Item-&gt;end_datetime &lt; Core_Date::timestamp2sql(time()) &amp;&amp; $oInformationsystem_Item-&gt;end_datetime != '0000-00-00 00:00:00') {
        $Informationsystem_Controller_Show-&gt;error404();
    }
}

Core_Event::attach('informationsystem_item.onBeforeGetXml', array ('Info_Item_Observer', 'onBeforeGetXml'));

Core_Page::instance()-&gt;object = $Informationsystem_Controller_Show;</pre>
<p>В коде есть Тег wrongTime которая определяет у элемента истек дата публикации. Если же еще не завершена то передаем в Тег countDown формат даты до которого действует акция и можно сделать обратный счетчик на странице.</p>
<p><img src="/upload-files/countdown.png" alt="обратный счетчик на странице" class="img-thumbnail" /></p>
]]></turbo:content>
    </item>
    <item turbo="true">
      <pubDate>Wed, 24 Jun 2020 23:09:46 +0300</pubDate>
      <title>HostCMS в корне магазина вывести товары для категорий</title>
      <description>Задача была вывести в корне /shop/ для группы (категорий) товары которые есть в группе. Например до 10 товаров для каждой группы. </description>
      <yandex:full-text>&lt;p&gt;По умолчанию в корне магазина /shop/ видны только категории без товаров. По этому было необходимость вывести список товаров для каждой группы. Например:&lt;/p&gt;&#13;
&lt;ul&gt;&#13;
&lt;li&gt;«Группа-А»&#13;
&lt;ul&gt;&#13;
&lt;li&gt;Товар-1&lt;/li&gt;&#13;
&lt;li&gt;Товар-2&lt;/li&gt;&#13;
&lt;li&gt;[...]&lt;/li&gt;&#13;
&lt;li&gt;Товар-N&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;/li&gt;&#13;
&lt;li&gt;«Группа-Б»&#13;
&lt;ul&gt;&#13;
&lt;li&gt;Товар-1&lt;/li&gt;&#13;
&lt;li&gt;Товар-2&lt;/li&gt;&#13;
&lt;li&gt;[...]&lt;/li&gt;&#13;
&lt;li&gt;Товар-N&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;/li&gt;&#13;
&lt;li&gt;[...]&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;p&gt;Такое решение необходимо было сделать только в корне магазина /shop/. А в остальных случаях работает стандартно. Для этого написал Хук с проверкой. Например в ТДС магазина&lt;/p&gt;&#13;
&lt;pre class="language-php"&gt;if ($Shop_Controller_Show-&gt;group == 0)&#13;
{&#13;
    Core_Event::attach('shop_group.onBeforeGetXml', array('Shop_Group_Observer', 'onBeforeGetXml'));&#13;
}&lt;/pre&gt;&#13;
&lt;p&gt;Пишем класс наблюдателя, размещаем его в modules/shop/group/observer.php&lt;/p&gt;&#13;
&lt;pre class="language-php"&gt;class Shop_Group_Observer&#13;
{&#13;
    static public function onBeforeGetXml($object, $args)&#13;
    {&#13;
        if (is_object(Core_Page::instance()-&gt;object)&#13;
            &amp;&amp; get_class(Core_Page::instance()-&gt;object) == 'Shop_Controller_Show')&#13;
        {&#13;
            if (Core_Page::instance()-&gt;object-&gt;group == 0)&#13;
            {&#13;
                // Получаем список валют магазина&#13;
                $aShop_Currencies = Core_Entity::factory('Shop_Currency')-&gt;findAll();&#13;
&#13;
                $query_tax = 'IF(`shop_taxes`.`tax_is_included` IS NULL OR `shop_taxes`.`tax_is_included` = 1, 0, `shop_items`.`price` * `shop_taxes`.`rate` / 100)';&#13;
                $query_currency_switch = "`shop_items`.`price` + {$query_tax}";&#13;
                foreach ($aShop_Currencies as $oShop_Currency)&#13;
                {&#13;
                    // Получаем коэффициент пересчета для каждой валюты&#13;
                    $currency_coefficient = Shop_Controller::instance()-&gt;getCurrencyCoefficientInShopCurrency(&#13;
                        $oShop_Currency, $object-&gt;Shop-&gt;Shop_Currency&#13;
                    );&#13;
&#13;
                    $query_currency_switch = "IF (`shop_items`.`shop_currency_id` = '{$oShop_Currency-&gt;id}', IF (COUNT(`shop_discounts`.`id`), ((`shop_items`.`price` + {$query_tax}) * (1 - SUM(DISTINCT IF(`shop_discounts`.`type` = 0, `shop_discounts`.`value`, 0)) / 100)) * {$currency_coefficient} - SUM(DISTINCT IF(`shop_discounts`.`type`, `shop_discounts`.`value`, 0)), (`shop_items`.`price`) * {$currency_coefficient}), {$query_currency_switch})";&#13;
                }&#13;
&#13;
                $current_date = date('Y-m-d H:i:s');&#13;
&#13;
                $oShop_Items = $object-&gt;Shop-&gt;Shop_Items;&#13;
                $oShop_Items-&gt;queryBuilder()&#13;
                    -&gt;clearSelect()&#13;
                    -&gt;select('shop_items.*')&#13;
                    -&gt;select(array(Core_QueryBuilder::expression($query_currency_switch), 'absolute_price'))&#13;
                    -&gt;leftJoin('shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id')&#13;
                    -&gt;leftJoin('shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id', array(&#13;
                        array('AND ' =&gt; array('shop_discounts.active', '=', 1)),&#13;
                        array('AND ' =&gt; array('shop_discounts.deleted', '=', 0)),&#13;
                        array('AND' =&gt; array('shop_discounts.start_datetime', '&lt;=', $current_date)),&#13;
                        array('AND (' =&gt; array('shop_discounts.end_datetime', '&gt;=', $current_date)),&#13;
                        array('OR' =&gt; array('shop_discounts.end_datetime', '=', '0000-00-00 00:00:00')),&#13;
                        array(')' =&gt; NULL)&#13;
                    ))&#13;
                    -&gt;leftJoin('shop_taxes', 'shop_taxes.id', '=', 'shop_items.shop_tax_id')&#13;
                    -&gt;where('shop_items.shop_group_id', '=', $object-&gt;id)&#13;
                    -&gt;groupBy('shop_items.id')&#13;
                    -&gt;clearOrderBy()&#13;
                    -&gt;orderBy('absolute_price', 'ASC')&#13;
                    -&gt;limit(20);&#13;
&#13;
                $aShop_Items = $oShop_Items-&gt;findAll(FALSE);&#13;
&#13;
                // XML-сущность&#13;
                $oGoodsXmlEntity = Core::factory('Core_Xml_Entity')-&gt;name('goods');&#13;
                $object-&gt;addEntity($oGoodsXmlEntity);&#13;
&#13;
                foreach ($aShop_Items as $oShop_Item)&#13;
                {&#13;
                    $oGoodsXmlEntity-&gt;addEntity(&#13;
                        $oShop_Item&#13;
                            -&gt;addForbiddenTag('text')&#13;
                            -&gt;addForbiddenTag('description')&#13;
                            -&gt;addForbiddenTag('shop_producer')&#13;
                            -&gt;showXmlComments(FALSE)&#13;
                            -&gt;showXmlAssociatedItems(FALSE)&#13;
                            -&gt;showXmlModifications(FALSE)&#13;
                            -&gt;showXmlSpecialprices(FALSE)&#13;
                            -&gt;showXmlTags(FALSE)&#13;
                            -&gt;showXmlWarehousesItems(FALSE)&#13;
                            -&gt;showXmlSiteuser(FALSE)&#13;
                            -&gt;showXmlProperties(FALSE)&#13;
                            -&gt;showXmlSets(FALSE)&#13;
&#13;
                    );&#13;
&#13;
                }&#13;
            }&#13;
        }&#13;
    }&#13;
}&lt;/pre&gt;&#13;
&lt;p&gt;Тут можно отметить что товары отсортированы по цене по убыванию.&lt;/p&gt;</yandex:full-text>
      <guid>https://syrbek.ru/blog/hostcms-v-korne-magazina-vyvesti-tovary-dlya-kategorij/</guid>
      <link>https://syrbek.ru/blog/hostcms-v-korne-magazina-vyvesti-tovary-dlya-kategorij/</link>
      <turbo:content><![CDATA[
<header>
<h1>HostCMS в корне магазина вывести товары для категорий</h1>
</header>
<p>По умолчанию в корне магазина /shop/ видны только категории без товаров. По этому было необходимость вывести список товаров для каждой группы. Например:</p>
<ul>
<li>&laquo;Группа-А&raquo;
<ul>
<li>Товар-1</li>
<li>Товар-2</li>
<li>[...]</li>
<li>Товар-N</li>
</ul>
</li>
<li>&laquo;Группа-Б&raquo;
<ul>
<li>Товар-1</li>
<li>Товар-2</li>
<li>[...]</li>
<li>Товар-N</li>
</ul>
</li>
<li>[...]</li>
</ul>
<p>Такое решение необходимо было сделать только в корне магазина /shop/. А в остальных случаях работает стандартно. Для этого написал Хук с проверкой. Например в ТДС магазина</p>
<pre class="language-php">if ($Shop_Controller_Show-&gt;group == 0)
{
    Core_Event::attach('shop_group.onBeforeGetXml', array('Shop_Group_Observer', 'onBeforeGetXml'));
}</pre>
<p>Пишем класс наблюдателя, размещаем его в modules/shop/group/observer.php</p>
<pre class="language-php">class Shop_Group_Observer
{
    static public function onBeforeGetXml($object, $args)
    {
        if (is_object(Core_Page::instance()-&gt;object)
            &amp;&amp; get_class(Core_Page::instance()-&gt;object) == 'Shop_Controller_Show')
        {
            if (Core_Page::instance()-&gt;object-&gt;group == 0)
            {
                // Получаем список валют магазина
                $aShop_Currencies = Core_Entity::factory('Shop_Currency')-&gt;findAll();

                $query_tax = 'IF(`shop_taxes`.`tax_is_included` IS NULL OR `shop_taxes`.`tax_is_included` = 1, 0, `shop_items`.`price` * `shop_taxes`.`rate` / 100)';
                $query_currency_switch = "`shop_items`.`price` + {$query_tax}";
                foreach ($aShop_Currencies as $oShop_Currency)
                {
                    // Получаем коэффициент пересчета для каждой валюты
                    $currency_coefficient = Shop_Controller::instance()-&gt;getCurrencyCoefficientInShopCurrency(
                        $oShop_Currency, $object-&gt;Shop-&gt;Shop_Currency
                    );

                    $query_currency_switch = "IF (`shop_items`.`shop_currency_id` = '{$oShop_Currency-&gt;id}', IF (COUNT(`shop_discounts`.`id`), ((`shop_items`.`price` + {$query_tax}) * (1 - SUM(DISTINCT IF(`shop_discounts`.`type` = 0, `shop_discounts`.`value`, 0)) / 100)) * {$currency_coefficient} - SUM(DISTINCT IF(`shop_discounts`.`type`, `shop_discounts`.`value`, 0)), (`shop_items`.`price`) * {$currency_coefficient}), {$query_currency_switch})";
                }

                $current_date = date('Y-m-d H:i:s');

                $oShop_Items = $object-&gt;Shop-&gt;Shop_Items;
                $oShop_Items-&gt;queryBuilder()
                    -&gt;clearSelect()
                    -&gt;select('shop_items.*')
                    -&gt;select(array(Core_QueryBuilder::expression($query_currency_switch), 'absolute_price'))
                    -&gt;leftJoin('shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id')
                    -&gt;leftJoin('shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id', array(
                        array('AND ' =&gt; array('shop_discounts.active', '=', 1)),
                        array('AND ' =&gt; array('shop_discounts.deleted', '=', 0)),
                        array('AND' =&gt; array('shop_discounts.start_datetime', '&lt;=', $current_date)),
                        array('AND (' =&gt; array('shop_discounts.end_datetime', '&gt;=', $current_date)),
                        array('OR' =&gt; array('shop_discounts.end_datetime', '=', '0000-00-00 00:00:00')),
                        array(')' =&gt; NULL)
                    ))
                    -&gt;leftJoin('shop_taxes', 'shop_taxes.id', '=', 'shop_items.shop_tax_id')
                    -&gt;where('shop_items.shop_group_id', '=', $object-&gt;id)
                    -&gt;groupBy('shop_items.id')
                    -&gt;clearOrderBy()
                    -&gt;orderBy('absolute_price', 'ASC')
                    -&gt;limit(20);

                $aShop_Items = $oShop_Items-&gt;findAll(FALSE);

                // XML-сущность
                $oGoodsXmlEntity = Core::factory('Core_Xml_Entity')-&gt;name('goods');
                $object-&gt;addEntity($oGoodsXmlEntity);

                foreach ($aShop_Items as $oShop_Item)
                {
                    $oGoodsXmlEntity-&gt;addEntity(
                        $oShop_Item
                            -&gt;addForbiddenTag('text')
                            -&gt;addForbiddenTag('description')
                            -&gt;addForbiddenTag('shop_producer')
                            -&gt;showXmlComments(FALSE)
                            -&gt;showXmlAssociatedItems(FALSE)
                            -&gt;showXmlModifications(FALSE)
                            -&gt;showXmlSpecialprices(FALSE)
                            -&gt;showXmlTags(FALSE)
                            -&gt;showXmlWarehousesItems(FALSE)
                            -&gt;showXmlSiteuser(FALSE)
                            -&gt;showXmlProperties(FALSE)
                            -&gt;showXmlSets(FALSE)

                    );

                }
            }
        }
    }
}</pre>
<p>Тут можно отметить что товары отсортированы по цене по убыванию.</p>
]]></turbo:content>
    </item>
  </channel>
</rss>
