Sign 26.1200.0: автоопределение бланков и удаление CRM API
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
Sign 26.1200.0 упрощает загрузку документов КЭДО, добавляет списки сотрудников в робот и обновляет «Мой сейф» без перезагрузки страницы. Перед обновлением проверьте интеграции с CRM и сервисом бланков: четыре публичные точки API удалены, а CRM::saveCompanyStamp() сменил тип результата.
Новое
Загрузка сама определяет тип бланка
В B2E осталась одна область загрузки. Сервер определяет режим заполнения отдельно для каждого бланка: если его первый файл — DOCX, hasPlaceholders=true, иначе false. JPG, JPEG и PNG из одной пользовательской выборки объединяются в один документ; остальные файлы становятся отдельными документами, поэтому каждый DOCX получает true. Групповая операция при этом сохраняет защиту статусов документов.
Создание документа, групповая загрузка и замена бланка получили параметр autoDetectType. При создании можно передать expectedHasPlaceholders. Если ожидание расходится с распознанным типом, API отвечает ошибкой BLANK_TYPE_CONFIRMATION_REQUIRED и возвращает фактический hasPlaceholders.
Замена тоже учитывает тип. При переходе между DOCX с символьными кодами и документом с блоками интерфейс просит подтверждение, а после ошибки загрузки восстанавливает прежний бланк.
Ядро планирует порядок этапов
Новая точка расширения ManualFillingDecisionProvider отвечает, нужно ли ручное заполнение документа. Метод decide() возвращает одно из решений MANUAL_REQUIRED, NOT_REQUIRED, PENDING или ERROR, недостающие поля и признак завершённости. Сервис CompanyInitiatedPartyPlanService::plan() строит состав и очередность участников документа от компании.
Эта схема включается только при Feature::isKedoStageReorderEnabled(): провайдер должен быть готов, а соответствующая main-feature — включена. Тогда интерфейс скрывает ручной выбор редактора. Для документа от компании создатель становится первым редактором, если решение отличается от NOT_REQUIRED; за ним идут проверяющие, представитель и подписанты. Шаблоны и документы от сотрудника работают по прежней схеме.
Для интеграций появились MemberService::getB2eSignerParty() и MemberRepository::isEditorPartyBeforeReviewerParty().
Робот принимает списки сотрудников
SignB2EDocumentActivity теперь принимает отдельных сотрудников и списки подписантов. Настройка робота ищет списки, проверяет права, сохраняет название выбранного списка и разворачивает его состав. Лимит — 1000 сотрудников.
CRM-триггер защищён от повторов
После последнего редактора или проверяющего внутренний guard блокирует повторный запуск CRM-триггера SigningTrigger. Callback onSignedByReviewer(), onSignedByEditor() и notifyActivityChange() вызываются при каждом событии. Конкурирующие попытки запуска триггера синхронизируются блокировкой MySQL или PostgreSQL, а состояние хранится у участника со значениями pending и handled. MemberValidationCrmDispatchGuard помечен @internal. Внешнему коду доступен EventData::isMemberStatusChanged() для проверки смены статуса.
«Мой сейф» обновляется по Pull
Текущая страница грида обновляется после Pull-события. Автообновление учитывает ручной запрос грида, закрытие слайдера и изменение количества страниц. Ошибка появляется в уведомлении и в live announcer.
Что сломается
Удалены ProcessActivityHandler, CRM-провайдер Process и Container::getCrmProcessActivityHandler(). Внешний код с этими символами перестанет загружаться. Вместе с ними исчез провайдер CRM-дела SIGN_KEDO_PROCESS: Sign больше не создаёт дело «Процесс: ...» при привязке документа и не закрывает его после завершения бизнес-процесса.
Метода BlankService::getUploadedFilesTotalSize() больше нет. getUploadedFilesInfo() возвращает набор FileInfo, поэтому сумму размеров теперь считает вызывающий код.
CRM::saveCompanyStamp() возвращает Bitrix\Main\Result вместо bool. Условие if (CRM::saveCompanyStamp(...)) пропустит ошибку, потому что объект остаётся истинным. Проверяйте результат через isSuccess().
Параметры autoDetectType, expectedHasPlaceholders, orderByParty и previousStatus необязательны и имеют значения по умолчанию, поэтому старые позиционные вызовы сохраняют совместимость.
БД
Таблицы, колонки и индексы не менялись. Маркер однократной отправки CRM-триггера записывается в существующий META участника под ключом sign.validation_crm_dispatch.v1.
Регистрации crm:OnGetActivityProviders, bizproc:OnWorkflowComplete и bizproc:onAfterWorkflowKill убраны из установочной миграции вместе с CRM-провайдером процессов. Явного снятия уже зарегистрированных обработчиков нет, поэтому после обновления существующей коробки их стоит проверить.
Мелочи и находки
- Добавлен код ошибки
B2eErrorCode::SIGNING_FAILED. - При отказе CRM в сохранении печати интерфейс показывает ошибку прав и снимает бесконечное ожидание блока.
- Размер бинарного файла считается через
strlen(), поэтому лимит загрузки получает число байтов без занижения.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\Sign\Integration\CRM\Activity\ProcessActivityHandler
|
Удалено | — |
Bitrix\Sign\Integration\CRM\Activity\Provider\Process
|
Удалено | — |
Bitrix\Sign\Service\Container::getCrmProcessActivityHandler()
|
Удалено | — |
Bitrix\Sign\Service\Sign\BlankService::getUploadedFilesTotalSize()
|
Удалено |
Bitrix\Sign\Service\Sign\BlankService::getUploadedFilesInfo()
|