Scope: Bitrix24 on-premise · Verified: crm 26.800.0, main 26.800.0
PHP running inside the portal: /local/ modules, handlers, agents. Calling CRM over REST: bitrix24-rest-api.
| Task | Read |
|---|---|
| Container, Factory, reading items, field names, phones/e-mails | rules/factory-items.md |
| Add/update/delete, Context, checks, custom actions | rules/operations.md |
| Smart processes, funnels, stages, smart invoices | rules/smart-processes.md |
| Rights checks, permission-filtered lists | rules/permissions.md |
| Reacting to changes, factory override, robots, triggers | rules/events-automation.md |
| Timeline comments, to-dos, activities | rules/timeline-activities.md |
| Fields collection, user fields | rules/fields-uf.md |
CCrmDeal/CCrmLead/… replacements, D7 ↔ REST map |
rules/legacy-rest.md |
Invariants
Loader::includeModule('crm')first; get services fromContainer::getInstance().- Write only through Factory operations:
getAddOperation()/getUpdateOperation()/getDeleteOperation()→launch(). NeverDealTable::add(),$factory->getDataClass()::update(),Item::save()/Item::delete(): they skip rights, required fields, events, timeline, search index and robots. - Use
Item::FIELD_NAME_*names; the factory maps them to entity columns (leadSTAGE_ID→STATUS_ID). - Dynamic
entityTypeId, funnel and stage IDs differ per portal: resolve by code or semantics at runtime, never hardcode. - Agents, CLI and queues have no user: pass a
Contextwith a user ID, or disable the access check on purpose. - Check
isSuccess()of everylaunch()and pass its errors up.