Bitrix24 Apps & BITRIX24-PHP-SDK
153 subscribers
11 photos
8 videos
54 links
Разработка приложений для Bitrix24 на базе BITRIX24-PHP-SDK
Download Telegram
Media is too big
VIEW IN TELEGRAM
BITRIX24-PHP-EXAMPLES-08

tl;dr;
— работа с batch-запросами
— CLI приложения на symfony console
— обработка сигналов POSIX

📺 https://youtu.be/Lg-FITVElNc
2👍1
🚀 1.5.0 – 2025.08.01

Added
- service Services\Entity\Section\Service\Section with support methods,
see [crm.entity.section.* methods](https://github.com/bitrix24/b24phpsdk/issues/200):
- service Services\Entity\Item\Property\Service\Property with support methods:
- service Services\Department\Service\Department with support methods,
see [department.* methods](https://github.com/bitrix24/b24phpsdk/issues/204):
- service CRM\Requisites\Service\RequisiteUserfield with support methods,
see [add crm.requisite.userfield.* methods](https://github.com/bitrix24/b24phpsdk/issues/188):
- service CRM\Requisites\Service\RequisiteBankdetail with support methods:
- service CRM\Requisites\Service\RequisiteLink with support methods:
- service CRM\Requisites\Service\RequisitePresetField with support methods:
- service Services\CRM\Status\Service\Status with support methods,
see [crm.status.* methods](https://github.com/bitrix24/b24phpsdk/issues/194):
- service Services\CRM\Status\Service\StatusEntity
- service Services\CRM\Timeline\Service\Comment with support methods,
see [crm.timeline.comment.* methods](https://github.com/bitrix24/b24phpsdk/issues/196):
- Added support for events:
- OnCrmTimelineCommentAdd
- OnCrmTimelineCommentDelete
- OnCrmTimelineCommentUpdate
- service Services\CRM\Timeline\Service\Bindings
- service Services\CRM\Item\Productrow\Service\Productrow with support methods,
see [crm.item.productrow.* methods](https://github.com/bitrix24/b24phpsdk/issues/198)

Fixed
- Fixed typehints in Contact batch for method add, [see details](https://github.com/bitrix24/b24phpsdk/issues/202)

Changed
- Fixed constructor arguments in tests ApplicationInstallations [see details](https://github.com/bitrix24/b24phpsdk/issues/191)
- Bump giggsey/libphonenumber-for-php version to ^8|^9

Statistics
Bitrix24 API-methods count: 1166
Supported in bitrix24-php-sdk methods count: 362
Coverage percentage: 31.05%

https://github.com/bitrix24/b24phpsdk/releases/tag/1.5.0
Привет, текущее положение дел по шаблонам приложений

1. Самый нижний слой — SDK
https://github.com/bitrix24/b24phpsdk — плановые релизы раз в месяц по расширению функционала библиотеки.

2. Слой хранения данных — фреймворк-агностик (не зависящий) от фреймворка
https://github.com/mesilov/bitrix24-php-lib/
Тут созданы две сущности отвечающие контрактам из b24phpsdk:
Bitrix24Accounts — храним токены и вот это все связанное с их жизненным циклом
ApplicationInstallations — храним факты установок \ удаления приложения и его жизненного цикла

Т.е. это тот самый минимум, который надо для запуска:
- локального приложения
- тиражного приложения

На этой неделе закончим причесывать до первого релиза 0.x
Т.к. тут уже вариативность существенно больше, то пилим с двумя другими разработчиками, MIT вот это все.

Если прям придерживаться symfony \ laravel way, то там надо делать Symfony‑bundle и Laravel‑adapter, там есть выбор, чтобы это было в одном репе или несколькро репов.
Сейчас, если разработчик на Symfony \ laravel захочет использовать bitrix24-php-lib, то ему придется руками все что надо сконфигурировать у себя (пока нет бандла \ адаптера). Есть такие?

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

3. Шаблоны репозиториев на Symfony \ Laravel
Основная точка приложения усилий, сейчас собираю шаблон симфони, чтобы проверить сценарии которые реализует bitrix24-php-lib и то насколько безболезненно можно все в кучу собрать.
https://github.com/mesilov/bitrix24-application-symfony-template — работы тут
Как только отлажу на симфони сценарии (установка, удаление, очереди и т.д), то можно будет сделать бандл \ и адаптер для Laravel.
Такие вот дела.
🔥4👍2
Что по инфраструктуре?

Приложение работает поверх инфраструктуры, нфраструктурной единицей у нас будет докер-контейнер.
Вопрос в том, что будем выбирать в качестве аппликейшн\веб-сервера. Какие у нас варианты:

Встроенный в PHP dev-сервер
Все запускаем на встроенном в PHP дев-сервере, а production конфигурация это не наша головная боль. Крутитесь как хотите.
У всех пользователей начинает болеть голова, а как это вот все запускать и обслуживать.

nginx + phpfpm
Есть миллион рецептов, проверено годами, собрали @ запустили, для production контура каждый самостоятельно решает ряд вопросов: выпуск сертификатов, логи, телеметрия и т.д.
ru и западное комьюнити в целом понимают, что это такое и как настраивать. На уровне шаблонов приложений даем базовую конфигурацию и дальше сами конфигурируйте как хотите.
Отложенная проблема: развитие nginx начиная с 2022 года стагнирует. Приложения для Битрикс24 не упрутся в «архитектурные» ограничения nginx, но вот экосистема не предоставляет удобных решений «из коробки», настраивайте все сами, как лично вам удобно будет ©.

angie
Это форк nginx от русскоязычной части core-команды nginx, развивается более динамично, русскоязычное комьюнити. Если у вас есть «черный пояс по nginx», то это хорошая замена, которая отвечает на значительную часть требований к современному приложению. Если говорим про западное комьюнити, то выбор angie вызовет некоторые вопросики.
Ну и никуда не девается история с long-running режимом работы php, к которому старательно пытается подойти php-комьюнити.
Более детально с tech-drama можно ознакомиться глянув эти доклады:
https://www.youtube.com/watch?v=Qx9BB7w4mt4 — php и angie
https://www.youtube.com/watch?v=QeI5GMP4ukM&t=15s — деды под пиво бухтят и рассказывают закулисную часть истории

frankenphp
Если вы последний год сидели в пещере и пропустили все новости, то у PHP появился свой application-server.
https://thephp.foundation/blog/2025/05/15/frankenphp/
Из минусов: нужно выучить новый «птичьий язык» конфигурации веб-сервера caddy.
Из плюсов:
— аппликейшн-сервер развивают люди, которые знают с какой стороны PHP запрягать — Kévin Dunglas, creator of API Platform and Symfony Core Team member.
— готовые сценарии для наших любимых фреймворков (Symfony, Laravel, БУС)
— комьюнити адаптирует фреймворки\сценарии и всю обвязку под текущий стек, а под условный nginx вы должны будете портировать конфиги сами.

Поэтому, выбираем в качестве application-server frankenphp 🤔 и на нем отлаживаем «production-ready» конфигурацию приложения, заодно посмотрим, как это выглядит в реальности, а не на бодрых докладах инфлюенсеров с ютьюба, у которых все само работает.
🤯1
🚀 1.7.0

Added
- Services\Sale\Delivery\Service\Delivery, see sale.delivery.*
- Services\Sale\DeliveryRequest\Service\DeliveryRequest sale.delivery.request.*
- Services\Sale\DeliveryExtraService\Service\DeliveryExtraService with support methods see sale.delivery.extra.service.*
- Services\Sale\DeliveryHandler\Service\DeliveryHandler see sale.delivery.handler.*
- Services\Disk\Service\Disk see disk service methods
- Services\Disk\Storage\Service\Storage see disk.storage.*
- Services\Disk\Folder\Service\Folder see disk.folder.*
- Services\Disk\File\Service\File see disk.file.*
- Services\CRM\Documentgenerator\Numerator see crm.documentgenerator.numerator.*
- Services\Paysystem\Handler\Service\Handler see pay_system.handler.*
- Services\Paysystem\Service\Paysystem see sale.paysystem.*
- Services\Paysystem\Settings\Service\Settings see sale.paysystem.settings.*
- Services\Sale\Shipment\Service\Shipment see sale.shipment.*
- Services\Sale\ShipmentProperty\Service\ShipmentProperty see sale.shipmentproperty.*
- Services\Sale\ShipmentPropertyValue\Service\ShipmentPropertyValue see sale.shipmentpropertyvalue.*
- Services\Sale\ShipmentItem\Service\ShipmentItem see sale.shipmentitem.*
- Services\Sale\Payment\Service\Payment see sale.payment.*
- Services\Sale\CashboxHandler\Service\CashboxHandler see sale.cashbox.handler.*
- Services\Sale\Cashbox\Service\Cashbox see sale.cashbox.*
- Services\Calendar\Service\Calendar see calendar.*
- Added support for events:
- OnCalendarSectionAdd
- OnCalendarSectionUpdate
- OnCalendarSectionDelete
- Services\Calendar\Event\Service\Event see calendar.event.*
- Services\Calendar\Resource\Service\Resource see calendar.resource.*
- Services\Sale\PaymentItemBasket\Service\PaymentItemBasket see sale.paymentitembasket.*
- Services\Sale\PaymentItemShipment\Service\PaymentItemShipment see sale.paymentitemshipment.*
- Services\Sale\PropertyRelation\Service\PropertyRelation sale.propertyRelation.*

Fixed
- Fixed Incorrect data loading in Core\Batch::getTraversableList() with desc sorting by ID

Statistics

Bitrix24 API-methods count: 1162
Supported in bitrix24-php-sdk methods count: 632
Coverage percentage: 54.39% 🚀

See details in https://github.com/bitrix24/b24phpsdk/releases
🔥4
🚀 1.8.0

Added
- Added service Services\CRM\Type\Service\Type
- For AbstractCrmItem added method getSmartProcessItem to get smart process item
- Added support for events
- Added separated methods RemoteEventsFactory::create and RemoteEventsFactory::validate for create and validate incoming
events
- Added comprehensive unit tests for RemoteEventsFactory::create and RemoteEventsFactory::validate methods
- Updated ContactPersonInterface implementation
- Added comprehensive unit tests for UTMs
- Added comprehensive unit tests for UserAgentInfo
- Added support for dynamic OAuth server selection based on regional endpoints
- Added comprehensive unit tests for Endpoints

Changed
- Breaking changes in ContactPersonInterface method signatures:
- changeEmail(?string $email) - removed second parameter ?bool $isEmailVerified. Migration path: call markEmailAsVerified() separately after changeEmail() if email needs to be verified
- changeMobilePhone(?PhoneNumber $phoneNumber) - removed second parameter ?bool $isMobilePhoneVerified. Migration path: call markMobilePhoneAsVerified() separately after changeMobilePhone() if phone needs to be verified
- Replaced getUserAgent(), getUserAgentReferer(), getUserAgentIp() methods with single getUserAgentInfo(): UserAgentInfo method that returns complete user agent information object. Migration path: use $info->userAgent, $info->referrer, $info->ip properties instead
- Updated RemoteEventsFactory::validate() method signature from validate(EventInterface $event, string $applicationToken) to
validate(Bitrix24AccountInterface $bitrix24Account, EventInterface $event).
- Docker configuration updated to PHP 8.4
- Development environment now uses PHP 8.4.14 (docker/php-cli/Dockerfile):
- PHP 8.4 compatibility improvements:
- OAuth server selection made dynamic:

Fixed
- Fixed wrong offset in ItemsResult
- Fixed wrong exception for method crm.item.get, now it ItemNotFoundException
- Fixed added type project in enum PortalLicenseFamily
- Fixed errors in ContactPersonRepositoryInterfaceTest
- Breaking change: Fixed method signature Credentials::createFromOAuth() - third parameter changed from string $domainUrl to Endpoints $endpoints
object
- Migration: Replace Credentials::createFromOAuth($authToken, $appProfile, 'https://example.com') with Credentials::createFromOAuth($authToken, $appProfile, new Endpoints('https://example.com', 'https://oauth.bitrix.info/'))
- Updated all unit and integration tests to use new signature
- Fixed bug in Endpoints class constructor
- Fixed unit tests in CredentialsTest.php to properly instantiate Endpoints objects
- Fixed unit tests in CoreTest.php integration test to use Endpoints object

Deprecated
- Method RemoteEventsFactory::createEvent marked as deprecated, use RemoteEventsFactory::create and RemoteEventsFactory::validate instead

Statistics
Bitrix24 API-methods count: 1162
Supported in bitrix24-php-sdk methods count: 639
Coverage percentage: 54.99% 🚀
Supported in bitrix24-php-sdk methods with batch wrapper count: 91

https://github.com/bitrix24/b24phpsdk/releases/tag/1.8.0
🔥1
Привет, вышел новый релиз 0.3.0 bitrix24-php-lib, это библиотека которая отвечает за работу с ключевыми подсистемами вашего тиражного или локального приложения:
— Bitrix24 accounts храним авторизационные токены
— Installation facts храним факты установок и удаления приложений
— ApplicationSettings 🆕🚀 настройки уровня приложения, департамента, пользователя, храним в привязке к installation facts
— ContactPersons work in progress кто ставил приложение и как с ним связаться для оказания саппорта
— Bitrix24Partners work in progress, кто из партнеров поставил приложение, да, те самые Partners Friendly, спасибо Ивану Санникову @zametki_na_polyah за идею
— Application Journal work in progress, журнал приложения, содержащий бизнесовые события, ваш саппорт скажет вам спасибо.

Как вы понимаете, основная задача — отдать максимум «типового» функционала в стартер приложения

https://github.com/mesilov/bitrix24-php-lib
4🔥7
Запрыгиваем в последний вагон! Как выиграть два бесплатных билета смотрим внизу 👇

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

С 1 по 5 декабря идет Podlodka PHP Crew о том, как ускорить PHP-разработку без стресса и перегрузов.

Все темы прикладные, с упором на ускорение команд и уменьшение рутины:

📄 Контракты пишем — код генерим Александр Забанов (Вебпрактик): contract-first подход, который снижает количество ошибок и делает интеграции предсказуемыми.

⚙️ Background-агенты в разработке — Пётр Мязин («Пятиминутка PHP») покажет, как построить процесс вокруг ИИ-инструментов.

🧩 Тесты для ускорения Александр Макаров (Twindo): о роли тестирования в скорости разработки и как распределить ответственность между разработчиками, QA и LLM.

🚦 Светофоры для разработчиков — Ярослав Тарасов (Skyeng) расскажет, как ускорить обратную связь от коммита до продакшена.

🔥 Баланс фич и техдолга — Дмитрий Кириллов поделится холиварным кейсом «100% фичи, 0% техдолг».

🤖 От промпта к продакшену — Павел Бучнев (Spiral Scout, 🔥) объяснит, почему пора мыслить контекстами, а не только промптами.

Программа и билеты: https://podlodka.io/phpcrew


Что делать?
- подписаться на канал https://t.me/bitrix24phpsdk
- написать комментарий к этому сообщению
- розыгрыш промокодов сегодня в 10:00 по Москве
Please open Telegram to view this post
VIEW IN TELEGRAM
Сейчас на стадии обсуждения вопрос про поддержку новой версии API в текущем SDK, пока вижу так, список ломающих изменений закину в ишулю, если у вас есть дополнительные предложения, то сейчас самое время их озвучить тут или на github

https://github.com/bitrix24/b24phpsdk/issues/317
1.9.0 🚀

Added
- Added ApplicationSettings contracts for managing application configuration settings with support for multiple scopes (global, user-specific, department-specific).
- Added VersionedScope container class for managing multiple Scope instances with version support.
- Added MCP (Model Context Protocol) server configuration for Bitrix24 API documentation.
- Added .claude/mcp_settings.json with Bitrix24 MCP server setup.
- Added specialized exceptions for OAuth token refresh errors.

Changed
- Updated darsyn/ip dependency constraint to support version 6.x alongside versions 4.x and 5.x

Fixed
- Fixed MOVED_TIME field in DealItemResult and LeadItemResult to return CarbonImmutable instead of int
- Fixed invalid type casting hints in FlowItemResult
- Improved error handling during OAuth token refresh in ApiClient::getNewAuthToken()
- Fixed testFindByEmailWithVerifiedEmail test in ContactPersonRepositoryInterfaceTest to properly mark email as verified
- Fixed testDelete test in ContactPersonRepositoryInterfaceTest to call flush() after delete

Statistics
Bitrix24 API-methods count: 1165
Supported in bitrix24-php-sdk methods count: 640
Coverage percentage: 54.94% 🚀


https://github.com/bitrix24/b24phpsdk/releases/tag/1.9.0
👍2
Фильтрация в B24-PHP-SDK для v3 — делаем или нет?

Привет, это пост для обсуждения надо ли добавлять поддержку фильтрации в сервисы, которые получают сделки, задачи, контакты и т.д.
Ишью с критериями и описанием возможностей фильтрации — https://github.com/bitrix24/b24phpsdk/issues/338

Я хочу собрать обратную связь от комьюнити PHP-разработчиков.

Есть два варианта:

Как обычно
Принимаем массив, а если разработчик накосячил, то он сам виноват, что не может запомнить код служебного поля в сделке 😀

$deals->getList(
[
["status", "=", "NEW"],
["id", "in", [3,4,5]]
]
);


Делаем билдеры и заморачиваемся

Накидал требований, которые описывают мои ожидания от фильтра, если вы уже повидали некоторое дерьмо, то расскажите, пожалуйста, о своем опыте.

1. Фильтрация идет по полям конкретной сущности

$deals->getList(
new DealFilter()
->title('OpenAI')
->price(100500)
);


2. Поддержка пользовательских полей: на конкретном портале могут добавить 100500 полей разных типов в сущность, например в сделку.

$task->getList(
new TaskFilter()
->title('ASAP')
->withUserField('UF_CRM_1234567890','danger')
);


3. поддержка операторов: greater than, in, not equal etc.

$deals->getList(
new DealFilter()
->title()->eq('ASAP')
->id()->in([1,2,3]
);


4. Поддержка вложенных блоков or

$deals->getList(
new DealFilter()
->status()->eq('NEW')
->or(function (DealFilter $f) {
$f->id()->in([1, 2]);
$f->stageId()->eq('WON');
$f->userField('UF_CRM_1700000000')->eq('yes');
})
);


5. Поддержка raw-массива для олдов

$deals->getList(
new DealFilter()
->withRaw(
[
["status", "=", "NEW"],
["id", "in", [3,4,5]]
]
)
);


5. Все эти фильтры надо генерить из метаданных OA3 спецификации и при появлении изменений — ребилдить.

Что вас бесит в таких штуках?
Где вам понравилась реализация подобных фильтров?
Please open Telegram to view this post
VIEW IN TELEGRAM
https://ai.symfony.com/ — первый релиз одной из подсистем, куда они направляли усилия в 2025 году. Если планируете трогать на новогодних праздниках, то отпишите пожалуйста свои впечатления
🔥2
1.10.0 🚀

Added
- Service Services\IMOpenLines\Config\Service\Config
- Service Services\IMOpenLines\CRMChat\Service\Chat
- Service Services\IMOpenLines\Message\Service\Message
- Service Services\IMOpenLines\Bot\Service\Bot
- Service Services\IMOpenLines\Operator\Service\Operator
- Service Services\IMOpenLines\Session\Service\Session
- Service Services\SonetGroup\Service\SonetGroup
- Service Services\IMOpenLines\Connector\Service\Connector

Statistics

Bitrix24 API-methods count: 1165
Supported in bitrix24-php-sdk methods count: 697
Coverage percentage: 59.83% 🚀
Supported in bitrix24-php-sdk methods with batch wrapper count: 91

https://github.com/bitrix24/b24phpsdk/releases/tag/1.10.0
👍3🔥2
🤖 AI в практике разработчиков: новый сезон Podlodka AI Crew

«Мы поигрались с промптом, но пока не внедряли» — часто разговоры про AI в разработке заканчиваются именно так.

Инструментов всё больше, а вот времени на то, чтобы разобраться и сделать так, чтобы магия заработала, порой не хватает.

С 16 по 20 февраля у Podlodka AI Crew пройдёт сезон «AI-агенты в разработке»: проверенные рабочие сценарии от практиков индустрии.

👀 В программе:
единый AI-workflow для разработчика
автоматизация стендапов и работы с документацией
Claude Code, субагенты для кодинга
практические кейсы внедрения AI в SRE
подходы к созданию промптов с насыщенным контекстом

Формат — классический для Podlodka Crew: 5 дней, 10+ спикеров, 10 сессий и закрытое комьюнити в Telegram.

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

👉🏻Если тема AI в разработке вам интересна и хочется меньше хайпа, больше дела — держите ссылку.

До 10 февраля можно забрать билет по early-bird цене! А по промокоду ai_crew_2_VP0u7O получите скидку🎁
👍2
3.0.0 🚀

Added
API v3 support: Tasks & EventLog 🎉
- Added support for Bitrix24 API v3
- Added REST 3.0 API version support:
- Core\Contracts\ApiVersion
- Core\EndpointUrlFormatter

- Added type-safe filter builder system for REST 3.0 filtering
- Added select builder infrastructure for type-safe field selection:
- Added OpenAPI schema infrastructure
- Switched Task domain methods to Bitrix24 API v3 and documented services/methods currently using v3:
- Services\Task\Service\Task
- Services\Task\Service\TaskChat
- Services\Task\Service\TaskFile
- Services\Main\Service\Documentation

- Added service Services\Main\Service\EventLog with REST v3 event log methods
- Added Services\Main\Service\EventLogSelectBuilder — fluent select builder for event log fields
- Added Services\Main\Service\EventLogFilter — type-safe filter builder with typed condition builders per field

Everything else
- Added deptrac/deptrac (`^3.0`) as a dev dependency — architectural layer enforcement tool.
- Added Services\AbstractSelectBuilder::allSystemFields() — convenience method that uses reflection
- Added src/Legacy/ namespace with LegacyServiceBuilder and LegacyTaskServiceBuilder, accessible via $serviceBuilder->getLegacyServiceBuilder()->getTaskScope()->task().
- Services\Lists\Lists\Service\Lists
- Services\Lists\Field\Service\Field
- Services\Lists\Section\Service\Section
- Services\Lists\Element\Service\Element
- Services\Landing\Site\Service\Site
- Services\Landing\SysPage\Service\SysPage
- Services\Landing\Role\Service\Role
- Services\Landing\Page\Service\Page
- Services\Landing\Block\Service\Block
- Services\Landing\Template\Service\Template
- Services\Landing\Repo\Service\Repo
- Services\Landing\Demos\Service\Demos
- Services\IMOpenLines\Connector\Service\Connector
- Services\IMOpenLines\Config\Service\Config
- Services\IMOpenLines\CRMChat\Service\Chat
- Services\IMOpenLines\Message\Service\Message
- Services\IMOpenLines\Bot\Service\Bot
- Services\IMOpenLines\Operator\Service\Operator
- Services\IMOpenLines\Session\Service\Session
- Services\SonetGroup\Service\SonetGroup

- Added isPartner(): bool method to ContactPersonInterface to check if the contact person is a partner employee

Changed
- Breaking changes in Bitrix24PartnerInterface and Bitrix24PartnerRepositoryInterface
- Renamed getBitrix24PartnerId(): int to getBitrix24PartnerNumber(): int in Bitrix24PartnerInterface to clarify that this method returns the partner's external vendor site number, not an internal database ID
- Renamed findByBitrix24PartnerId(int $bitrix24PartnerId) to findByBitrix24PartnerNumber(int $bitrix24PartnerNumber) in Bitrix24PartnerRepositoryInterface
- ContactPersonInterface::markMobilePhoneAsVerified() now accepts an optional ?CarbonImmutable $verifiedAt = null
- ContactPersonInterface::markEmailAsVerified() now accepts an optional
?CarbonImmutable $verifiedAt = null parameter.
- Updated: ContactPersonInterface, ContactPersonReferenceEntityImplementation,
ContactPersons.md documentation, added testMarkEmailAsVerifiedWithSpecificDate unit test.
- Removed deprecated RemoteEventsFabric

Fixed
- Fixed handling of scope and licence_family fields.

https://github.com/bitrix24/b24phpsdk/releases
👍3
0.4.0 🚀

Added
- ContactPersons support (main feature of 0.4.0)
- Added ApplicationInstallations\UseCase\InstallContactPerson\Command / Handler to create and link a ContactPerson to an ApplicationInstallation
- Added ApplicationInstallations\UseCase\UnlinkContactPerson\Command / Handler to unlink a contact person from an installation
- Added ContactPersons\UseCase\ChangeProfile\Command / Handler to update FullName, email, and mobile phone
- Added ContactPersons\UseCase\MarkEmailAsVerified\Command / Handler to confirm email ownership
- Added ContactPersons\UseCase\MarkMobilePhoneAsVerified\Command / Handler to confirm mobile phone ownership
- `ContactPersonType` enum (`personal` | partner`) in `Bitrix24\Lib\ContactPersons\Enum

Changed
- `ContactPerson` entity
- Constructor accepts optional $createdAt / $updatedAt parameters so SDK contract tests can assert stable timestamps
- $isEmailVerified and $isMobilePhoneVerified are initialized from $emailVerifiedAt / $mobilePhoneVerifiedAt in constructor
- getBitrix24UserId() return type narrowed from ?int to int to match ContactPersonInterface
- markAsDeleted() now throws InvalidArgumentException (was `LogicException`) to satisfy the SDK contract
- `ApplicationInstallation` entity
- unlinkContactPerson() and unlinkBitrix24PartnerContactPerson() now return early when the respective ID is already null to avoid unnecessary updatedAt mutation
- `OnAppInstall\Handler`
- Now throws ApplicationInstallationNotFoundException when installation cannot be found by member ID (instead of silent no-op)

Fixed
- SDK contract compatibility after `bitrix24/b24phpsdk` update
- Updated createContactPersonImplementation() signatures in ContactPersonTest and ContactPersonRepositoryTest (`int $bitrix24UserId` moved to position 5 and made non-nullable)
- Narrowed ContactPersonBuilder::$bitrix24UserId from ?int to int
- Restored green unit test suite (`170` tests)

https://github.com/mesilov/bitrix24-php-lib/releases
Спасибо Кириллу и Андрею за огромный вклад в разработку

следующий шаг — попробовать собрать реальное тиражное приложение поверх всего этого добра и обновить AI-стартер
🔥4
bitrix24-php-lib v0.5.0 🚀
Набор сущностей для разработки приложений

Added
- Journal bounded context — 72
- Install-flow documentation

Changed
- Application installation flow — 90
- Install now distinguishes one-step installs with applicationToken from UI/two-step installs without token
- OnAppInstall is now the canonical finish-step for pending installations created without a token
- Duplicate ONAPPINSTALL events for already active installations are handled as warning no-op calls
- Domain value object namespace
- Bitrix24\Lib\Bitrix24Accounts\ValueObjects\Domain moved to Bitrix24\Lib\Common\ValueObjects\Domain
- Updated install-related commands and tests to use the shared namespace
- Developer workflow docs
- Added project-level MCP configuration in .mcp.json
- Documented MCP checks and mandatory Makefile entrypoints for tests and linters in README.md and AGENTS.md

BC⚠️
- Doctrine schema naming normalization — 93
- Tables renamed:
- application_installation -> b24lib_application_installations
- application_settings -> b24lib_application_settings
- bitrix24account -> b24lib_bitrix24_accounts
- contact_person -> b24lib_contact_persons

Fixed
- Premature activation during install — 90
- Bitrix24Account and ApplicationInstallation no longer switch to active when Install is called without applicationToken
- Finish events are no longer emitted before Bitrix24 sends the token-bearing finish step
- Reinstall handling
- Reinstall over pending installations now blocks and archives the previous installation pair before creating a new one

https://github.com/mesilov/bitrix24-php-lib
👍3
🧭 Разбираем современный PHP вместе с Podlodka PHP Crew

PHP-стек может устаревать незаметно: решения вроде бы работают, но скорость разработки снижается, стоимость поддержки растёт, а количество возможностей сокращается.

💡 Эксперты Podlodka PHP Crew собрали онлайн-конференцию «Современный стек PHP-разработки», чтобы разобраться, как всё устроено сегодня.

🗓С 20 по 24 апреля участники:

• изучат, как сегодня запускают PHP-приложения
(worker mode, новые рантаймы, FrankenPHP),

• посмотрят, как изменилась инфраструктура и что пора выкинуть из Docker-стека,

• обсудят, как реально применять AI-агентов
в разработке (не только писать код, но и расследовать баги и планировать изменения),

• разберут практические кейсы (например, в онлайн-режиме будут запускать мультиплеерную игру на PHP с Temporal и RoadRunner),

• и в целом поймут, какие инструменты и подходы действительно стоит внедрять в 2026.

Формат — пять дней живых Zoom-сессий по утрам и вечерам, закрытое комьюнити в Telegram и общение со спикерами.

Если хотите обновить свой стек и лучше понимать, куда движется разработка на PHP — обязательно присоединяйтесь👇

🎟
Покупай билет и залетай прямо перед погружением!


По промокоду php_crew_8_iaX6kA получите скидку 500р🎁
Первый, кто поставит звезду на репозиторий https://github.com/bitrix24/b24phpsdk и пришлет скрин в комментарий к посту получит бесплатную проходку