Битрикс. Пустой список, возвращаемый ::GetListEx

Расскажу почему может возвращаться пустой список после применения метода GetListEx к "объекту" битрикса. Я называю их объектами, а не классами, ибо по-началу когда знакомился с битриксом классом их не назовешь, написаны были не очень, но сейчас вроде как код приводится в порядок с обновами, но так в душу и запало неведомый "объект" ^_^. Продолжим.

Часто можно встретить такую ситуацию, когда вызываешь свой скрипт в отдельном от битрикса файле, даже если подключил интерпретатор, убрал стату и написан пролог. Т.е. другими словами, при запуске скрипта из браузера, то все работает, а если его запускать с сервака(с агента, с крона), то в том месте, где мы вызываем GetListEx(), у нас пустой массив, это при условии, что он в общем то не должен быть пустым. Вернее не так, он то на самом деле сам не пустой, в нем просто нет наших элементов, ибо, проблема кроется за малым.

Хочу пробежаться по всем компаниям в отдельном php скрипте вне Битрикса, но используя API Битрикса. Даю пример:

#!/usr/bin/php
<?php

$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../..");

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
set_time_limit(0);

CModule::IncludeModule('crm');

//Хочу занести в $obResCompany все компании из CRM
$obResCompany = CCrmCompany::GetListEx(false,false,false,false,false);
//Но получаю пустой массив
while ($arResCompany = $obResCompany->Fetch())
{
    //И сюда, я получается не захожу :(
    echo '<pre>';
    print_r($arResCompany);
    echo '</pre>';
}

?>

Решение проблемы оказалось как всегда пятиминутным и простым, но для него мне пришлось потратить пару часов своего времени. Все что нужно сделать - вспомнить про фильтр в функции GetListEx (второй параметр), и еще знать, что при запросе данных через эту функцию идет проверка прав.

Поэтому, если нужен полный доступ, то нужно его прописать в фильтре: "CHECK_PERMISSIONS" => "N". Должно получиться так:

#!/usr/bin/php
<?php

$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../..");

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
set_time_limit(0);

CModule::IncludeModule('crm');

//Пишем, что не хотим проверять права
$arFilter = array(
    "CHECK_PERMISSIONS" => "N"
);
//Хочу занести в $obResCompany все компании из CRM
$obResCompany = CCrmCompany::GetListEx(false,$arFilter,false,false,false);
//Получаю все компании
while ($arResCompany = $obResCompany->Fetch())
{
    //И сюда, я попадаю :)
    echo '<pre>';
    print_r($arResCompany);
    echo '</pre>';
}

?>

Привет из прошлого, тому настоящему, что это читает, а также удачи! :)

Комментарии (1)
  • Аноним 05 февраля 2021, 06:49 # 0
    Объект — это экземпляр класса. Статические методы вызываются без создания экземпляра, поэтому употребление термина «объект» неправильно. Если код объявлен как класс, то это класс, независимо от того, хороший код или плохой.
    1. Написать комментарий