CMain::AddHeadScript, CMain::SetAdditionalCss, CMain::AddHeadString
Эти методы динамические, а класс реализует паттерн “одиночка” (Singletone) и обратиться к объекту можно через Bitrix\Main\Page\Asset::getInstance().
По слухам, этот класс может быть в скором времени переписан, так что необходимо держать руку на пульсе.
CModule::IncludeModule, CModule::IncludeModuleEx
Уже многие выучили, что вместо старого доброго CModule для подключения модулей нужно применять новый бодрый Bitrix\Main\Loader.
GetMessage, IncludeModuleLangFile, IncludeTemplateLangFile
Чтобы быть стильным-модным-молодежным рекомендуется пользоваться следующим кодом для обращения к языковым файлам и переменным:
COption::SetOptionInt, COption::SetOptionString, COption::GetOptionInt, COption::GetOptionString, COption::RemoveOption
Претерпел изменения и код для работы с чтением и записью настроек модулей. На смену классу COption пришел Bitrix\Main\Config\Option:
Пропало разделение методов на int и string, а при удалении теперь используется массив-фильтр.
В новом классе есть несколько совершенно новых методов, не имеющих “старых” аналогов, так что самостоятельное изучение исходного кода приветствуется.
CPHPCache::StartDataCache, CPHPCache::InitCache, CPHPCache::GetVars, CPHPCache::EndDataCache, CPHPCache::AbortDataCache
Спасибо Андрею Загальскому за пример работы с кешированием в ядре D7. Новый класс Bitrix\Main\Data\Cache почти ничем не отличается в обращении от старого CPHPCache.
AddEventHandler, RemoveEventHandler, RegisterModuleDependences, UnRegisterModuleDependences, GetModuleEvents
Теперь за кратко- и долгосрочную регистрацию обработчиков событий отвечает один класс: Bitrix\Main\EventManager.
Bitrix\Main\EventManager, так же как Bitrix\Main\Page\Asset, реализует паттерн Одиночка, обращаться к нему нужно через getInstance().
Важное замечание: в обработчики, зарегистрированные с помощью addEventHandler в качестве аргумента будет передан объект события (Bitrix\Main\Event). Если хотите, чтобы передавались старые добрые аргументы, нужно использоватьaddEventHandlerCompatible. Аналогично с registerEventHandler и registerEventHandlerCompatible.
CheckDirPath, DeleteDirFilesEx, RewriteFile
Тут нынче раздолье для ООП-программиста. Для работы с файлами, папками и всем прочим – отдельные классы, все типизировано и напоминает Java. Самые “главные” классы здесь – Bitrix\Main\IO\Directory и Bitrix\Main\IO\File (ну и немного Bitrix\Main\IO\Path).
Необходимо только запомнить, что DeleteDirFilesEx принимал путь от корня сайта, а его аналог принимает абсолютный путь к файлу от корня сервера.
Обратите внимание: вместо $_SERVER["DOCUMENT_ROOT"] сейчас можно использовать Bitrix\Main\Application::getDocumentRoot().
Классы для работы с файловой системой умеют многое, в этом вы можете убедиться сами, изучив исходники.
CMain::ThrowException, CMain::ResetException, CMain::GetException
Открою небольшой секрет: в нашем дружном коллективе возник локальный холивар. Мы спорили, стоит ли помещать в эту статью раздел про исключения и обработку ошибок. Ведь тут не просто одни методы заменили другие – тут изменился подход (о чем я говорил в начале статьи), были переосмыслены некоторые базовые принципы многих классов. Есть две причины, почему этот раздел все-таки опубликован:
Итак, одним из наиболее существенных изменений в D7 стала обработка ошибок при помощи механизма исключений (полное соблюдение религии исключений в php). Если происходит ошибка – выбрасываем исключение. Если хотим обработать ошибку – ловим исключение. Базовый класс для всех исключений в системе: Bitrix\Main\SystemException.
Ах, сколько раз выручал бывалого разработчика этот метод (AddMessage2Log). Неизменный товарищ при отладке ajax-запросов, крон-файлов и всего, невидимого глазу администратора. Но сегодня устарел и он, а на смену ему спешат два новых “молодца”:
Первый для любителей var_dump, второй для адептов print_r’а.
Так же в этом классе есть несколько совершенно новых методов, не имеющих аналогов в старом ядре. Например, методы для измерения времени:
CEvent::Send, CEvent::SendImmediate
Отправка почтовых событий претерпела незначительные изменения. Вместо нескольких аргументов, метод теперь принимает ассоциативный массив настроек.

Чтобы избавиться от глобальных переменных в коде (суперглобальных в том числе) в D7 изобрели класс Bitrix\Main\HttpRequest. Забирать get- и post-переменные теперь можно через него.
Конструировать объект самому не нужно, добраться до него можно через приложение и контекст (как в примере кода выше).
CMain::set_cookie, CMain::get_cookie
Класс CMain слишком много себе позволяет. Он и компоненты подключал, и CSS/JS регистрирует, и хлебные крошки собирает, и т.п. В этом разделе мы рассмотрим, куда “сбежали” методы работы с куками. В старом ядре было 2 метода: для создания и для получения кук. Теперь всё стало гораздо глубже: задавать куки нужно через класс “ответа сервера” – Bitrix\Main\HttpResponse, получать их нужно через класс “запроса к серверу” – Bitrix\Main\HttpRequest.
Также работа с куками может вестись силами класса Bitrix\Main\Web\HttpClient, но это совсем другая история.
Важное замечание: запись куки, добавленной через D7, произойдет только при подключении эпилога (там вызывается метод Bitrix\Main\HttpResponse::flush())
CMain::GetCurPageParam, DeleteParam
Для работы со ссылками в ядре D7 есть отдельный класс: Bitrix\Main\Web\Uri. Правда, работа с ним не так “компактна”, как с его предшественником. Но это лишь следствие того, что в этом классе соблюдается принцип “1 метод – 1 ответственность”.
Их реально много. Их просто нужно “знать в лицо”, так как это будет основной инструмент на многие годы, как когда-то был CIBlockElement::GetList сотоварищи. В таблице в конце статьи я приведу основные ORM-классы, на которые стоит обратить внимание уже сегодня.
Хоть это и не рекомендуется, но возможность поработать с БД прямыми запросами в продукте остается. Теперь доступ получается не через глобальный объект $DB класса CDatabase, а через Bitrix\Main\DB\Connection. “Добираться” до подключения нужно через Bitrix\Main\Application:
Хозяйке на заметку: больше про ORM и работу с БД в D7 можно почерпнуть из другой нашей статьи.
Итоговая таблица аналогов старых методов и классов в новом ядре D7 (с примерами вызова)
| Было (старое ядро) | Стало (новое ядро D7) | ||
| CMain::AddHeadScript | Bitrix\Main\Page\Asset::addJs | ||
| CMain::SetAdditionalCss | Bitrix\Main\Page\Asset::addCss | ||
| CMain::AddHeadString | Bitrix\Main\Page\Asset::addString | ||
| CModule::IncludeModule | Bitrix\Main\Loader::includeModule | ||
| CModule::IncludeModuleEx | Bitrix\Main\Loader::includeSharewareModule | ||
| GetMessage | Bitrix\Main\Localization\Loc::getMessage | ||
| IncludeModuleLangFile, IncludeTemplateLangFile | Bitrix\Main\Localization\Loc::loadMessages | ||
| COption::SetOptionInt, COption::SetOptionString, | Bitrix\Main\Config\Option::set | ||
| COption::GetOptionInt, COption::GetOptionString | Bitrix\Main\Config\Option::get | ||
| COption::RemoveOption | Bitrix\Main\Config\Option::delete | ||
| CPHPCache::StartDataCache | Bitrix\Main\Data\Cache::startDataCache | ||
| CPHPCache::InitCache | Bitrix\Main\Data\Cache::initCache | ||
| CPHPCache::GetVars | Bitrix\Main\Data\Cache::getVars | ||
| CPHPCache::EndDataCache | Bitrix\Main\Data\Cache::endDataCache | ||
| CPHPCache::AbortDataCache | Bitrix\Main\Data\Cache::abortDataCache | ||
| AddEventHandler | Bitrix\Main\EventManager::addEventHandler (новый формат), Bitrix\Main\EventManager::addEventHandlerCompatible | ||
| RemoveEventHandler | Bitrix\Main\EventManager::removeEventHandler (новый формат), Bitrix\Main\EventManager::registerEventHandlerCompatible | ||
| RegisterModuleDependences | Bitrix\Main\EventManager::registerEventHandler | ||
| UnRegisterModuleDependences | Bitrix\Main\EventManager::unRegisterEventHandler | ||
| GetModuleEvents | Bitrix\Main\EventManager::findEventHandlers | ||
| CheckDirPath | Bitrix\Main\IO\Directory::createDirectory | ||
| DeleteDirFilesEx | Bitrix\Main\IO\Directory::deleteDirectory | ||
| RewriteFile | Bitrix\Main\IO\File::putFileContents | ||
| CMain::ThrowException | Bitrix\Main\SystemException | ||
| CMain::ResetException | Bitrix\Main\SystemException | ||
| CMain::GetException | Bitrix\Main\SystemException | ||
| AddMessage2Log | Bitrix\Main\Diag\Debug::dumpToFile, | Bitrix\Main\Diag\Debug::writeToFile | |
| mydump | Bitrix\Main\Diag\Debug::dump | ||
| CEvent::Send | Bitrix\Main\Mail\Event::send | ||
| CEvent::SendImmediate | Bitrix\Main\Mail\Event::sendImmediate | ||
| $_REQUEST | Bitrix\Main\HttpRequest::get | ||
| $_GET | Bitrix\Main\HttpRequest::getQuery | ||
| $_POST | Bitrix\Main\HttpRequest::getPost | ||
| CMain::set_cookie | Bitrix\Main\HttpResponse::addCookie | ||
| CMain::get_cookie | Bitrix\Main\HttpRequest::getCookie | ||
| CMain::GetCurPageParam | Bitrix\Main\Web\Uri::addParams, | Bitrix\Main\Web\Uri::deleteParams, | Bitrix\Main\Web\Uri::getUri |
| DeleteParam | Bitrix\Main\Web\Uri::deleteParams, | Bitrix\Main\Web\Uri::getUri | |
| CDatabase::Query | Bitrix\Main\DB\Connection::query |
ORM-классы
| Класс в старом ядре | Класс в новом ядре D7 | Таблица БД |
| CUser | Bitrix\Main\UserTable | b_user |
| CFile | Bitrix\Main\FileTable | b_file |
| CGroup | Bitrix\Main\GroupTable | b_group |
| CSite | Bitrix\Main\SiteTable | b_lang |
| CIBlockElement | Bitrix\Iblock\ElementTable | b_iblock_element |
| CIBlock | Bitrix\Iblock\IblockTable | b_iblock |
| CIBlockProperty | Bitrix\Iblock\PropertyTable | b_iblock_property |
| CIBlockSection | Bitrix\Iblock\SectionTable | b_iblock_section |
| CIBlockPropertyEnum | Bitrix\Iblock\PropertyEnumerationTable | b_iblock_property_enum |
| CCatalogStore | Bitrix\Catalog\StoreTable | b_catalog_store |
| CCatalogProduct | Bitrix\Catalog\ProductTable | b_catalog_product |
| CCatalogGroup | Bitrix\Catalog\GroupTable | b_catalog_group |
| CSaleOrder | Bitrix\Sale\Internals\OrderTable | b_sale_order |
| CSaleBasket | Bitrix\Sale\Internals\BasketTable | b_sale_basket |
| CSaleOrderProps | Bitrix\Sale\Internals\OrderPropsTable | b_sale_order_props |
| CSaleOrderPropsValue | Bitrix\Sale\Internals\OrderPropsValueTable | b_sale_order_props_value |
Складывается интересная ситуация. Компания 1С-Битрикс активно рекламирует новое ядро D7, на каждой конференции все чаще слышны фразы “компонент/модуль полностью переписан на новом ядре, классах и т.п.”, старый код все чаще отмечается как @deprecated. Но при всем при этом никакой документации нет. Документация посвящена только старому ядру и если нужно познакомиться с D7 – то нужно держать руку на пульсе событий: читать исходники, форумы, блоги, общаться с техподдержкой, изучать официальные видеокурсы( Разработка на D7.Введение и D7. Разработка собственного модуля). С одной стороны, это может повысить “порог вхождения” в “клуб программистов D7” и сделать их еще более бородатыми, с другой – может отпугнуть новичков.