@Mal_va

Почему код запускается из консоли, но не запускается агентом?

Довольно странная ситуация. Есть код.

<?php

namespace Notification;

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

use Bitrix\Main\Loader;
use Bitrix\Crm\Service\Container;

class BirthDatebp
{
    private const BP_ID_7_DAYS_BEFORE = 8;
    private const BP_ID_3_DAYS_BEFORE = 10;
    private const BP_ID_BIRTHDAY = 9;

    public static function runAgent()
    {
        // Проверяем подключение модуля CRM
        if (!Loader::includeModule('crm')) {
            return;
        }

        // Получаем текущую дату
        $today = new \DateTime();
        
        // Получаем экземпляр фабрики контактов
        $contactFactory = Container::getInstance()->getFactory(\CCrmOwnerType::Contact);
        if (!$contactFactory) {
            return;
        }

        // Получаем список контактов с датой рождения
        $contactData = $contactFactory->getItems([
            'select' => ['ID', 'BIRTHDATE', 'FULL_NAME'],
            'filter' => ['!BIRTHDATE' => false]
        ]);

        foreach ($contactData as $contact) {
            $contactId = $contact->getId();
            $birthDate = $contact->get('BIRTHDATE');
            
            if (!$birthDate) {
                continue;
            }

            $birthDate = new \DateTime($birthDate);
            $birthMonthDay = $birthDate->format('m-d');
            $todayMonthDay = $today->format('m-d');

            // Проверяем за 7 дней до дня рождения
            $diff7Days = (clone $birthDate)->modify('-7 days')->format('m-d');
            if ($todayMonthDay === $diff7Days) {
                self::startBusinessProcess($contactId, self::BP_ID_7_DAYS_BEFORE);
            }

            // Проверяем за 3 дня до дня рождения
            $diff3Days = (clone $birthDate)->modify('-3 days')->format('m-d');
            if ($todayMonthDay === $diff3Days) {
                self::startBusinessProcess($contactId, self::BP_ID_3_DAYS_BEFORE);
            }

            // Проверяем, совпадает ли сегодня с днем рождения
            if ($todayMonthDay === $birthMonthDay) {
                self::startBusinessProcess($contactId, self::BP_ID_BIRTHDAY);
            }
        }

        return "Notification\\BirthDatebp::runAgent();";
    }

    private static function startBusinessProcess($contactId, $bpId)
    {
        $errors = [];
        \CBPDocument::StartWorkflow(
            $bpId,
            ['crm', 'CCrmDocumentContact', "CONTACT_{$contactId}"],
            [],
            $errors
        );

        // Логика обработки ошибок запуска, если потребуется
        if (!empty($errors)) {
            // Здесь можно добавить обработку ошибок или запись в лог
        }
    }
}


Файл init создала простенький в local/php_interface . На всякий случай и его код:

<?php

// Автозагрузка классов
spl_autoload_register(function ($className) {
    $path = $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/classes/" . str_replace("\\", "/", $className) . ".php";
    if (file_exists($path)) {
        require_once $path;
    }
});

// Подключение дополнительных файлов, если нужно
$additionalFiles = [
    __DIR__ . "/events.php",
    __DIR__ . "/functions.php"
];

foreach ($additionalFiles as $file) {
    if (file_exists($file)) {
        require_once $file;
    }
}


Нужно запустить код агентом. Проверяю через php консоль вот так:

require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
Notification\BirthDatebp::runAgent();


Код отрабатывает. Всё хорошо. БП нужные запускаются.

Ставлю агент на этот код:
Notification\BirthDatebp::runAgent();
С запуском точно в указанное время и интервалом 86400 .

Агент начинает накапливать попытки запуска, дату последнего запуска не пишет, следующий запуск не обновляет. Код соответственно не запускает.

Есть другой файл для теста делала - там просто запуск и запись перезапуска агента. Его агент ставит на новый запуск нормально.

Не понимаю куда "копать". Почему из консоли запуск есть, а из агента - нет?...
Я только учусь, потому сильно тапками не закидывайте. Спасибо.
  • Вопрос задан
  • 29 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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