Landing 26.1700.0: markup-генерация за флагом и четыре несовместимости
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
Landing 26.1700.0 добавляет генерацию AI-сайтов из markup-пакетов. Её выбирает выключенный по умолчанию AiSitesMarkupFlag; доставка и отображение уже существующих markup-страниц работают независимо от флага. Четыре несовместимых изменения тоже от него не зависят.
Новое
Markup-пакеты и AI-сценарии
Публичный namespace Bitrix\Landing\Markup описывает пакет и манифест, буфер загрузки, проверку, импорт, экспорт, формы, изображения, repair и подписанную доставку. Block получил методы getMarkupManifest() и saveMarkupManifest(), а File — привязку и удаление файлов из буфера. Для интеграций также появились Domain::toUnicode(), Rights::getUserOperationsForSite(), Security\RemoteFile::download() и Connector\Disk::readFileForUser().
REST-методы landing.markup.putfile и landing.markup.getfile загружают и читают файлы пакета. Они работают только с авторизацией aiassistant_signed_user и проверяют режим продукта. Для create требуется право создавать сайты, для update и чтения — право редактировать целевую страницу. AI Assistant получил пять инструментов: загрузку файла, отправку пакета, получение статуса, чтение пакета и отмену задания. Для них добавлены отдельные DTO, схемы запросов и обработчики загрузки и запуска.
Copilot\Manager выбирает режим legacy или markup. Generation умеет отменять операцию, замечать внешнюю отмену и не запускать две операции одновременно. CreateMarkupSite проводит пакет через проверку, repair, модерацию темы, генерацию изображений и подготовку CRM-форм, затем создаёт сайт и custom-блок. ChangeMarkupSite применяет пакет к существующему блоку без создания нового сайта.
Пользователь публикует результат из редактора. Автопубликации нет.
При изменении страницы старая версия хранится до успешного применения новой. Undo и redo переключают манифесты без повторной загрузки файлов. Валидатор ограничивает пакет 15 МБ, отдельный файл 5 МБ, entry 1 МБ и общее число файлов 50; видео может быть только одно.
Sandbox custom code и доставка
Новый subtype CustomCode выводит код в iframe с sandbox="allow-scripts", без allow-same-origin. Код приходит через srcdoc, переходы фильтруются. Cookie, localStorage и sessionStorage работают через in-memory реализации, а indexedDB заменён отказной заглушкой. pushState() и replaceState() вызывают оригинал и подавляют исключение. Мост iframe передаёт сообщения редактору и не открывает доступ к origin портала.
Файлы custom-блока отдаются по подписанным ссылкам.
Опубликованные бинарные файлы получают immutable-кеш, для черновиков подпись живёт ограниченное время. В коробочной редакции installFiles() создаёт .htaccess с deny-правилом в /upload/landing_markup, только если файла ещё нет. Облако закрывает каталог отдельно. Готового правила для nginx обновление не содержит.
Handoff и чат
Одноразовая handoff-ссылка переносит prompt в /sites/ai/ или редактор. Она действует час, ограничена 30 выдачами на пользователя в час, а в БД хранится только SHA-256 токена.
После использования prompt удаляется из строки БД.
Виджет показывает состояние привязки чата и возвращает пользователя к нему.
При удалении AI-сайта связанные чаты получают уведомление. Права проверяются от имени владельца привязки, но ошибка уведомления не отменяет удаление сайта. Фоновые агенты чистят буферы загрузки, зависшие резервации и старые AI-черновики, а также повторяют регистрацию чат-триггера до появления модуля aiassistant.
Редактор и CRM-документы
Markup-страница не принимает обычные блоки. Вместо кнопки добавления редактор предлагает изменить страницу в чате. Пока идёт inline-редактирование или открыта панель, iframe не перезагружается, сколько бы это ни длилось. После последнего изменения подтверждение сохранения ждут не дольше 10 секунд. Общий EscapeCoordinator учитывает popup, подсказки и inline-редактирование, поэтому Escape закрывает только верхнюю панель.
Пакет может объявлять CRM-формы. Система переиспользует существующие привязки или создаёт форму из feedback preset; отсутствие CRM и тарифные ограничения дают предупреждение, но не прерывают генерацию. Поле соглашений теперь работает с каталогом юридических документов CRM: доступны версия, поиск, пагинация и карточка документа в слайдере.
Что сломается
AiSiteGenerationHelper::isModerationBlockStepId()теперь принимаетGenerationпервым аргументом. Старый вызов с однимintзавершитсяTypeError.Landing::copyBlock()иLanding::moveBlock()сверяютblock.typeисходного блока с типом целевого сайта. Несовместимый перенос возвращаетnullи ошибкуBLOCK_INCOMPATIBLE_SITE_TYPE.Landing::getPublicUrl()иSite::getPublicUrl()возвращают Unicode-хост для IDN-домена вместо сохранённого punycode. Код, который сравнивает точную строку URL, получит другой результат.- В
Bitrix24.Mobileстарые базы знаний недоступны на облачных порталах, созданных 1 октября 2026 года или позже: меню скрывается, просмотр и редирект отвечают403. Обычные браузерные запросы не затронуты.
БД
В b_landing_block появилась колонка MARKUP_MANIFEST типа MEDIUMTEXT; ORM-карта описывает её как Entity\StringField. Буферы загрузки хранятся в новой таблице b_landing_markup_upload с UNIQUE-индексом по UID и индексами очистки, а одноразовые handoff-ссылки — в b_landing_ai_prompt_handoff; туда записывается хеш токена, владелец, цель, prompt и сроки действия и использования. Если интеграция читает таблицы модуля напрямую или зеркалирует их, схему придётся обновить.
Для выборок добавлены индексы по автору и дате сайта, автору и сценарию генерации, а также SITE_ID привязки AI-чата.
Мелочи и находки
- Провайдер годовой сводки intranet относит к AI только сценарий
CreateAiSite.CreateMarkupSiteучитывается regular-запросом вместе с обычными сайтами. - Updater страницы чат-магазина меняет параметры только одного компонентного вызова. При неоднозначном PHP исходный контент остаётся без изменений, а причина попадает в журнал.