class TheaterStatsAgent { public static function updateTheaterStats() { require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); // Отключаем лишнюю статистику для экономии ресурсов define('NO_KEEP_STATISTIC', true); define('NOT_CHECK_PERMISSIONS', true); define('CHK_EVENT', true); // Подключаем модули CModule::IncludeModule('crm'); CModule::IncludeModule('iblock'); // Логирование self::logMessage("=== ЗАПУСК АГЕНТА ОБНОВЛЕНИЯ СТАТИСТИКИ ==="); try { // Получаем все элементы $elements = self::getAllTheaterElements(); $processed = 0; $errors = 0; if (empty($elements)) { self::logMessage("Не найдено элементов для обработки"); return "TheaterStatsAgent::updateTheaterStats();"; } foreach ($elements as $element) { // Используем поле TITLE как название театра $theaterName = trim($element['TITLE']); if (!empty($theaterName)) { $result = self::updateTheaterStats($element['ID'], $theaterName); if ($result) { $processed++; } else { $errors++; } } else { self::logMessage("Пропущен элемент ID " . $element['ID'] . " - пустое название"); } // Небольшая пауза чтобы не перегружать сервер usleep(100000); // 0.1 секунда } self::logMessage("=== ЗАВЕРШЕНО: Обработано $processed элементов, ошибок: $errors ==="); } catch (Exception $e) { self::logMessage("КРИТИЧЕСКАЯ ОШИБКА: " . $e->getMessage()); } require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php'); return "TheaterStatsAgent::updateTheaterStats();"; } // Логирование private static function logMessage($message) { file_put_contents( $_SERVER['DOCUMENT_ROOT'].'/upload/theater_stats_log.txt', date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND | LOCK_EX ); } // Функция для получения всех элементов смарт-процесса (ID 184) private static function getAllTheaterElements() { global $DB; $elements = array(); // Получаем все элементы смарт-процесса через прямой SQL $sql = "SELECT ID, TITLE FROM b_crm_dynamic_items_184"; $result = $DB->Query($sql); while ($row = $result->Fetch()) { $elements[] = $row; } self::logMessage("Найдено элементов: " . count($elements)); return $elements; } // Основная функция обновления статистики private static function updateTheaterStats($elementId, $theaterName) { global $DB; if (empty($theaterName) || $elementId <= 0) { self::logMessage("Ошибка: Пустое название театра или ID для элемента $elementId"); return false; } self::logMessage("Обработка: $theaterName (ID: $elementId)"); // === НАХОДИМ СДЕЛКИ, ГДЕ НАЗВАНИЕ СОДЕРЖИТ ИМЯ СПЕКТАКЛЯ === $dbDeals = CCrmDeal::GetList( array('ID' => 'ASC'), array( 'CATEGORY_ID' => 19, '%TITLE' => $theaterName ), array('ID', 'UF_CRM_1675433828562') ); $dealIds = []; $showDates = []; while ($deal = $dbDeals->Fetch()) { $dealIds[] = $deal['ID']; $date = !empty($deal['UF_CRM_1675433828562']) ? $deal['UF_CRM_1675433828562'] : ''; $showDates[] = $theaterName . '|' . $date; } self::logMessage("Найдено сделок для '$theaterName': " . count($dealIds)); // === СЧИТАЕМ ЗРИТЕЛЕЙ ЧЕРЕЗ CCrmProductRow === $totalViewers = 0; if (!empty($dealIds)) { $dbProducts = \CCrmProductRow::GetList( array(), array('OWNER_TYPE' => 'D', '@OWNER_ID' => $dealIds), false, false, array('QUANTITY') ); while ($product = $dbProducts->Fetch()) { $totalViewers += intval($product['QUANTITY']); } } // === УНИКАЛЬНЫЕ ПОКАЗЫ === $uniqueShows = count(array_unique($showDates)); // === ВЫРУЧКА === $totalRevenue = 0; if (!empty($dealIds)) { $dbDealsRev = CCrmDeal::GetList( array(), array('ID' => $dealIds), array('OPPORTUNITY') ); while ($deal = $dbDealsRev->Fetch()) { $totalRevenue += floatval($deal['OPPORTUNITY']); } } // === ОБНОВЛЕНИЕ СМАРТ-ПРОЦЕССА === $sql = " UPDATE b_crm_dynamic_items_184 SET UF_CRM_5_1723445360 = " . doubleval($totalRevenue) . ", UF_CRM_5_1762189112 = " . intval($totalViewers) . ", UF_CRM_5_1762189139 = " . intval($uniqueShows) . " WHERE ID = " . intval($elementId) . " "; $result = $DB->Query($sql); if ($result) { self::logMessage("Успешно обновлен ID $elementId: Выручка=$totalRevenue, Зрители=$totalViewers, Показы=$uniqueShows"); } else { self::logMessage("Ошибка SQL для ID $elementId"); } return $result; } }
[RuntimeException] 
Could not start session because headers have already been sent. "/home/bitrix/www/bitrix/theater_agent.php":1. (0)
/home/bitrix/www/bitrix/modules/main/lib/session/session.php:143
#0: Bitrix\Main\Session\Session->start()
	/home/bitrix/www/bitrix/modules/main/lib/session/kernelsessionproxy.php:47
#1: Bitrix\Main\Session\KernelSessionProxy->start()
	/home/bitrix/www/bitrix/modules/main/include.php:182
#2: require_once(string)
	/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:19
#3: require_once(string)
	/home/bitrix/www/bitrix/modules/main/include/prolog.php:10
#4: require_once(string)
	/home/bitrix/www/bitrix/header.php:1
#5: require(string)
	/home/bitrix/www/pub/site/index.php:4
#6: include_once(string)
	/home/bitrix/www/bitrix/modules/main/include/urlrewrite.php:128
#7: include_once(string)
	/home/bitrix/www/bitrix/urlrewrite.php:2
----------