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

<rss version=".92">
 <channel>
	<title>Блог Николаева Виталия</title>
	<link>http://nikovit.ru/blog/index.php</link>
	<description></description>
	<language>ru</language>
	<docs>http://backend.userland.com/rss092</docs>

    <item>
      <title>Календарь ивентов Steam на 2026 год: фестивали и распродажи</title>
      <description><![CDATA[<p><b>Valve продолжает радовать &nbsp;игроков регулярными тематическими фестивалями и грандиозными сезонными &nbsp;распродажами. Мы собрали для вас полный хронологический список всех &nbsp;анонсированных ивентов на 2026 год. Отмечайте даты в календаре, чтобы не &nbsp;пропустить возможность найти новые любимые игры или выгодно пополнить &nbsp;свою коллекцию.</b></p><br /><a href="http://nikovit.ru/blog/173/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/173/</link>
    </item>

    <item>
      <title>Битрикс выгрузить все элементы вместе со свойствами в файл</title>
      <description><![CDATA[Этот скрипт выгружает все элементы инфоблока в файл csv<br />
====code====
<pre>&#60;?php
use Bitrix&#92;Main&#92;Loader;

require($_SERVER&#91;"DOCUMENT_ROOT"&#93;."/bitrix/modules/main/include/prolog_before.php");

if (!Loader::includeModule("iblock")) {
&nbsp;&nbsp;&nbsp;&nbsp;die("Модуль Инфоблоки не подключен");
}

$IBLOCK_ID = 55;
$FILE_PATH = $_SERVER&#91;"DOCUMENT_ROOT"&#93; . "/upload/export_iblock_{$IBLOCK_ID}.csv";

// Получаем список всех свойств инфоблока
$arProps = &#91;&#93;;
$rsProps = CIBlockProperty::GetList(
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"SORT"=&#62;"ASC"&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"IBLOCK_ID"=&#62;$IBLOCK_ID, "ACTIVE"=&#62;"Y"&#93;
);
while ($arProp = $rsProps-&#62;Fetch()) {
&nbsp;&nbsp;&nbsp;&nbsp;$arProps&#91;$arProp&#91;"CODE"&#93;&#93; = $arProp;
}

// Заголовки для CSV: ID, NAME + все свойства
$headers = &#91;"ID", "NAME"&#93;;
foreach ($arProps as $code =&#62; $prop) {
&nbsp;&nbsp;&nbsp;&nbsp;$headers&#91;&#93; = $prop&#91;"CODE"&#93;;
}

$fp = fopen($FILE_PATH, "w");
fputcsv($fp, $headers, ";");

// Выбираем элементы инфоблока
$arSelect = &#91;"ID", "IBLOCK_ID", "NAME"&#93;;
$arFilter = &#91;"IBLOCK_ID" =&#62; $IBLOCK_ID, "ACTIVE" =&#62; "Y"&#93;;
$res = CIBlockElement::GetList(&#91;"ID"=&#62;"ASC"&#93;, $arFilter, false, false, $arSelect);

while ($arItem = $res-&#62;GetNextElement()) {
&nbsp;&nbsp;&nbsp;&nbsp;$fields = $arItem-&#62;GetFields();
&nbsp;&nbsp;&nbsp;&nbsp;$props&nbsp;&nbsp;= $arItem-&#62;GetProperties();

&nbsp;&nbsp;&nbsp;&nbsp;$row = &#91;$fields&#91;"ID"&#93;, $fields&#91;"NAME"&#93;&#93;;

&nbsp;&nbsp;&nbsp;&nbsp;foreach ($arProps as $code =&#62; $propInfo) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value = $props&#91;$code&#93;&#91;"VALUE"&#93;;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty($value)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row&#91;&#93; = "";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Если свойство — файл (в том числе множественное)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($propInfo&#91;"PROPERTY_TYPE"&#93; === "F") {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($value)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$filePaths = &#91;&#93;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($value as $fileId) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$filePath = CFile::GetPath($fileId);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($filePath) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$filePaths&#91;&#93; = $filePath;
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row&#91;&#93; = implode(",", $filePaths);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row&#91;&#93; = CFile::GetPath($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;elseif ($propInfo&#91;"MULTIPLE"&#93; === "Y" &#38;&#38; is_array($value)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row&#91;&#93; = implode(",", $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;else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row&#91;&#93; = $value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;fputcsv($fp, $row, ";");
}

fclose($fp);

echo "Экспорт завершен. Файл: ".$FILE_PATH;

</pre>
=============<br /><a href="http://nikovit.ru/blog/172/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/172/</link>
    </item>

    <item>
      <title>Битрикс получаем все свойства элемента</title>
      <description><![CDATA[Для получения всех свойств элементов битрикс можно воспользоваться скриптом, в этом скрипте я еще записал свойства в csv файл:
====code====
<pre>&#60;?php

use Bitrix&#92;Main&#92;Loader;

require($_SERVER&#91;"DOCUMENT_ROOT"&#93;."/bitrix/modules/main/include/prolog_before.php");

if (!Loader::includeModule("iblock")) {
&nbsp;&nbsp;&nbsp;&nbsp;die("Модуль iblock не подключен");
}

$IBLOCK_ID = 55;
$filePath = $_SERVER&#91;"DOCUMENT_ROOT"&#93;."/upload/iblock_{$IBLOCK_ID}_fields.csv";

// Открываем файл для записи
$fp = fopen($filePath, "w");

// Заголовки CSV
fputcsv($fp, &#91;"Название", "Код", "Обязательное", "Множественное", "Тип поля"&#93;, ";");

// Функция для преобразования типа
function getPropertyTypeName($prop) {
&nbsp;&nbsp;&nbsp;&nbsp;$types = &#91;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"S" =&#62; "Строка",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"N" =&#62; "Число",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"L" =&#62; "Список",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"F" =&#62; "Файл",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"E" =&#62; "Привязка к элементу",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"G" =&#62; "Привязка к разделу"
&nbsp;&nbsp;&nbsp;&nbsp;&#93;;

&nbsp;&nbsp;&nbsp;&nbsp;$baseType = $types&#91;$prop&#91;"PROPERTY_TYPE"&#93;&#93; ?? $prop&#91;"PROPERTY_TYPE"&#93;;

&nbsp;&nbsp;&nbsp;&nbsp;// Если пользовательский тип указан — уточняем
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty($prop&#91;"USER_TYPE"&#93;)) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$baseType .= " ({$prop&#91;"USER_TYPE"&#93;})";
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return $baseType;
}

// Получаем список свойств инфоблока
$properties = CIBlockProperty::GetList(
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"SORT" =&#62; "ASC"&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"IBLOCK_ID" =&#62; $IBLOCK_ID&#93;
);

while ($prop = $properties-&#62;Fetch()) {
&nbsp;&nbsp;&nbsp;&nbsp;$row = &#91;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$prop&#91;"NAME"&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$prop&#91;"CODE"&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($prop&#91;"IS_REQUIRED"&#93; === "Y" ? "да" : "нет"),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($prop&#91;"MULTIPLE"&#93; === "Y" ? "да" : "нет"),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getPropertyTypeName($prop)
&nbsp;&nbsp;&nbsp;&nbsp;&#93;;

&nbsp;&nbsp;&nbsp;&nbsp;fputcsv($fp, $row, ";");
}

fclose($fp);

echo "Файл успешно создан: ".$filePath;

</pre>
=============<br /><a href="http://nikovit.ru/blog/bitriks-poluchaem-vse-svoystva-elementa/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/bitriks-poluchaem-vse-svoystva-elementa/</link>
    </item>

    <item>
      <title>Битрикс. Ошибка! innodb_strict_mode=ON, требуется OFF</title>
      <description><![CDATA[В файле:<br />/bitrix/php_interface/after_connect_d7.php<br /><br />добавляем строку:
====code====
<pre>$this-&#62;queryExecute("SET innodb_strict_mode=0");
</pre>
=============<br /><a href="http://nikovit.ru/blog/bitriks-oshibka-innodbstrictmodeon-trebuetsya-off/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/bitriks-oshibka-innodbstrictmodeon-trebuetsya-off/</link>
    </item>

    <item>
      <title>openserver cannot create file hosts</title>
      <description><![CDATA[При запуске OpenServer появляется ошибка:<br />
====code====
<pre>openserver cannot create file hosts
</pre>
=============
<img src="http://nikovit.ru/upload/main/2f0/openserver.jpg" title="" alt="openserver.jpg" border="0"style=" width:496px; height:184px;" data-bx-image="http://nikovit.ru/bitrix/components/bitrix/blog/show_file.php?fid=422" /> <br /><br />Попробуйте изменить права на файл hosts, командой, консоль cmd нужно запускать от имени администратора:
====code====
<pre>attrib.exe -s -r -h -a C:&#92;Windows&#92;system32&#92;drivers&#92;etc&#92;hosts
</pre>
=============<br /><a href="http://nikovit.ru/blog/167/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/167/</link>
    </item>

    <item>
      <title>Установка CodeWhisperer в PhpStorm</title>
      <description><![CDATA[Так как githab copilot в россии не работает я перешел на CodeWhisperer от Amazon.<br /><br />Для установки CodeWhisperer в PhpStorm переходим в меню <b>File -&gt; Settings</b>, выбираем пункт <b>Plugins<br /></b><br />Находим плугин AWS Toolkit и устанавливаем.<b><br /></b><br /><img src="http://nikovit.ru/upload/resize_cache/main/501/600_600_1/Screenshot_5.png" title="" alt="Screenshot_5.png" border="0"style=" width:600px; height:397px;" data-bx-image="http://nikovit.ru/bitrix/components/bitrix/blog/show_file.php?fid=415&width=1000" /> &nbsp;<br /><a href="http://nikovit.ru/blog/ustanovka-codewhisperer-v-phpstorm/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/ustanovka-codewhisperer-v-phpstorm/</link>
    </item>

    <item>
      <title>selenium на сервере без графического интерфейса в режиме headless</title>
      <description><![CDATA[Для запуска selenium на сервере ubunty или debian без графического интерфейса, скачиваем последнею версию браузера Chrome<br />
====code====
<pre>wget -nc https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 
</pre>
=============
<br />устанавливаем браузер
====code====
<pre>apt install -f ./google-chrome-stable_current_amd64.deb</pre>
=============
<br />устанавливаем selenium и webdriver-manager 
====code====
<pre>pip install selenium webdriver-manager </pre>
=============
<br />создаем и запускаем скрипт, например на python
====code====
<pre>from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

driver.get("https://www.python.org/")
print(driver.title)
driver.close()
</pre>
=============<br /><a href="http://nikovit.ru/blog/selenium-na-servere-bez-graficheskogo-interfeysa-v-rezhime-headless/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/selenium-na-servere-bez-graficheskogo-interfeysa-v-rezhime-headless/</link>
    </item>

    <item>
      <title>Вирус .htaccess</title>
      <description><![CDATA[В последнее время получил распространение вирус который создает файлы свои .htaccess во всех директориях сайта.<br />Если у вас сайт под управлением битрикса то воспользуйтесь &quot;сканером безопасности&quot; в админке битрикса, чаще всего он находит исходные файлы php из которых распространяется вирус, и следуйте рекомендациям сканера, постарайтесь устранить все проблемы.<br /><br />Но иногда в админку из-за модифицированного файла .htaccess не зайти.<br />Найти и удалить все файлы .htaccess можно с помощью следующей команды, предварительно перейдя в директорию сайта.
====code====
<pre>find . -type f -name ".htaccess" -exec rm -v {} &#92;;
</pre>
=============
<br />Затем нужно заменить .htaccess на свой .htaccess.restore и запретить его изменять с помощью chattr.<br />
====code====
<pre>chattr -i .htaccess; cp .htaccess.restore .htaccess; chattr +i .htaccess
</pre>
=============<br /><a href="http://nikovit.ru/blog/virus-htaccess/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/virus-htaccess/</link>
    </item>

    <item>
      <title>Битрикс. Получить местоположение из заказа</title>
      <description><![CDATA[Получаем местоположение из заказа по номеру заказа<br />
====code====
<pre>$db_props = CSaleOrderPropsValue::GetOrderProps("номер_заказа");
while ($arProps = $db_props-&#62;Fetch())
{
&nbsp;&nbsp;&nbsp;&nbsp;if ($arProps&#91;"TYPE"&#93;=="LOCATION")
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arVal = CSaleLocation::GetByID($arProps&#91;"VALUE"&#93;, LANGUAGE_ID);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo htmlspecialchars($arVal&#91;"COUNTRY_NAME"&#93;." - ".$arVal&#91;"CITY_NAME"&#93;);
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre>
=============<br /><a href="http://nikovit.ru/blog/bitriks-poluchit-mestopolozhenie-iz-zakaza/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/bitriks-poluchit-mestopolozhenie-iz-zakaza/</link>
    </item>

    <item>
      <title>Битрикс. Список всех заказов, при оформлении которых был использован тот или иной купон получения скидки</title>
      <description><![CDATA[====code====
<pre>&#60;?
if (CModule::IncludeModule("sale")):

&nbsp;&nbsp; $arFilter = Array(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"BASKET_DISCOUNT_COUPON" =&#62; "КОД_КУПОНА_ЗДЕСЬ",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp; $rsSales = CSaleOrder::GetList(array("DATE_INSERT" =&#62; "ASC"), $arFilter);
&nbsp;&nbsp; while ($arSales = $rsSales-&#62;Fetch())
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&#60;pre&#62;";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_r($arSales);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&#60;/pre&#62;";
&nbsp;&nbsp; }
endif;
?&#62;

//можно использовать и массив купонов для поиска: 
CSaleOrder::GetList(array(), array('BASKET_DISCOUNT_COUPON' =&#62; array('TEST1', 'TEST2')));</pre>
=============<br /><a href="http://nikovit.ru/blog/bitriks-spisok-vsekh-zakazov-pri-oformlenii-kotorykh-byl-ispolzovan-to/">Подробнее...</a>]]></description>
      <link>http://nikovit.ru/blog/bitriks-spisok-vsekh-zakazov-pri-oformlenii-kotorykh-byl-ispolzovan-to/</link>
    </item>

  </channel>
</rss>