Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Доступ к элементам инфоблоков в агентах

00 голосов
7
Здавствуйте!
Мне необходимо периодически изменять некоторые элементы в информационных блоках. Для этого был написан Битрикс-Агент примерно следующего содержания:
Код
<?
define('LOG_FILENAME', $_SERVER['DOCUMENT_ROOT'].'/LogItems.log'); // лог для проверки работы агента

function MyAgent(){
    global $USER;
    if (!is_object($USER)) $USER = new CUser;
    CModule::IncludeModule("iblock");          // подключаем инфоблоки 
    $_FILTER = array(
        ....
    );
    $arSelectFields = array(
        ....
    );
    $res = CIBlockElement::GetList( //делаем запрос
       array(),           // сортировка
       $_FILTER,                    // параметры запроса
       false,                         // группирвока
       false,
       $arSelectFields
    );
    $i = 0;
    while($ob = $res->GetNextElement()){
        AddMessage2Log("Выбран {$arFields["ID"]}", ''); 
       $arFields = $ob->GetFields();
       if( _Некоторое_условие_ ){
                $i++;
                AddMessage2Log("Изменён {$arFields["ID"]}", ''); 
                $el = new CIBlockElement;
                $arLoadProductArray = Array(
                    ....
                );
                $el->Update($arFields["ID"], $arLoadProductArray);
                unset($el);
      }
    }
    AddMessage2Log("наверное изменено $i элементов", ''); 

    return "MyAgent();";
}
?>

если вызвать данный код вручную (вставить на страницу, и запросить эту страницу с сервера в браузере) данный код исправно выбирает и изменяет элементы.

Однако при вызове из агента - нет ни одного выбранного элемента.

Вопрос: как же получить доступ к инфоблокам при выполнении в агенте?
спросил 26 Авг, 13 от Arahnid (280 баллов)

7 Ответы

00 голосов
Убедитесь, что агент вообще вызывается. Например, добавьте какую-нибудь запись в лог сразу после вызова.

Если агент действительно вызывается, возможно, не хватает прав доступа. Какие права доступа у инфоблока, с которым вы работаете?
ответил 26 Авг, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Убедитесь, что агент вообще вызывается. Например, добавьте какую-нибудь запись в лог сразу после вызова.

мало того, что он вызывается, и даже полностью выполняется. О чем свидетельствуют:
- дата и время последнего и следующего запуска в таблице агентов.
-
Цитата
Артем пишет:
Код
 
      ....  
      }
    AddMessage2Log("наверное изменено $i элементов", '');

    return "MyAgent();";
}

В лог добавляется эта строчка. В начале, в середине агента также есть отладочные сообщения, которые успешно в лог добавляются.


Агент выполняется.

Цитата
Dmitry Ban пишет:
возможно, не хватает прав доступа. Какие права доступа у инфоблока, с которым вы работаете?

Для всех пользователей: чтение.
Для администраторов: полный доступ

Хотите сказать, что агент вызывается от имени пользователя?
Даже если и так, как минимум, агент должен был по крайне мере прочитать элементы, и только если они подпадают под определенное условие - изменить их. но это второй вопрос. Агент не получает данных. то есть даже прочитать у него не получается.
ответил 09 Ноя, 13 от Arahnid (280 баллов)
00 голосов
Попробуйте после строчки:
if (!is_object($USER)) $USER = new CUser;
добавить:
$USER->Authorize(1);
ответил 16 Фев, 14 от Ly (4,580 баллов)
00 голосов
Спасибо за совет. Добавил, и даже переписал агент вот так:
Код
<?
define('LOG_FILENAME', $_SERVER['DOCUMENT_ROOT'].'/LogItems.log'); // лог для проверки работы агента

function MyAgent(){
    AddMessage2Log("старт в ".date('d-m-Y H:i:s'), '');
    global $USER;
    if (!is_object($USER)) $USER = new CUser; 
    if($USER->Authorize(1)){
        AddMessage2Log("Пользователь с ID=1 авторизован...", '');
        if(CModule::IncludeModule("iblock")){
            AddMessage2Log("модуль iblock подключен...", '');
            ...
            ...
            AddMessage2Log("наверное изменено $i элементов", '');
        }
    }
    AddMessage2Log("выход в ".date('d-m-Y H:i:s'), '');
    return "MyAgent();";
}
?>
в логе следующее:
Цитата
2011-03-01 12:21:35 - - старт в 01-03-2011 12:21:35
MyAgent < eval < CAgent::CheckAgents
----------
2011-03-01 12:21:35 - - Пользователь с ID=1 авторизован...
MyAgent < eval < CAgent::CheckAgents
----------
2011-03-01 12:21:35 - - модуль iblock подключен...
MyAgent < eval < CAgent::CheckAgents
----------
2011-03-01 12:21:35 - - наверное изменено 0 элементов
MyAgent < eval < CAgent::CheckAgents
----------
2011-03-01 12:21:35 - - выход в 01-03-2011 12:21:35
MyAgent < eval < CAgent::CheckAgents
----------

снова все выполняется, и даже происходит авторизация админа, и подключение модуля информационных блоков. Однако в результате выбора элементов нет ни одного элемента.

Формулировка запроса корректна, т. к.
Цитата
Артем пишет:
если вызвать данный код вручную (вставить на страницу, и запросить эту страницу с сервера в браузере) данный код исправно выбирает и изменяет элементы.
ответил 06 Июнь, 14 от Arahnid (280 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
$USER->Authorize(1);

Нет-нет, плохая практика - делать на случайном хите пользователя админом. В API инфоблоков можно передать параметр "не проверять права доступа" - как раз для таких случаев. См. документацию.
ответил 04 Окт, 14 от Ixie (540 баллов)
00 голосов
Цитата
Vadim Dumbravanu пишет:
Нет-нет, плохая практика - делать на случайном хите пользователя админом. В API инфоблоков можно передать параметр "не проверять права доступа" - как раз для таких случаев.

Да, действительно, плохая.
Но делать define("NOT_CHECK_PERMISSIONS", true); на случайном хите тоже не фонтан, хотя и много меньшше зло.
ответил 06 Фев, 15 от Ly (4,580 баллов)
00 голосов
Да нет же. :) Речь конкретно об инфоблоках, а не глобальных константах:

http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php

arFilter CHECK_PERMISSIONS - если установлен в "Y", то в выборке будет осуществляться проверка прав доступа к информационным блокам. По умолчанию права доступа не проверяются.

Но, судя по доке, по умолчанию - не проверяются. Т.е. дело не в правах доступа, в чем-то другом.
ответил 19 Май, 15 от Ixie (540 баллов)

Похожие вопросы