Sign 26.1100.0: ручное напоминание подписантам, скачивание шаблонов и REST провайдеров только для администратора
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
В sign 26.1100.0 подписантам можно напомнить из грида документа, подписание запускается из списка подписантов, а шаблоны и комплекты скачиваются незаполненными. REST провайдеров подписи теперь только для администратора, у сервисов списка символьных кодов новые сигнатуры. Версия требует main и humanresources 26.700.0. Прошлый разбор — Sign 26.1000.0.
Новое
Напомните подписантам из грида документа
В гриде процесса одного документа (bitrix:sign.document.list) появилась кнопка «Напомнить» в колонке действий, в меню строки и на панели массовых действий. Она есть у подписантов, готовых к подписанию, кроме самого пользователя, пока документ не завершён. Уведомление «Подпишите документ ...» приходит от HR-бота на языке уведомлений подписанта.
Из своего кода зовите AJAX sign.api_v1.b2e.member.reminder.send с documentUid и memberUids, не больше 200 UID за вызов. Хватает права на чтение документа. Уведомление получат только подписанты в статусах READY, STOPPABLE_READY и PROCESSING, их число вернётся в sent. Ошибки — SIGN_REMINDER_BATCH_LIMIT_EXCEEDED, SIGN_DOCUMENT_IS_FINAL и SIGN_IM_IS_NOT_AVAILABLE. В JS тот же вызов — new BX.Sign.V2.Api().sendReminder(documentUid, memberUids) из sign.v2.api.
Сервер не ограничивает частоту и не исключает отправителя. Учтите это в интеграции.
Создайте подписание из списка подписантов
Пункт «Создать подписание» теперь есть у строки списка подписантов (bitrix:sign.b2e.signers.list) и в карточке списка. Нужны подписанты в списке и право ACTION_B2E_DOCUMENT_ADD, у системного списка отказавшихся в карточке пункта нет. Мастер в слайдере (/sign/b2e/doc/0/?signersListId=<id>) подставляет список на шаге сотрудников, если пользователь может его читать. Адрес для своей кнопки строит \Bitrix\Sign\Service\Container::instance()->getUrlGeneratorService()->makeOpenWizardForSignersListUrl($listId).
Скачивайте шаблоны и комплекты незаполненными
У строки списка шаблонов КЭДО появилось действие «Скачать», а на панели — кнопка для отмеченных шаблонов и папок. Один выбранный шаблон с одним файлом приходит без ZIP. Для одной папки или одного многофайлового шаблона ZIP получает имя этого элемента; для нескольких выбранных элементов используется общее имя архива. Нужно право чтения на каждый шаблон, в том числе внутри выбранных папок, и на сами папки. Один отказ отклоняет всё скачивание с ACCESS_DENIED. Лимиты: 200 элементов, 50 шаблонов после раскрытия папок, 300 МБ. Шаблоны без файлов пропускаются, их число приходит в заголовке X-Sign-Skipped-Count. Флага у функции нет.
Свой интерфейс подключайте через new BX.Sign.V2.Api().template.downloadBlank(). Он вызывает sign.api_v1.b2e.document.template.blank.download, повторяет запрос, если CSRF-токен устарел, и отдаёт файл с числом пропущенных шаблонов.
// Extension::load(['sign.v2.api', 'ui.notification'])
async function downloadKit(folderId)
{
// при ошибке хелпер сам покажет уведомление и бросит Error
const { blob, fileName, skippedCount } = await new BX.Sign.V2.Api().template.downloadBlank([
{ id: folderId, entityType: 'folder' },
]);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = fileName ?? 'templates.zip';
link.click();
setTimeout(() => URL.revokeObjectURL(link.href), 1000);
if (skippedCount > 0)
{
BX.UI.Notification.Center.notify({ content: `Шаблонов без файла: ${skippedCount}` });
}
}
Учтите исключения из сопоставления с 1С при отправке
Исключения ведёт humanresources (разбор Humanresources 26.700.0), sign включает их со своей стороны функцией hcmLinkExclusions.
Отправку теперь блокирует участник без связи с сотрудником 1С (employeeId), если его не исключили в этой компании. Если у человека есть связь с персоной 1С, исключение блокировку не снимает, потому что данные 1С важнее. Если связи прочитать не удалось, исключения не учитываются. Ошибка прежняя — SIGN_OPERATION_CONFIGURE_DOCUMENT_HCMLINK_NOT_ALL_MAPPED.
Поля 1С у исключённого участника заполняются из юридических полей его профиля, задание в 1С не создаётся. Поле 1С, заполненное вручную в форме подписания, тоже сохраняется в юридическое поле профиля, если значение непустое и доверенное. Право на редактирование юридических данных здесь не проверяется: по комментарию в коде, запись идёт из колбэка сервиса подписания.
В окне «Некоторые сотрудники не синхронизированы» появилась кнопка «Удалить из подписания». Она убирает человека из документа и исключения не создаёт. Подписант, попавший в документ через отдел, список или другой документ, остаётся в выборе мастера. AJAX sign.api_v1.integration.humanresources.hcmLink.loadNotMappedMembers больше не отдаёт исключённых в userIds и добавляет representativeId и filledLegalDataUserIds (исключённые, у которых в профиле заполнены все нужные документу юридические поля). loadBulkNotMappedMembers тоже вычитает исключённых.
Проверьте, какие реквизиты компании остались в селекторе
Селектор полей КЭДО (sign.api_v1.b2e.fields.load) оставляет из реквизитов компании (RQ_*) только строковые немножественные поля: руководителя (RQ_DIRECTOR, RQ_CEO_NAME, RQ_CEO_WORK_POS) и поля из набора пресета. Пока в опциях запроса нет hideRequisites: 0, остаются только три поля руководителя. Если участник — компания и она совпадает с компанией документа, строковое поле в запасном варианте читается прямо из реквизита пресета. Без проверки прав CRM реквизиты читаются только у карточек «моя компания».
Включайте процессы и цепочку роботов флагами main
Флаги прошлой версии переехали в фичефлаги main: Bitrix\Sign\Config\Feature\B2eBizprocChainFlag и KedoRunProcessFlag. Агент StateMigrationAgent переносит опции SIGN_B2E_BIZPROC_CHAIN_ENABLED и SIGN_KEDO_RUN_PROCESS_ENABLED_OPTION в b_feature_flag и ставит маркер SIGN_KEDO_BIZPROC_FLAGS_MIGRATED_TO_MAIN, до маркера работают прежние опции. Если у опции есть значение для отдельного сайта, маркер не ставится. На чистой установке он ставится сразу, оба флага выключены.
Незаданная SIGN_KEDO_RUN_PROCESS_ENABLED_OPTION раньше считалась включённой. Агент для неё ничего не пишет, а KedoRunProcessFlag по умолчанию выключен. Если опция не была задана, а регион разрешён в service.b2e.run-process.publicity, запуск процессов после миграции выключится до вызова Bitrix\Main\Config\Feature::enable(KedoRunProcessFlag::class). В поставке false для всех регионов, поэтому запуск был выключен до миграции.
Проверка неподдерживаемых кодов пока выключена
Это заготовка за опцией ~placeholder_restriction_enabled (по умолчанию N). Пока она выключена, проверки отвечают «всё поддерживается», списки кодов не фильтруются, а агент DocumentAgentService::precomputeRawPlaceholders, который заранее собирает коды из тела документа, не ставится. С опцией мастера B2E и B2B перед отправкой предупредят о неподдерживаемых символьных кодах и предложат вернуться к настройке или продолжить без этих значений. Проверку отдают POST-действия sign.api_v1.document.validatePlaceholders и sign.api_v1.b2e.document.group.validatePlaceholders. В JS — new BX.Sign.V2.Api().validatePlaceholders(uid) и new BX.Sign.V2.Api().validateDocumentGroupPlaceholders(groupId).
Что сломается
Вызывайте REST провайдеров с токеном администратора
sign.b2e.provider.add, .update, .delete и .tail теперь проверяют CRestUtil::isAdmin(): с модулем bitrix24 нужна операция bitrix24_config, без него — администратор. Приложение провайдера подписи, которое зовёт их от имени обычного пользователя, получит AccessException('Access denied'). Переведите вызовы на токен администратора портала.
Передавайте аргументы сервисам кодов по имени
Касается тех, кто создаёт PlaceholderCollectorService или PlaceholderCacheService сам либо передаёт аргументы по позиции. Получение через ServiceLocator не ломается.
- В конструкторе
PlaceholderCollectorServiceвосьмым встал обязательныйPlaceholderRestrictionService $restrictionService, перед$logger.newсо старыми аргументами падает. - В
loadPlaceholdersByUserId()третьим встал?ScenarioContext $scenario,$withDeletableMarksушёл на четвёртое место.boolтретьим аргументом даёт TypeError. $clearCache = trueбольше не сбрасывает кеш списков. Флаг пропускает чтение кеша в этом запросе и перезаписывает только свою запись. Весь кеш сбрасываетPlaceholderCacheService::invalidateDocumentPlaceholderListCache().- У
PlaceholderCacheService::getPlaceholderList()иsetPlaceholderList()первым обязательным параметром всталstring $signature. Методы...ByHcmLinkCompanyIdсовместимы со старыми вызовами.
<?php declare(strict_types=1);
namespace Vendor\Kedo\Placeholder;
use Bitrix\Main\DI\ServiceLocator;
use Bitrix\Main\Loader;
use Bitrix\Sign\Service\Document\Placeholder\PlaceholderCollectorService;
final class FieldCodes
{
public function forUser(int $userId): array
{
if (!Loader::includeModule('sign')) {
return [];
}
/** @var PlaceholderCollectorService $collector */
$collector = ServiceLocator::getInstance()->get('sign.service.document.placeholder.placeholderCollector');
// с 26.1100.0 третий параметр — ?ScenarioContext, флаги передаём по имени
$result = $collector->loadPlaceholdersByUserId($userId, withDeletableMarks: false);
return $result->isSuccess() ? $result->getData() : [];
}
}
Выдайте права на папки шаблонов
Удалить папку шаблонов или сменить её видимость теперь можно только с правом на саму папку (ACTION_B2E_TEMPLATE_DELETE или ACTION_B2E_TEMPLATE_EDIT). Раньше оно проверялось только у пустой папки, поэтому доступ потеряют те, у кого есть права на все шаблоны внутри, но не на папку. Создать шаблон в папке через sign.api_v1.document.register теперь можно только с правом редактировать её, иначе придёт «No access rights to edit target folder».
Проверьте права на папки у тех, кто собирает комплекты.
Мелочи и находки
- Из карточек аннулирования для сотрудника убрали ссылку «К процессу подписания». Если сотрудник и инициатор — один человек, приходит карточка инициатора со ссылкой. При массовом аннулировании личные карточки инициатора уходят, только если не дублируют общую.
- Имена файлов в ZIP бланка, в том числе в прежнем
createFromBlank(), обрезаются до 200 байт, к зарезервированным именам Windows добавляется_, повторы различаются без учёта регистра. Для своих архивов естьBitrix\Sign\Util\Filename::forFileSystem(). - В
MemberRepositoryпоявилисьlistByUidsAndDocumentIdAndStatusesAndRole()иhasSeveralMembersInParty().BlankRepository::getByIds()считает бланк пустым, если в хранилище нет хотя бы одного его файла, и сам файл из облака не качает.