Есть отличное эльдорадо казино официальный сайт, в котором, зарегистрировавшись, можно получить массу удовольствия, играя в различные игровые автоматы, слоты и так далее. Заодно и выиграть себе что-то. Но можно играть и совсем бесплатно, на условные фишки. Казино онлайн eldorado casino пользуется заслуженным вниманием у азартных игроков!
Задача интеграции магазинов на Битрикс с несколькими информационными базами 1С Предприятие - возникает достаточно часто. Например, когда необходимо настроить работу 2х и больше интернет-магазинов на одном ядре Битрикс или в случае, когда каталог магазина должен наполняться товарами от разных поставщиков. На данную тему написано не мало статей, и я не буду подробно останавливаться на общей технологии настройки обмена в данном случае. Напомню, как делают:
Как вариант: создают несколько копий файлов http://<сайт>/bitrix/admin/1c_import.php и http://<сайт>/bitrix/admin/1c_exchange.php , а затем в настройках со стороны 1с прописывают для каждой базы свой путь.
А дальше и возникают некоторые проблемы, перед которыми пасуют многие разработчики. Дело в том, что если просто сделать несколько копий скриптов обмена, каждая база сможет отдавать свои товары на сайт, но нельзя будет запустить обмен данными из нескольких баз одновременно. Часто эту проблему можно решить, настроив расписание запуска обмена на стороне 1С. Но вот однажды я столкнулась с ситуаций, когда клиенту было необходимо загружать товары из 9ти информационных баз, каталог товаров в каждой базе был обширным, и клиенту хотелось, чтобы данные об остатках товаров на складах передавались на сайт как можно чаще. В этой ситуации было не обойтись без одновременного импорта товаров из нескольких информационных баз.
И тогда я подумала: "Не может быть, чтобы для Битикс было невозможно это сделать. Разработчики должны были предусмотреть возможность для этого". Я скопировала компонент catalog.import.1c в свою область видимости и занялась его кастомизацией.
Первое, что бросилось мне в глаза в исходном коде компонента – это вот это строка №374
$rs = $DB->Query("sel ect count(*) C fr om b_xml_tree where PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));
Здесь явно прописано имя временной таблицы, куда в процессе импорта загружается xml файл, пришедший от 1с. Естественно, если несколько баз одновременно начнут писать свои данные в одну и ту же таблицу – импорт не пройдет корректно. Поэтому я добавила к своему кастомизированному компоненту новый параметр IB_ID – уникальный идентификатор, чтобы иметь возможность разнести процесс импорта из разных баз по разным временным таблицам, и переписала эту строку следующим образом:
$rs = $DB->Query("select count(*) C fr om b_xml_tree”. $arParams["IB_ID"].” wh ere PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));
Но это еще не все: имя таблицы b_xml_tree прописано в качестве параметра по-умолчанию в конструкторах вот этих двух классов: CIBlockCMLImport и CIBlockXMLFile
Но при создании объектов этих классов в компоненте можно передать им другое имя таблицы. В стандартном компоненте написано так: (не в одном месте)
После этого я подключила свой кастомизированный компонент в скрипте импорта вместо стандартного. 1С программист из IT отдела клиента придумал, как сделать мой метод красивее: вместо того чтобы создавать несколько файлов импорта, я создала один, а параметр IB_ID 1C Программист передал в GET – запросе, кастомизировав 1С обработку на своей стороне.
Но если нет возможности передать этот параметр из 1С, можно просто создать несколько файлов импорта, в каждом из них указать при подключении компонента импорта любой придуманный IB_ID – главное, чтобы для каждого файла, он был уникальным, и указать в каждой информационной базе путь к своему скрипту импорта. После этого импорт каталога из 1С Предприятия в Битрикс может идти одновременно из нескольких информационных баз.
Данное решение было внедрено мной в ЗАО «ИСТОК» http://www.istoksochi.ru/ Для этого же интернет-магазина, мною был кастомизирован и компонент экспорта заказов из Битрикса в 1С для того, чтобы каждая база могла забирать с сайта свои заказы. Возможно, я напишу об этом подробнее в одном из будущих постов.
Юлия, спасибо за статью! Подскажите как работает выгрузка из нескольких 1С на сайт в актуальной версии Битрикс? Необходимость кастомизации компонентов по прежнему актуальна?
Используем PhpStorm для разработки На текущий момент есть много замечательных IDE с поддержкой PHP/JS/HTML, но я с давних пор пользуюсь PhpStorm Далее - подробная инструкция как начать работу с этой замечательной IDE. [spoiler]
Рассмотрим самый простой вариант - битрикс уже развернут на хостинге, есть ftp/sftp доступ. Создаем новый проект: Выбираем создание проекта из исходников, доступных по ftp: Задаем название проекта, папку, где будет находиться проект и обязательно выбираем "custom": В дополнительных настройках много пунктов, нам потребуется изменить следующие: "Upload changed files automatically to the default server" - "Always" - загружать измененные файлы на сервер "warn when uploading over newer file" - "Compare content" и "Notify about remote changes" - полезно, если над проектом работает больше одного разработчика - phpstorm будет предупреждать об изменениях файлов на сервере, это поможет избежать перезаписи изменений друг друга.
Настраиваем параметры соединения:
Далее - необходимо указать корневую папку сайта на сервере (Project root) и исключить все остальные папки(или по крайней мере папку bitrix. Иначе скачивание проекта может занять несколько часов, проще это позже сделать в фоновом режиме).
Открываем в правой части экрана вкладку "Remote Host" и заходим в настройки (иконка с тремя точками рядом с названием подключения). Во вкладке "Excluded path" удаляем из исключений все локальные папки
Теперь можно выкачивать все остальное - для этого удаляем папку из исключений (правый клик, Remove path from excluded) и выкачиваем в проект(Download from here)
Проект готов к работе:
Работаем с проектом Помимо стандартных фич (автодополнение кода, проверка на ошибки и т.д.) в PhpStorm есть множество возможностей, которые могут послужить стимулом для миграции
Одна из проблем битрикса - тяжелое наследие из старого кода, очень многие методы, которые по факту являются static, объявлены как обычные. Из-за этого автодополнение в phpstorm не может их подхватить. Решается эта проблема исключением из проекта папки bitrix/modules и подключение этой папки из замечательного проекта bxApiDocs
Еще одной киллер-фичей являются сниппеты для подключения компонентов. Для этого необходимо установить bxCompSnpt и добавлять компоненты из IDE простым нажатием комбинации Ctrl+J
При создании проекта исключил папку /bitrix/components/ как теперь ее вернуть что бы она выгрузилась локально и индексировалась? Remove Path From Exluded выставлял, Deployment => Download... на папке локальной bitrix выставлял толку ноль! Не загружается! Как быть то не могу понять.... Подскажите пожалуйста!
Вкратце: при создании раздела, если в форму редактирования выведена вкладка "Свойства элементов" (или они выведены в какой-нибудь другой вкладке), фасетный индекс начинает требовать обновления. И из-за этого время от времени пропадают товары из публички (особенности работы CIBlockElement::GetList). Ясное дело, меня это не устраивало. (Можно просто скрыть вывод "Свойств элементов", но это слишком просто для таких извращенцев, как я)
Собственно мне помогло вот это в init.php
AddEventHandler("iblock", "OnBeforeIBlockSectionAdd", "OnBeforeIBlockSectionAddHandler");
/*
* Удаляет из массива настройки свойств элементов, если они не изменились.
* Если ничего не изменилось, не придётся пересоздавать фасетный индекс.
*/
function OnBeforeIBlockSectionAddHandler(&$arFields)
{
if(!empty($arFields['SECTION_PROPERTY']))
{
$arPropLinks = CIBlockSectionPropertyLink::GetArray($arFields['IBLOCK_ID'], $arFields['IBLOCK_SECTION_ID']);
// Если у инфоблока есть торговые предложения, пройдёмся по их свойствам тоже
$arCatalog = false;
if (CModule::IncludeModule("catalog"))
$arCatalog = CCatalogSku::GetInfoByProductIBlock($arFields['IBLOCK_ID']);
if (is_array($arCatalog))
$arPropLinks += CIBlockSectionPropertyLink::GetArray($arCatalog['IBLOCK_ID']);
foreach($arFields['SECTION_PROPERTY'] as $propId => $options)
{
if(!empty($arPropLinks[$propId]))
{
// Форма возвращает нам SMART_FILTER и DISPLAY_EXPANDED либо как 'Y', либо как null,
// CIBlockSectionPropertyLink::GetArray может вернуть и 'N'. Не порядок.
if($arPropLinks[$propId]['SMART_FILTER'] === 'N')
$arPropLinks[$propId]['SMART_FILTER'] = null;
if($arPropLinks[$propId]['DISPLAY_EXPANDED'] === 'N')
$arPropLinks[$propId]['DISPLAY_EXPANDED'] = null;
if($arPropLinks[$propId]['FILTER_HINT'] === null) // такое тоже бывает
$arPropLinks[$propId]['FILTER_HINT'] = '';
foreach($options as $key => $value) {
if($arPropLinks[$propId][$key] !== $value)
return;
}
}
}
unset($arFields['SECTION_PROPERTY']);
}
}
CIBlockSectionPropertyLink::GetArray - подсмотрел в /bitrix/modules/iblock/admin/iblock_section_edit.php. Документации нет, но есть хороший комментарий здесь.
В принципе всё. В комментариях в коде самое главное написано. В любом случае, если соберётесь использовать это у себя - перепроверьте. Мало ли что.
P.S. При таком подходе (как и при скрытии вывода "Свойств элементов") у свежесозданных разделов (у которых вы ничего не меняли в "Свойствах элементов" при создании) теряется возможность редактировать эти самые "Свойства элементов", что нормально. Тут что скриптом исключай, что изначально не отображай. И тут уж вам самим выбирать, пересоздавать ли фасетный индекс при добавлении любого раздела, или получить нередактируемые поля.
Всё ещё считаю, что такое поведение GetList'а - это чёрная магия
Странно что до сих пор нет такого свойства в стандартной поставке. Может где-то проскакивало на форуме - не помню, решил написать своё для удобства работы, может кому-то пригодится:
Как использовать: 1. разместить файл CViDiPropSection.php в папке /bitrix/php_interface/lib/ 2. в файле /bitrix/php_interface/init.php добавить код:
AddEventHandler("main", "OnBeforeProlog", "IBlockOnBeforePrologHandler");
function IBlockOnBeforePrologHandler()
{
// Пользовательское свойство - привязка к разделам в виде списка
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/lib/CViDiPropSection.php");
}
После этого на странице настроек свойств инфоблока появится это свойство:
Если разделы имеют вложенную структуру - то они показываются последовательно, один под одним (после выбора раздела первого уровня предлагается выбрать раздел второго уровня, и тд.). Удобно если разделов очень большое количество.
Согласен, если методы юзертайпа не планируется использовать до вызова CIBlockProperty::GetUserType(), то можно обойтись пятым параметром AddEventHandler().
Сколько времени пишу под Битрикс, никогда не знал о существовании константы SITE_TEMPLATE_PATH (не описанной, как всегда, в документации, но любезно подсказанной моим коллегой).
После восстановления пароля, пользователь нажимает на кнопку авторизации, вводит свой логин и новый пароль, но авторизация не происходит. Ошибок не выдает, просто обновляется страница и на этом все. После повторного нажатия на кнопку авторизации - авторизует. В чем может быть проблема?
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».