Sender 26.400.0: снимки сегментов, Feedback-ID и несовместимые изменения API
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
Sender 26.400.0 переносит сбор получателей плановой рассылки на момент старта, добавляет управляемые снимки сегментов и связывает почтовый транспорт с identity отправителя. Перед обновлением проверьте вызовы SegmentDataBuilder, обработчики OnBeforePostingSendRecipient, старый AJAX загрузки шаблонов и прямые ссылки на PNG: их контракты изменились. Релиз также усиливает серверную проверку прав и обработку HTML.
Новое
Обновляйте снимок сегмента перед отправкой
Получатели плановой рассылки теперь собираются при фактическом старте, а не при создании posting. До запуска список писем и редактор показывают приблизительное число со знаком ~. Оно складывается по сегментам без дедупликации, поэтому может быть больше фактического числа адресатов. Время следующего открытия окна отправки выводится точным timestamp: ядро считает окно в часовом поясе автора, а список переводит результат в пояс смотрящего и различает сегодня, завтра и послезавтра. Снимок сегмента хранит дату завершения и не даёт одновременно перестраивать данные и читать их рассылкой. Свежим считается снимок за тот же пользовательский день, собранный не раньше чем за час до старта. Для своего кода появились SegmentSnapshotState, SnapshotResponse, SegmentDataBuilder::forceActualize(), GroupQueueService::isGroupHeld(), PostingTable::isNotStarted() и счётчики адресов по буквам в Segment::getIncludeAddressCountersByLetters().
Форма сегмента показывает последнюю сборку, очередь и кнопку обновления. Завершение приходит через Pull.
После десяти минут ожидания интерфейс выводит уведомление. То же произойдёт без Pull. Состояния озвучивает LiveAnnouncer.
Проверяйте доступ на сервере
SegmentConnectorAccessService и EndpointAccessGuard проверяют источники, категории и стадии сделок при подсчёте, чтении фильтра и сохранении сегмента. Уже сохранённый запрещённый источник можно оставить без изменений, но выбрать заново нельзя. EndpointFields нормализует поля источников, а SnapshotResponse задаёт коды ответов.
Та же проверка дошла до редактора рассылки: сервер валидирует категорию сделки, санитизирует HTML пользовательского шаблона, а preview согласия и постраничная загрузка шаблонов требуют права просмотра рассылок. Значения карточки компании экранируются отдельно для HTML-пресетов; текстовые каналы получают обычный текст.
Разбирайте ошибки почтового транспорта
Почтовый API получил FeedbackId, SenderIdentityResolver и публичные TransportMail::getLastError() и Transport\Adapter::getLastError(). Для наследников TransportMail добавлены protected-точки sendMail() и applySenderIdentity(). Отправка и месячный лимит теперь привязаны к identity автора и обратного адреса. Ошибки MAIL_SENDER_ADDRESS_MISMATCH и MAIL_SENDER_UNAVAILABLE ставят письмо на паузу. После десяти transport exception пакет останавливается, а email и телефоны в диагностике маскируются.
Feedback-ID включается в настройках модуля и по умолчанию выключен. Значения source, sender и portal проходят проверку; перевод строки не принимается. Если постоянные заголовки уже содержат Feedback-ID, транспорт заменяет его вычисленным значением.
Загружайте шаблоны страницами
TemplateTable::getUserTemplatePage() отдаёт страницу до девяти записей со своим hasMore; hasMoreUserTemplates() возвращает только bool. Selector продолжает загрузку после пустой отфильтрованной страницы и использует изображения 1x/2x. Rejected promise показывает уведомление через showLoadMoreError(). Встроенные пресеты перешли на WebP; баннер письма получает <picture> с WebP 1x/2x и прежним PNG fallback, когда картинки не прикрепляются к письму.
Учитывайте новые правила CRM-выборок
CRM connector строит выборку сделок в пределах текущего окна ID, не повторяет join для продуктового фильтра и считает разные пары типа и ID сущности. Запрещённые каналы открытых линий исключаются, нецелые ID не попадают в персонализацию. Поля сообщения и UTM сохраняются через идемпотентный addMerge: исчезнувшие коды удаляются, ошибки собираются для каждой строки.
Что сломается
- Публичный
Bitrix\Sender\GroupConnectorTable::onAfterUpdate()удалён. Прямой вызов больше невозможен; код, который полагался на этот ORM-хук для актуализации сегмента, должен вызывать API снимка явно. SegmentDataBuilder::buildData($perPage = null): boolсталbuildData(): bool, аrun($groupStateId, $perPage = null)—run($groupStateId). Именованные вызовы с$perPageупадут.checkIsSegmentPrepared()при занятом lock возвращаетnullвместоfalse, поэтому строгая проверка должна учитывать третье состояние.- Старый AJAX-action
loadкомпонентаsender.template.selectorудалён. Клиенту нужен Controllerable-actionloadAction()в режимеclassс обязательнымmessageCode; ответ содержитitemsиhasMore. Message\Adapter::replaceFields()подставляет исходные значения безhtmlspecialcharsbx()иnl2br(). Для HTML берите подготовленные значения изgetFields(). СобытиеOnBeforePostingSendRecipientполучилоORIGINAL_FIELDS, чтобы обработчик менял исходные данные без повторного HTML-преобразования.- Старые PNG встроенных пресетов, событий и спрайтов удалены. Свои шаблоны и CSS с прямыми ссылками на эти файлы будут получать отсутствующий ресурс.
БД
В b_sender_group_state добавлена nullable-колонка DATE_COMPLETE; отдельного заполнения прежних строк нет. В b_sender_group_queue появился индекс IX_SENDER_GROUP_QUEUE_GROUP_ID_DATE_INSERT (GROUP_ID, DATE_INSERT) для проверки активного удержания сегмента.
Мелочи и находки
TRACK_CLICKбольше не записывается в read tracker.OnTriggerListвызывается и для обработчиков без module ID, после чего ядро фильтрует connector.- Параллельные subscribe/unsubscribe сводят конфликтующую пару под DB-lock и отдельно обрабатывают duplicate insert/update.
- Ошибка создания Facebook campaign завершает обработку с
Error. VoxImplant убирает ведущий+перед звонком и аккуратнее читает MP3. Мастер Yandex показывается только на поддоменахbitrix24.ru. - Гид Yandex запускается только при видимой цели, работает без overlay и удерживает popup внутри viewport.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\Sender\GroupConnectorTable::onAfterUpdate()
|
Удалено | — |