[{"data":1,"prerenderedAt":4330},["ShallowReactive",2],{"navigation":3,"-docs-working-with-the-rest-api-limiters":459,"-docs-working-with-the-rest-api-limiters-description":4319},[4],{"title":5,"path":6,"stem":7,"children":8,"page":47},"Docs","\u002Fdocs","docs",[9,78,351],{"title":10,"path":11,"stem":12,"children":13,"restApiVersion":15,"category":15,"description":15,"badge":15},"Начало работы","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[14,17,48,63],{"title":10,"path":11,"stem":12,"restApiVersion":15,"category":15,"description":16,"badge":15},null,"Краткое руководство по работе с SDK для REST API Bitrix24",{"title":18,"path":19,"stem":20,"children":21,"page":47},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",[22,27,32,37,42],{"title":23,"path":24,"stem":25,"restApiVersion":15,"category":15,"description":26,"badge":15},"Vue","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fvue","docs\u002F1.getting-started\u002F2.installation\u002F1.vue","Руководство по установке Bitrix24 JS SDK в приложениях Vue.",{"title":28,"path":29,"stem":30,"restApiVersion":15,"category":15,"description":31,"badge":15},"Nuxt","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fnuxt","docs\u002F1.getting-started\u002F2.installation\u002F2.nuxt","Руководство по установке Bitrix24 JS SDK в приложениях Nuxt.",{"title":33,"path":34,"stem":35,"restApiVersion":15,"category":15,"description":36,"badge":15},"React","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Freact","docs\u002F1.getting-started\u002F2.installation\u002F3.react","Руководство по установке Bitrix24 JS SDK в приложениях React.",{"title":38,"path":39,"stem":40,"restApiVersion":15,"category":15,"description":41,"badge":15},"Node.js","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fnodejs","docs\u002F1.getting-started\u002F2.installation\u002F4.nodejs","Руководство по установке Bitrix24 JS SDK в приложениях Node.js.",{"title":43,"path":44,"stem":45,"restApiVersion":15,"category":15,"description":46,"badge":15},"UMD","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fumd","docs\u002F1.getting-started\u002F2.installation\u002F5.umd","Руководство по использованию UMD-версии Bitrix24 JS SDK в ваших приложениях.",false,{"title":49,"restApiVersion":15,"category":15,"description":15,"badge":15,"shadow":47,"path":50,"stem":51,"children":52,"page":47},"Migration","\u002Fdocs\u002Fgetting-started\u002Fmigration","docs\u002F1.getting-started\u002F3.migration",[53,58],{"title":54,"path":55,"stem":56,"restApiVersion":15,"category":15,"description":57,"badge":15},"v0 → v1","\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv1","docs\u002F1.getting-started\u002F3.migration\u002F1.v1","Подробное руководство по миграции приложения с Bitrix24 JS SDK v0 на Bitrix24 JS SDK v1.",{"title":59,"path":60,"stem":61,"restApiVersion":15,"category":15,"description":62,"badge":15},"v2 → v3","\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv3","docs\u002F1.getting-started\u002F3.migration\u002F2.v3","Как уйти с устаревшей REST-поверхности, которая удаляется в Bitrix24 JS SDK 3.0.0.",{"title":64,"restApiVersion":15,"category":15,"description":15,"badge":15,"path":65,"stem":66,"children":67,"page":47},"AI-инструменты","\u002Fdocs\u002Fgetting-started\u002Fai","docs\u002F1.getting-started\u002F7.ai",[68,73],{"title":69,"path":70,"stem":71,"restApiVersion":15,"category":15,"description":72,"badge":15},"Навыки","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fskills","docs\u002F1.getting-started\u002F7.ai\u002F1.skills","Узкоспециализированные skill-файлы для AI-агентов разработчика, работающих с @bitrix24\u002Fb24jssdk.",{"title":74,"path":75,"stem":76,"restApiVersion":15,"category":15,"description":77,"badge":15},"LLMs.txt","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fllms-txt","docs\u002F1.getting-started\u002F7.ai\u002F2.llms-txt","Как сделать, чтобы AI-инструменты вроде Cursor, Windsurf, GitHub Copilot, ChatGPT и Claude понимали методы, инструменты и лучшие практики Bitrix24 JS SDK.",{"title":79,"path":80,"stem":81,"children":82,"restApiVersion":15,"category":15,"description":15,"badge":15},"Работа с REST API","\u002Fdocs\u002Fworking-with-the-rest-api","docs\u002F2.working-with-the-rest-api\u002F0.index",[83,86,93,98,103,107,112,116,121,126,130,135,140,145,150,155,160,165,170,175,179,184,189,194,200,205,210,215,220,225,230,235,240,245,251,256,261,267,272,277,282,287,293,299,305,310,315,320,326,331,336,341,346],{"title":84,"path":80,"stem":81,"restApiVersion":15,"category":15,"description":85,"badge":15},"Введение","Обзор возможностей SDK для работы с REST API Bitrix24",{"title":87,"path":88,"stem":89,"restApiVersion":90,"category":91,"description":92,"badge":15},"Call","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F1.call-rest-api-ver2","rest-api-ver2","actions","Метод для вызовов REST API Bitrix24 версии 2.",{"title":87,"path":94,"stem":95,"restApiVersion":96,"category":91,"description":97,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F1.call-rest-api-ver3","rest-api-ver3","Метод для вызовов REST API Bitrix24 версии 3.",{"title":99,"path":100,"stem":101,"restApiVersion":90,"category":91,"description":102,"badge":15},"CallList","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-list-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F2.call-list-rest-api-ver2","Метод для быстрого получения всех данных из list-методов REST API Bitrix24 версии 2.",{"title":99,"path":104,"stem":105,"restApiVersion":96,"category":91,"description":106,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcall-list-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F2.call-list-rest-api-ver3","Метод для быстрого получения всех данных из list-методов REST API Bitrix24 версии 3.",{"title":108,"path":109,"stem":110,"restApiVersion":90,"category":91,"description":111,"badge":15},"FetchList","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ffetch-list-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F2.fetch-list-rest-api-ver2","Возвращает AsyncGenerator, позволяющий обрабатывать данные из list-методов REST API Bitrix24 версии 2 по мере поступления, не загружая весь массив в память сразу. Особенно полезно при работе с очень большими объёмами данных.",{"title":108,"path":113,"stem":114,"restApiVersion":96,"category":91,"description":115,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Ffetch-list-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F2.fetch-list-rest-api-ver3","Возвращает AsyncGenerator, позволяющий обрабатывать данные из list-методов REST API Bitrix24 версии 3 по мере поступления, не загружая весь массив в память сразу. Особенно полезно при работе с очень большими объёмами данных.",{"title":117,"path":118,"stem":119,"restApiVersion":15,"category":117,"description":120,"badge":15},"B24Hook","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhook","docs\u002F2.working-with-the-rest-api\u002F20.hook","Серверная точка входа для работы с REST API Bitrix24 через входящий вебхук (постоянный токен).",{"title":122,"path":123,"stem":124,"restApiVersion":90,"category":91,"description":125,"badge":15},"Batch","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F3.batch-rest-api-ver2","Метод для выполнения пакетных запросов к REST API Bitrix24 версии 2. Позволяет выполнить до 50 команд в одном API-вызове.",{"title":122,"path":127,"stem":128,"restApiVersion":96,"category":91,"description":129,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F3.batch-rest-api-ver3","Метод для выполнения пакетных запросов к REST API Bitrix24 версии 3. Позволяет выполнить до 50 команд в одном API-вызове.",{"title":84,"path":131,"stem":132,"restApiVersion":15,"category":133,"description":134,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe","docs\u002F2.working-with-the-rest-api\u002F30.frame","B24Frame","Предназначен для управления приложениями Bitrix24, работающими внутри placement-iframe. Наследуется от AbstractB24 и предоставляет менеджеры для аутентификации, обмена сообщениями с родительским окном, слайдеров, диалогов, placement и опций.",{"title":136,"path":137,"stem":138,"restApiVersion":15,"category":133,"description":139,"badge":15},"Инициализация","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-initialize-b24-frame","docs\u002F2.working-with-the-rest-api\u002F30.frame-initialize-b24-frame","Функция предназначена для инициализации B24Frame",{"title":141,"path":142,"stem":143,"restApiVersion":15,"category":133,"description":144,"badge":15},"Авторизация","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-auth","docs\u002F2.working-with-the-rest-api\u002F31.frame-auth","Предназначен для управления аутентификацией в приложениях Bitrix24. Обрабатывает данные аутентификации, полученные от родительского окна, и предоставляет методы для их обновления и получения.",{"title":146,"path":147,"stem":148,"restApiVersion":15,"category":133,"description":149,"badge":15},"Диалог","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-dialog","docs\u002F2.working-with-the-rest-api\u002F31.frame-dialog","Оборачивает системные диалоги BX24 (выбор пользователя, выбор прав доступа, выбор CRM-сущности), чтобы их можно было открывать изнутри iframe приложения Bitrix24.",{"title":151,"path":152,"stem":153,"restApiVersion":15,"category":133,"description":154,"badge":15},"Опции","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-options","docs\u002F2.working-with-the-rest-api\u002F31.frame-options","Используется для управления настройками приложения и пользователя в приложении Bitrix24. Позволяет инициализировать данные, получать и устанавливать опции через сообщения родительскому окну.",{"title":156,"path":157,"stem":158,"restApiVersion":15,"category":133,"description":159,"badge":15},"Родительское окно","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-parent","docs\u002F2.working-with-the-rest-api\u002F31.frame-parent","Предоставляет методы для управления родительским окном приложения в Bitrix24, включая изменение размера окна, управление прокруткой, инициацию звонков и открытие мессенджера.",{"title":161,"path":162,"stem":163,"restApiVersion":15,"category":133,"description":164,"badge":15},"Placement","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-placement","docs\u002F2.working-with-the-rest-api\u002F31.frame-placement","Используется для управления placement виджетов в приложении Bitrix24.",{"title":166,"path":167,"stem":168,"restApiVersion":15,"category":133,"description":169,"badge":15},"Слайдер","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fframe-slider","docs\u002F2.working-with-the-rest-api\u002F31.frame-slider","Предоставляет методы для работы со слайдерами в приложении Bitrix24. Позволяет открывать и закрывать слайдеры, а также управлять их содержимым.",{"title":171,"path":172,"stem":173,"restApiVersion":90,"category":91,"description":174,"badge":15},"BatchByChunk","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-by-chunk-rest-api-ver2","docs\u002F2.working-with-the-rest-api\u002F4.batch-by-chunk-rest-api-ver2","Метод для выполнения пакетных запросов с автоматическим разбиением на чанки для любого числа команд. Автоматически делит большие наборы команд на батчи по 50 и выполняет их последовательно. Используйте только массивы кортежей или массивы объектов.",{"title":171,"path":176,"stem":177,"restApiVersion":96,"category":91,"description":178,"badge":15},"\u002Fdocs\u002Fworking-with-the-rest-api\u002Fbatch-by-chunk-rest-api-ver3","docs\u002F2.working-with-the-rest-api\u002F4.batch-by-chunk-rest-api-ver3","Метод для выполнения пакетных запросов к REST API Bitrix24 версии 3 с автоматическим разбиением на чанки для любого числа команд. Автоматически делит большие наборы команд на батчи по 50 и выполняет их последовательно. Используйте только массивы кортежей или массивы объектов.",{"title":180,"path":181,"stem":182,"restApiVersion":15,"category":180,"description":183,"badge":15},"B24OAuth","\u002Fdocs\u002Fworking-with-the-rest-api\u002Foauth","docs\u002F2.working-with-the-rest-api\u002F40.oauth","Серверная точка входа для работы с REST API Bitrix24 по access token OAuth 2.0 (с автоматическим обновлением).",{"title":185,"path":186,"stem":187,"restApiVersion":15,"category":15,"description":188,"badge":15},"Выбор метода","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fchoosing-the-right-method","docs\u002F2.working-with-the-rest-api\u002F5.choosing-the-right-method","Руководство по выбору между Call, CallList, FetchList, Batch и BatchByChunk в REST API v2 и v3.",{"title":190,"path":191,"stem":192,"restApiVersion":15,"category":15,"description":193,"badge":15},"Фильтрация","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ffiltering","docs\u002F2.working-with-the-rest-api\u002F5.filtering","Справочник по построению параметров фильтра в Bitrix24 REST API v2 (префиксные операторы) и v3 (массив троек), включая формат дат и правило отбрасывания order.",{"title":195,"path":196,"stem":197,"restApiVersion":15,"category":198,"description":199,"badge":15},"B24HelperManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper","docs\u002F2.working-with-the-rest-api\u002F50.helper","Helper","Агрегирующий менеджер, который загружает данные профиля, приложения, оплаты, лицензии, валют и опций одним батч-запросом REST, а также подключает Pull-клиент.",{"title":201,"path":202,"stem":203,"restApiVersion":15,"category":198,"description":204,"badge":15},"useB24Helper","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-use-b24-helper","docs\u002F2.working-with-the-rest-api\u002F51.helper-use-b24-helper","Основанный на замыкании composable, который владеет единственным экземпляром B24HelperManager и предоставляет хелперы жизненного цикла (init \u002F destroy \u002F связка с Pull-клиентом).",{"title":206,"path":207,"stem":208,"restApiVersion":15,"category":198,"description":209,"badge":15},"ProfileManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-profile-manager","docs\u002F2.working-with-the-rest-api\u002F52.helper-profile-manager","Разобранный ответ REST-метода `profile`: id, имя, фамилия, пол, фото, часовой пояс, флаг администратора.",{"title":211,"path":212,"stem":213,"restApiVersion":15,"category":198,"description":214,"badge":15},"AppManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-app-manager","docs\u002F2.working-with-the-rest-api\u002F53.helper-app-manager","Разобранный ответ REST-метода `app.info`: id приложения, код, версия, статус, флаг установки.",{"title":216,"path":217,"stem":218,"restApiVersion":15,"category":198,"description":219,"badge":15},"PaymentManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-payment-manager","docs\u002F2.working-with-the-rest-api\u002F54.helper-payment-manager","Статус оплаты приложения Bitrix24 — извлекается из `app.info`.",{"title":221,"path":222,"stem":223,"restApiVersion":15,"category":198,"description":224,"badge":15},"LicenseManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-license-manager","docs\u002F2.working-with-the-rest-api\u002F55.helper-license-manager","Информация о лицензии Bitrix24 из `app.info` — и автоматическая перенастройка менеджера ограничений под соответствующий тарифный план.",{"title":226,"path":227,"stem":228,"restApiVersion":15,"category":198,"description":229,"badge":15},"CurrencyManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-currency-manager","docs\u002F2.working-with-the-rest-api\u002F56.helper-currency-manager","Каталог валют, кэшируемый в памяти — базовая валюта, форматтеры для каждой валюты и форматтер числа в строку.",{"title":231,"path":232,"stem":233,"restApiVersion":15,"category":198,"description":234,"badge":15},"OptionsManager","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fhelper-options-manager","docs\u002F2.working-with-the-rest-api\u002F57.helper-options-manager","Типизированный доступ к `app.option.get` \u002F `user.option.get`, плюс save(), который батчит `*.option.set` с необязательным Pull-уведомлением.",{"title":236,"path":237,"stem":238,"restApiVersion":15,"category":15,"description":239,"badge":15},"Ошибки","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ferrors","docs\u002F2.working-with-the-rest-api\u002F6.errors","Справочник кодов SdkError и AjaxError, выбрасываемых SDK, плюс коды ошибок REST Bitrix24, которые через них проявляются.",{"title":241,"path":242,"stem":243,"restApiVersion":15,"category":241,"description":244,"badge":15},"Pull","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fpull","docs\u002F2.working-with-the-rest-api\u002F60.pull","Поток сообщений в реальном времени от Bitrix24 к вашему приложению — WebSocket как основной канал, long-polling как запасной. Только для фрейма.",{"title":246,"path":247,"stem":248,"restApiVersion":15,"category":249,"description":250,"badge":15},"Logger","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flogger","docs\u002F2.working-with-the-rest-api\u002F66.logger","logger","Логгер, вдохновлённый PHP Monolog, предоставляет структурированную систему логирования с поддержкой каналов, обработчиков, процессоров и форматтеров. Реализация следует принципам PSR-3 и паттерну цепочки ответственности.",{"title":252,"path":253,"stem":254,"restApiVersion":15,"category":249,"description":255,"badge":15},"Telegram","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flogger-telegram","docs\u002F2.working-with-the-rest-api\u002F66.logger-telegram","Отправка логов в Telegram",{"title":257,"path":258,"stem":259,"restApiVersion":15,"category":15,"description":260,"badge":15},"Обнаружение v3-методов","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fdiscovering-v3-methods","docs\u002F2.working-with-the-rest-api\u002F7.discovering-v3-methods","Используйте rest.documentation.openapi, чтобы получить собственный машиночитаемый список всех доступных методов REST API v3 портала — источник истины, на который SDK опирается вместо захардкоженного allowlist. Особенно полезно для AI-агентов и кодогенерации.",{"title":262,"path":263,"stem":264,"restApiVersion":15,"category":265,"description":266,"badge":15},"AjaxResult","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-ajax-result","docs\u002F2.working-with-the-rest-api\u002F70.core-ajax-result","Core","Специализированный Result, возвращаемый каждым REST-хелпером. Предоставляет `isMore() \u002F getNext() \u002F getTotal() \u002F getStatus()` для постраничных ответов и неизменяемые данные.",{"title":268,"path":269,"stem":270,"restApiVersion":15,"category":265,"description":271,"badge":15},"Http","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-http","docs\u002F2.working-with-the-rest-api\u002F70.core-http","Низкоуровневый интерфейс транспорта, возвращаемый `b24.getHttpClient(version)`. Прямой доступ к axios-клиентам, параметрам ограничений, статистике и сбросу.",{"title":273,"path":274,"stem":275,"restApiVersion":15,"category":265,"description":276,"badge":15},"B24LangList","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-lang-list","docs\u002F2.working-with-the-rest-api\u002F70.core-lang-list","Enum языков интерфейса облачного Bitrix24 плюс карта локалей BCP-47.",{"title":278,"path":279,"stem":280,"restApiVersion":15,"category":265,"description":281,"badge":15},"RequestIdGenerator","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-request-id-generator","docs\u002F2.working-with-the-rest-api\u002F70.core-request-id-generator","Реализация `IRequestIdGenerator` по умолчанию. Генерирует request id в формате UUID v7 и предоставляет имена HTTP-заголовка \u002F query-параметра, используемые SDK.",{"title":283,"path":284,"stem":285,"restApiVersion":15,"category":265,"description":286,"badge":15},"Result","\u002Fdocs\u002Fworking-with-the-rest-api\u002Fcore-result","docs\u002F2.working-with-the-rest-api\u002F70.core-result","Обобщённый результат операции с флагом успеха, данными и картой ошибок. Аналог \\\\Bitrix\\\\Main\\\\Result из Bitrix Framework.",{"title":288,"path":289,"stem":290,"restApiVersion":15,"category":291,"description":292,"badge":15},"Лимитеры","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flimiters","docs\u002F2.working-with-the-rest-api\u002F77.limiters","limiters","Система ограничений предоставляет комплексный механизм управления частотой запросов, временем выполнения операций и адаптивными задержками.",{"title":294,"path":295,"stem":296,"restApiVersion":15,"category":297,"description":298,"badge":15},"Логирование и редактирование","\u002Fdocs\u002Fworking-with-the-rest-api\u002Flogging","docs\u002F2.working-with-the-rest-api\u002F78.logging","logging","Что SDK редактирует автоматически до того, как информация о запросе попадёт в логгер или AjaxError, что он не редактирует, и как подключить кастомный логгер через setLogger(...) без повторного появления утечек учётных данных.",{"title":300,"path":301,"stem":302,"restApiVersion":15,"category":303,"description":304,"badge":15},"Browser","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-browser","docs\u002F2.working-with-the-rest-api\u002F80.tools-browser","tools","Дешёвый детектор user-agent \u002F платформы \u002F возможностей. Полезен для runtime-ветвлений во фронтенд-коде.",{"title":306,"path":307,"stem":308,"restApiVersion":15,"category":303,"description":309,"badge":15},"Text","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-text","docs\u002F2.working-with-the-rest-api\u002F80.tools-text","Утилиты для текста и дат — UUID v4 \u002F v7, кодирование \u002F декодирование HTML-сущностей, преобразования типов, хелперы регистра, `toDateTime` \u002F `toB24Format` на Luxon, форматирование чисел и конструктор query-строки.",{"title":311,"path":312,"stem":313,"restApiVersion":15,"category":303,"description":314,"badge":15},"Type","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-type","docs\u002F2.working-with-the-rest-api\u002F80.tools-type","Runtime type guards — строки, числа, обычные объекты, массивы, DOM-узлы, Blob, FormData, формы JSON-RPC сообщений.",{"title":316,"path":317,"stem":318,"restApiVersion":15,"category":303,"description":319,"badge":15},"useFormatter","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-use-formatters","docs\u002F2.working-with-the-rest-api\u002F80.tools-use-formatters","Composable, возвращающий общие экземпляры `FormatterNumbers` и `FormatterIban`, преднастроенные спецификациями стран.",{"title":321,"path":322,"stem":323,"restApiVersion":15,"category":324,"description":325,"badge":15},"IResult","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-iresult","docs\u002F2.working-with-the-rest-api\u002F90.types-iresult","Types","Обобщённый интерфейс результата операции. Реализуется `Result\u003CT>` и (транзитивно) `AjaxResult\u003CT>`.",{"title":327,"path":328,"stem":329,"restApiVersion":15,"category":324,"description":330,"badge":15},"TypeB24","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftypes-type-b24","docs\u002F2.working-with-the-rest-api\u002F90.types-type-b24","Публичный контракт, реализуемый каждым классом-точкой входа (B24Frame, B24Hook, B24OAuth). Единый источник истины для поверхности SDK.",{"title":332,"path":333,"stem":334,"restApiVersion":15,"category":265,"description":335,"badge":15},"Телеметрия","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftelemetry","docs\u002F2.working-with-the-rest-api\u002F95.telemetry","Query-параметры request id, версии SDK и типа SDK, добавляемые к каждому REST-вызову Bitrix24.",{"title":337,"path":338,"stem":339,"restApiVersion":15,"category":265,"description":340,"badge":15},"Коды ошибок","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ferror-codes","docs\u002F2.working-with-the-rest-api\u002F96.error-codes","Каталог кодов ошибок, которые распознаёт SDK — разделённых на «hard» (выбрасываются) и «soft» (возвращаются как AjaxError внутри AjaxResult).",{"title":342,"path":343,"stem":344,"restApiVersion":15,"category":303,"description":345,"badge":15},"HealthCheck","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-health-check","docs\u002F2.working-with-the-rest-api\u002Ftools-health-check","Метод для проверки доступности REST API Bitrix24. Выполняет простой запрос к REST API для проверки работоспособности сервиса.",{"title":347,"path":348,"stem":349,"restApiVersion":15,"category":303,"description":350,"badge":15},"Ping","\u002Fdocs\u002Fworking-with-the-rest-api\u002Ftools-ping","docs\u002F2.working-with-the-rest-api\u002Ftools-ping","Метод для измерения скорости ответа REST API Bitrix24. Выполняет тестовый запрос и возвращает время ответа в миллисекундах.",{"title":352,"path":353,"stem":354,"children":355,"restApiVersion":15,"category":15,"description":15,"badge":15},"Примеры","\u002Fdocs\u002Fexamples","docs\u002F99.examples\u002F0.index",[356,358,364,369,374,379,384,389,394,399,404,409,414,419,424,429,434,439,444,449,454],{"title":84,"path":353,"stem":354,"restApiVersion":15,"category":15,"description":357,"badge":15},"Рецепты, сочетающие SDK с реалистичными сценариями — аналитика CRM, массовые рассылки, AI-ассистенты, установка по OAuth и не только. Каждый рецепт — отдельный файл, удобный для копирования.",{"title":359,"path":360,"stem":361,"restApiVersion":15,"category":362,"description":363,"badge":15},"Аналитика CRM","\u002Fdocs\u002Fexamples\u002Fcrm-analytics","docs\u002F99.examples\u002F1.crm-analytics","examples","Стримит все сделки через actions.v2.fetchList.make, группирует по стадиям, печатает отчёт по воронке (количество, конверсия %, средний чек, win rate).",{"title":365,"path":366,"stem":367,"restApiVersion":15,"category":362,"description":368,"badge":15},"Сделки → CSV","\u002Fdocs\u002Fexamples\u002Fdashboard-deals-csv","docs\u002F99.examples\u002F1.dashboard-deals-csv","Стримит каждую сделку CRM, подходящую под фильтр по дате, в CSV-файл через вебхук и FetchListV2.",{"title":370,"path":371,"stem":372,"restApiVersion":15,"category":15,"description":373,"badge":15},"Список сущностей","\u002Fdocs\u002Fexamples\u002Fentity-list","docs\u002F99.examples\u002F10.entity-list","Рендерит постраничный список сущностей Bitrix24 с компонентами B24UI и SDK-действием callList.",{"title":375,"path":376,"stem":377,"restApiVersion":15,"category":362,"description":378,"badge":15},"Обработка ошибок","\u002Fdocs\u002Fexamples\u002Ferror-handling","docs\u002F99.examples\u002F10.error-handling","Демонстрирует четыре слоя ошибок (SdkError \u002F AjaxError \u002F сетевые \u002F soft) и настройки hardErrorCodes \u002F softErrorCodes \u002F retryOnNetworkError у менеджера ограничений.",{"title":380,"path":381,"stem":382,"restApiVersion":15,"category":362,"description":383,"badge":15},"Регистрация событий","\u002Fdocs\u002Fexamples\u002Fevent-registration","docs\u002F99.examples\u002F11.event-registration","CLI-инструмент — список, привязка и отвязка исходящих событий вебхуков Bitrix24 через event.get \u002F event.bind \u002F event.unbind. В паре с рецептом обработчика вебхуков.",{"title":385,"path":386,"stem":387,"restApiVersion":15,"category":362,"description":388,"badge":15},"Установка OAuth","\u002Fdocs\u002Fexamples\u002Foauth-install","docs\u002F99.examples\u002F12.oauth-install","Express-сервер, который обрабатывает события ONAPPINSTALL \u002F ONAPPUPDATE \u002F ONAPPUNINSTALL для маркетплейс-приложения Bitrix24, сохраняет токены по порталам и создаёт клиент B24OAuth по требованию с callback обновления, подключённым к хранилищу.",{"title":390,"path":391,"stem":392,"restApiVersion":15,"category":362,"description":393,"badge":15},"Скелет frame-приложения","\u002Fdocs\u002Fexamples\u002Fframe-app-skeleton","docs\u002F99.examples\u002F2.frame-app-skeleton","Минимально жизнеспособное iframe-приложение Bitrix24: рукопожатие init, установка заголовка, сохранение состояния приложения, открытие слайдера, чистое закрытие.",{"title":395,"path":396,"stem":397,"restApiVersion":15,"category":362,"description":398,"badge":15},"Массовые рассылки","\u002Fdocs\u002Fexamples\u002Fmass-messaging","docs\u002F99.examples\u002F2.mass-messaging","Фильтрует контакты в CRM, персонализирует шаблон, отправляет IM-уведомления ответственным менеджерам.",{"title":400,"path":401,"stem":402,"restApiVersion":15,"category":15,"description":403,"badge":15},"Мастер установки","\u002Fdocs\u002Fexamples\u002Fapp-installation-wizard","docs\u002F99.examples\u002F20.app-installation-wizard","Многошаговый процесс установки, который создаёт пользовательские поля, регистрирует placement-ы, финализирует установку и празднует конфетти.",{"title":405,"path":406,"stem":407,"restApiVersion":15,"category":362,"description":408,"badge":15},"Автоматизация задач","\u002Fdocs\u002Fexamples\u002Ftask-automation","docs\u002F99.examples\u002F3.task-automation","Опрашивает стадии сделок каждые 60 с. При отслеживаемом переходе создаёт задачу с описанием, дедлайном и приоритетом.",{"title":410,"path":411,"stem":412,"restApiVersion":15,"category":362,"description":413,"badge":15},"Вебхук CLI","\u002Fdocs\u002Fexamples\u002Fwebhook-cli-node","docs\u002F99.examples\u002F3.webhook-cli-node","Node-скрипт на 30 строк, который аутентифицируется на портале Bitrix24 через входящий вебхук и печатает вызывающего пользователя — полезно как первое, что вы запускаете после создания вебхука.",{"title":415,"path":416,"stem":417,"restApiVersion":15,"category":15,"description":418,"badge":15},"Экспорт Node + Hook","\u002Fdocs\u002Fexamples\u002Fnode-hook-company-export","docs\u002F99.examples\u002F30.node-hook-company-export","Экспорт компаний Bitrix24 в CSV-файл из чистого Node.js-скрипта через B24Hook.",{"title":420,"path":421,"stem":422,"restApiVersion":15,"category":362,"description":423,"badge":15},"Массовое обновление","\u002Fdocs\u002Fexamples\u002Fbulk-update-deals","docs\u002F99.examples\u002F4.bulk-update-deals","Переносит тысячи сделок CRM на новую стадию через BatchByChunkV2 — автоматическое разбиение на чанки, обработка частичных ошибок и одна строка прогресса.",{"title":425,"path":426,"stem":427,"restApiVersion":15,"category":362,"description":428,"badge":15},"Синхронизация ERP","\u002Fdocs\u002Fexamples\u002Ferp-sync","docs\u002F99.examples\u002F4.erp-sync","Двусторонняя синхронизация контактов между Bitrix24 и внешней ERP. Сопоставление по ИНН (основное) или email (запасное). Cron каждый час.",{"title":430,"path":431,"stem":432,"restApiVersion":15,"category":362,"description":433,"badge":15},"Файлы Диска","\u002Fdocs\u002Fexamples\u002Fdisk-files","docs\u002F99.examples\u002F5.disk-files","Список хранилищ и содержимого папок, создание подпапок, просмотр файлов. Загрузка файлов (multipart) намеренно вне области.",{"title":435,"path":436,"stem":437,"restApiVersion":15,"category":362,"description":438,"badge":15},"Подписка на Pull","\u002Fdocs\u002Fexamples\u002Fpull-subscribe-frame","docs\u002F99.examples\u002F5.pull-subscribe-frame","Открыть живой канал из frame-приложения Bitrix24 и реагировать на push-события через useB24Helper + Pull-клиент.",{"title":440,"path":441,"stem":442,"restApiVersion":15,"category":362,"description":443,"badge":15},"Telegram-бот","\u002Fdocs\u002Fexamples\u002Ftelegram-bot","docs\u002F99.examples\u002F6.telegram-bot","Опрашивает новые сделки CRM каждые две минуты; уведомляет Telegram-чат HTML-карточкой.",{"title":445,"path":446,"stem":447,"restApiVersion":15,"category":362,"description":448,"badge":15},"Обработчик вебхуков","\u002Fdocs\u002Fexamples\u002Fwebhook-handler","docs\u002F99.examples\u002F7.webhook-handler","Express-сервер, который принимает исходящие события Bitrix24, подгружает детали через REST, маршрутизирует по имени события. Всегда возвращает 200.",{"title":450,"path":451,"stem":452,"restApiVersion":15,"category":362,"description":453,"badge":15},"AI-ассистент","\u002Fdocs\u002Fexamples\u002Fai-assistant","docs\u002F99.examples\u002F8.ai-assistant","Загружает сделку и её дела, спрашивает у GPT-4o лучшее следующее действие, создаёт задачу, привязанную к сделке, с приоритетом и дедлайном.",{"title":455,"path":456,"stem":457,"restApiVersion":15,"category":362,"description":458,"badge":15},"Веб-поиск + LLM","\u002Fdocs\u002Fexamples\u002Fweb-search-llm","docs\u002F99.examples\u002F9.web-search-llm","Двухшаговый RAG: запрос к любому провайдеру веб-поиска, прогон результата через ваш LLM с цитатами [N], публикация ответа комментарием в таймлайн CRM на сделке.",{"id":460,"title":461,"audited":462,"badge":15,"body":463,"category":291,"description":292,"extension":4304,"links":4305,"meta":4315,"navigation":4316,"path":289,"restApiVersion":15,"seo":4317,"stem":290,"__hash__":4318},"docs\u002Fdocs\u002F2.working-with-the-rest-api\u002F77.limiters.md","Система ограничений","2026-06-28",{"type":464,"value":465,"toc":4271},"minimark",[466,471,475,608,613,618,799,803,929,933,937,944,948,1006,1010,1034,1068,1072,1077,1081,1138,1142,1180,1184,1200,1204,1209,1213,1282,1286,1328,1332,1343,1347,1352,1356,1376,1379,1441,1445,1490,1494,1498,1728,1732,1803,1807,1987,1991,2078,2082,2086,2201,2204,2470,2474,2560,2564,2589,2593,2596,2633,2649,2653,2656,2932,2945,2949,2955,3164,3168,3174,3243,3246,3250,3253,3311,3321,3330,3485,3504,3507,3568,3575,3594,3604,3789,3796,3800,4030,4034,4037,4267],[467,468,470],"h2",{"id":469},"overview","Обзор",[472,473,474],"p",{},"Система состоит из нескольких компонентов, работающих вместе, чтобы предотвратить превышение лимитов API и обеспечить стабильную работу.",[476,477,482],"pre",{"className":478,"code":479,"language":480,"meta":481,"style":481},"language-ts-type shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","┌─────────────────────────────────────────────┐\n│            RestrictionManager               │\n│  (Coordinator of all types of restrictions) │\n└─────┬──────────────┬──────────────┬─────────┘\n      │              │              │\n      ▼              ▼              ▼\n┌──────────┐  ┌────────────┐  ┌─────────────┐\n│ Rate     │  │ Operating  │  │ Adaptive    │\n│ Limiter  │  │ Limiter    │  │ Delayer     │\n└──────────┘  └────────────┘  └─────────────┘\n","ts-type","",[483,484,485,494,507,533,539,545,551,557,581,602],"code",{"__ignoreMap":481},[486,487,490],"span",{"class":488,"line":489},"line",1,[486,491,493],{"class":492},"sTEyZ","┌─────────────────────────────────────────────┐\n",[486,495,497,500,504],{"class":488,"line":496},2,[486,498,499],{"class":492},"│            ",[486,501,503],{"class":502},"sBMFI","RestrictionManager",[486,505,506],{"class":492},"               │\n",[486,508,510,513,516,519,522,525,527,530],{"class":488,"line":509},3,[486,511,512],{"class":492},"│  (",[486,514,515],{"class":502},"Coordinator",[486,517,518],{"class":502}," of",[486,520,521],{"class":502}," all",[486,523,524],{"class":502}," types",[486,526,518],{"class":502},[486,528,529],{"class":502}," restrictions",[486,531,532],{"class":492},") │\n",[486,534,536],{"class":488,"line":535},4,[486,537,538],{"class":492},"└─────┬──────────────┬──────────────┬─────────┘\n",[486,540,542],{"class":488,"line":541},5,[486,543,544],{"class":492},"      │              │              │\n",[486,546,548],{"class":488,"line":547},6,[486,549,550],{"class":492},"      ▼              ▼              ▼\n",[486,552,554],{"class":488,"line":553},7,[486,555,556],{"class":492},"┌──────────┐  ┌────────────┐  ┌─────────────┐\n",[486,558,560,563,566,569,572,575,578],{"class":488,"line":559},8,[486,561,562],{"class":492},"│ ",[486,564,565],{"class":502},"Rate",[486,567,568],{"class":492},"     │  │ ",[486,570,571],{"class":502},"Operating",[486,573,574],{"class":492},"  │  │ ",[486,576,577],{"class":502},"Adaptive",[486,579,580],{"class":492},"    │\n",[486,582,584,586,589,591,593,596,599],{"class":488,"line":583},9,[486,585,562],{"class":492},[486,587,588],{"class":502},"Limiter",[486,590,574],{"class":492},[486,592,588],{"class":502},[486,594,595],{"class":492},"    │  │ ",[486,597,598],{"class":502},"Delayer",[486,600,601],{"class":492},"     │\n",[486,603,605],{"class":488,"line":604},10,[486,606,607],{"class":492},"└──────────┘  └────────────┘  └─────────────┘\n",[609,610,612],"h3",{"id":611},"interfaces-and-types","Интерфейсы и типы",[614,615,617],"h4",{"id":616},"ilimiter-базовый-интерфейс","ILimiter (базовый интерфейс)",[476,619,621],{"className":478,"code":620,"language":480,"meta":481,"style":481},"interface ILimiter {\n  getTitle(): string\n  setConfig(config: any): Promise\u003Cvoid>\n  setLogger(logger: LoggerInterface): void\n  getLogger(): LoggerInterface\n  canProceed(requestId: string, method: string, params?: any): Promise\u003Cboolean>\n  waitIfNeeded(requestId: string, method: string, params?: any): Promise\u003Cnumber>\n  updateStats(requestId: string, method: string, data: any): Promise\u003Cvoid>\n  reset(): Promise\u003Cvoid>\n  getStats(): Record\u003Cstring, any>\n}\n",[483,622,623,634,643,658,669,677,713,741,761,773,793],{"__ignoreMap":481},[486,624,625,628,631],{"class":488,"line":489},[486,626,627],{"class":502},"interface",[486,629,630],{"class":502}," ILimiter",[486,632,633],{"class":492}," {\n",[486,635,636,640],{"class":488,"line":496},[486,637,639],{"class":638},"s2Zo4","  getTitle",[486,641,642],{"class":492},"(): string\n",[486,644,645,648,651,654],{"class":488,"line":509},[486,646,647],{"class":638},"  setConfig",[486,649,650],{"class":492},"(config: any): ",[486,652,653],{"class":502},"Promise",[486,655,657],{"class":656},"sMK4o","\u003Cvoid>\n",[486,659,660,663,666],{"class":488,"line":535},[486,661,662],{"class":638},"  setLogger",[486,664,665],{"class":492},"(logger: LoggerInterface): ",[486,667,668],{"class":656},"void\n",[486,670,671,674],{"class":488,"line":541},[486,672,673],{"class":638},"  getLogger",[486,675,676],{"class":492},"(): LoggerInterface\n",[486,678,679,682,685,688,691,693,696,699,702,704,707,710],{"class":488,"line":547},[486,680,681],{"class":638},"  canProceed",[486,683,684],{"class":492},"(requestId: string",[486,686,687],{"class":656},",",[486,689,690],{"class":492}," method: string",[486,692,687],{"class":656},[486,694,695],{"class":492}," params",[486,697,698],{"class":656},"?:",[486,700,701],{"class":492}," any): ",[486,703,653],{"class":502},[486,705,706],{"class":656},"\u003C",[486,708,709],{"class":492},"boolean",[486,711,712],{"class":656},">\n",[486,714,715,718,720,722,724,726,728,730,732,734,736,739],{"class":488,"line":553},[486,716,717],{"class":638},"  waitIfNeeded",[486,719,684],{"class":492},[486,721,687],{"class":656},[486,723,690],{"class":492},[486,725,687],{"class":656},[486,727,695],{"class":492},[486,729,698],{"class":656},[486,731,701],{"class":492},[486,733,653],{"class":502},[486,735,706],{"class":656},[486,737,738],{"class":492},"number",[486,740,712],{"class":656},[486,742,743,746,748,750,752,754,757,759],{"class":488,"line":559},[486,744,745],{"class":638},"  updateStats",[486,747,684],{"class":492},[486,749,687],{"class":656},[486,751,690],{"class":492},[486,753,687],{"class":656},[486,755,756],{"class":492}," data: any): ",[486,758,653],{"class":502},[486,760,657],{"class":656},[486,762,763,766,769,771],{"class":488,"line":583},[486,764,765],{"class":638},"  reset",[486,767,768],{"class":492},"(): ",[486,770,653],{"class":502},[486,772,657],{"class":656},[486,774,775,778,781,783,786,788,791],{"class":488,"line":604},[486,776,777],{"class":638},"  getStats",[486,779,780],{"class":492},"(): Record",[486,782,706],{"class":656},[486,784,785],{"class":492},"string",[486,787,687],{"class":656},[486,789,790],{"class":492}," any",[486,792,712],{"class":656},[486,794,796],{"class":488,"line":795},11,[486,797,798],{"class":492},"}\n",[614,800,802],{"id":801},"restrictionparams","RestrictionParams",[476,804,806],{"className":478,"code":805,"language":480,"meta":481,"style":481},"interface RestrictionParams {\n  rateLimit?: RateLimitConfig      \u002F\u002F Настройки rate limiting\n  operatingLimit?: OperatingLimitConfig  \u002F\u002F Настройки лимита времени операций\n  adaptiveConfig?: AdaptiveConfig  \u002F\u002F Настройки адаптивной задержки\n  maxRetries?: number              \u002F\u002F Максимальное число повторов запроса (по умолчанию: 3). Кроме `batch`-запросов\n  retryDelay?: number              \u002F\u002F Базовая задержка между повторами в мс (по умолчанию: 1000)\n  retryOnNetworkError?: boolean    \u002F\u002F Повтор при `NETWORK_ERROR` \u002F `REQUEST_TIMEOUT` (HTTP 408) (по умолчанию: true).\n                                   \u002F\u002F Установите `false` для неидемпотентных вызовов — см. «Неидемпотентные вызовы» ниже.\n  hardErrorCodes?: string[]        \u002F\u002F Доп. коды для немедленного выброса (объединяются со встроенным hard-списком).\n  softErrorCodes?: string[]        \u002F\u002F Доп. коды для возврата как AjaxResult с ошибкой (объединяются со встроенным soft-списком).\n}\n",[483,807,808,817,831,844,857,870,882,895,900,913,925],{"__ignoreMap":481},[486,809,810,812,815],{"class":488,"line":489},[486,811,627],{"class":502},[486,813,814],{"class":502}," RestrictionParams",[486,816,633],{"class":492},[486,818,819,822,824,827],{"class":488,"line":496},[486,820,821],{"class":492},"  rateLimit",[486,823,698],{"class":656},[486,825,826],{"class":492}," RateLimitConfig      ",[486,828,830],{"class":829},"sHwdD","\u002F\u002F Настройки rate limiting\n",[486,832,833,836,838,841],{"class":488,"line":509},[486,834,835],{"class":492},"  operatingLimit",[486,837,698],{"class":656},[486,839,840],{"class":492}," OperatingLimitConfig  ",[486,842,843],{"class":829},"\u002F\u002F Настройки лимита времени операций\n",[486,845,846,849,851,854],{"class":488,"line":535},[486,847,848],{"class":492},"  adaptiveConfig",[486,850,698],{"class":656},[486,852,853],{"class":492}," AdaptiveConfig  ",[486,855,856],{"class":829},"\u002F\u002F Настройки адаптивной задержки\n",[486,858,859,862,864,867],{"class":488,"line":541},[486,860,861],{"class":492},"  maxRetries",[486,863,698],{"class":656},[486,865,866],{"class":492}," number              ",[486,868,869],{"class":829},"\u002F\u002F Максимальное число повторов запроса (по умолчанию: 3). Кроме `batch`-запросов\n",[486,871,872,875,877,879],{"class":488,"line":547},[486,873,874],{"class":492},"  retryDelay",[486,876,698],{"class":656},[486,878,866],{"class":492},[486,880,881],{"class":829},"\u002F\u002F Базовая задержка между повторами в мс (по умолчанию: 1000)\n",[486,883,884,887,889,892],{"class":488,"line":553},[486,885,886],{"class":492},"  retryOnNetworkError",[486,888,698],{"class":656},[486,890,891],{"class":492}," boolean    ",[486,893,894],{"class":829},"\u002F\u002F Повтор при `NETWORK_ERROR` \u002F `REQUEST_TIMEOUT` (HTTP 408) (по умолчанию: true).\n",[486,896,897],{"class":488,"line":559},[486,898,899],{"class":829},"                                   \u002F\u002F Установите `false` для неидемпотентных вызовов — см. «Неидемпотентные вызовы» ниже.\n",[486,901,902,905,907,910],{"class":488,"line":583},[486,903,904],{"class":492},"  hardErrorCodes",[486,906,698],{"class":656},[486,908,909],{"class":492}," string[]        ",[486,911,912],{"class":829},"\u002F\u002F Доп. коды для немедленного выброса (объединяются со встроенным hard-списком).\n",[486,914,915,918,920,922],{"class":488,"line":604},[486,916,917],{"class":492},"  softErrorCodes",[486,919,698],{"class":656},[486,921,909],{"class":492},[486,923,924],{"class":829},"\u002F\u002F Доп. коды для возврата как AjaxResult с ошибкой (объединяются со встроенным soft-списком).\n",[486,926,927],{"class":488,"line":795},[486,928,798],{"class":492},[467,930,932],{"id":931},"system-components","Компоненты системы",[609,934,936],{"id":935},"_1-ratelimiter-rate-limiting","1. RateLimiter (ограничение частоты)",[472,938,939,943],{},[940,941,942],"strong",{},"Назначение",": реализует алгоритм «Leaky Bucket» для ограничения частоты запросов.",[614,945,947],{"id":946},"ratelimiter-конфигурация","RateLimiter — конфигурация",[476,949,951],{"className":478,"code":950,"language":480,"meta":481,"style":481},"interface RateLimitConfig {\n  burstLimit: number    \u002F\u002F Ёмкость бакета (максимальное число одновременных запросов)\n  drainRate: number     \u002F\u002F Скорость утечки (запросов в секунду)\n  adaptiveEnabled: boolean  \u002F\u002F Включить адаптивное управление\n}\n",[483,952,953,962,976,989,1002],{"__ignoreMap":481},[486,954,955,957,960],{"class":488,"line":489},[486,956,627],{"class":502},[486,958,959],{"class":502}," RateLimitConfig",[486,961,633],{"class":492},[486,963,964,967,970,973],{"class":488,"line":496},[486,965,966],{"class":502},"  burstLimit",[486,968,969],{"class":656},":",[486,971,972],{"class":492}," number    ",[486,974,975],{"class":829},"\u002F\u002F Ёмкость бакета (максимальное число одновременных запросов)\n",[486,977,978,981,983,986],{"class":488,"line":509},[486,979,980],{"class":502},"  drainRate",[486,982,969],{"class":656},[486,984,985],{"class":492}," number     ",[486,987,988],{"class":829},"\u002F\u002F Скорость утечки (запросов в секунду)\n",[486,990,991,994,996,999],{"class":488,"line":535},[486,992,993],{"class":502},"  adaptiveEnabled",[486,995,969],{"class":656},[486,997,998],{"class":492}," boolean  ",[486,1000,1001],{"class":829},"\u002F\u002F Включить адаптивное управление\n",[486,1003,1004],{"class":488,"line":541},[486,1005,798],{"class":492},[614,1007,1009],{"id":1008},"ratelimiter-принцип-работы","RateLimiter — принцип работы",[1011,1012,1013,1020,1029],"ol",{},[1014,1015,1016,1019],"li",{},[940,1017,1018],{},"Токеновая система",": каждый запрос потребляет один токен",[1014,1021,1022,1025,1026],{},[940,1023,1024],{},"Автоматическое пополнение",": токены пополняются со скоростью ",[483,1027,1028],{},"drainRate",[1014,1030,1031,969],{},[940,1032,1033],{},"Адаптивное управление",[1035,1036,1037,1040,1043],"ul",{},[1014,1038,1039],{},"При частых ошибках лимиты автоматически снижаются на 20%",[1014,1041,1042],{},"При стабильной работе лимиты постепенно восстанавливаются",[1014,1044,1045,1046,1057,1058],{},"Минимальные значения: ",[483,1047,1048,1050,1053],{"className":478,"language":480,"style":481},[486,1049,1028],{"class":502},[486,1051,1052],{"class":656}," =",[486,1054,1056],{"class":1055},"sbssI"," 0.5",", ",[483,1059,1060,1063,1065],{"className":478,"language":480,"style":481},[486,1061,1062],{"class":502},"burstLimit",[486,1064,1052],{"class":656},[486,1066,1067],{"class":1055}," 5",[609,1069,1071],{"id":1070},"_2-operatinglimiter-operation-time-limiting","2. OperatingLimiter (ограничение времени операций)",[472,1073,1074,1076],{},[940,1075,942],{},": контролирует суммарное время выполнения операций в скользящем окне.",[614,1078,1080],{"id":1079},"operatinglimiter-конфигурация","OperatingLimiter — конфигурация",[476,1082,1084],{"className":478,"code":1083,"language":480,"meta":481,"style":481},"interface OperatingLimitConfig {\n  windowMs: number      \u002F\u002F Период времени в миллисекундах (по умолчанию: 600000 = 10 минут)\n  limitMs: number       \u002F\u002F Максимальное время выполнения в миллисекундах (по умолчанию: 480000 = 480 секунд)\n  heavyPercent: number  \u002F\u002F Порог для уведомлений о тяжёлых запросах (%)\n}\n",[483,1085,1086,1095,1108,1121,1134],{"__ignoreMap":481},[486,1087,1088,1090,1093],{"class":488,"line":489},[486,1089,627],{"class":502},[486,1091,1092],{"class":502}," OperatingLimitConfig",[486,1094,633],{"class":492},[486,1096,1097,1100,1102,1105],{"class":488,"line":496},[486,1098,1099],{"class":502},"  windowMs",[486,1101,969],{"class":656},[486,1103,1104],{"class":492}," number      ",[486,1106,1107],{"class":829},"\u002F\u002F Период времени в миллисекундах (по умолчанию: 600000 = 10 минут)\n",[486,1109,1110,1113,1115,1118],{"class":488,"line":509},[486,1111,1112],{"class":502},"  limitMs",[486,1114,969],{"class":656},[486,1116,1117],{"class":492}," number       ",[486,1119,1120],{"class":829},"\u002F\u002F Максимальное время выполнения в миллисекундах (по умолчанию: 480000 = 480 секунд)\n",[486,1122,1123,1126,1128,1131],{"class":488,"line":535},[486,1124,1125],{"class":502},"  heavyPercent",[486,1127,969],{"class":656},[486,1129,1130],{"class":492}," number  ",[486,1132,1133],{"class":829},"\u002F\u002F Порог для уведомлений о тяжёлых запросах (%)\n",[486,1135,1136],{"class":488,"line":541},[486,1137,798],{"class":492},[614,1139,1141],{"id":1140},"operatinglimiter-принцип-работы","OperatingLimiter — принцип работы",[1011,1143,1144,1150,1156,1174],{},[1014,1145,1146,1149],{},[940,1147,1148],{},"Скользящее окно",": отслеживает время выполнения за последние 10 минут",[1014,1151,1152,1155],{},[940,1153,1154],{},"Учёт по методам",": статистика ведётся отдельно для каждого метода",[1014,1157,1158,1161,1162,1173],{},[940,1159,1160],{},"Буфер безопасности",": в расчётах используется ",[483,1163,1164,1167,1170],{"className":478,"language":480,"style":481},[486,1165,1166],{"class":502},"limitMs",[486,1168,1169],{"class":492}," - ",[486,1171,1172],{"class":1055},"5000"," (буфер 5 секунд)",[1014,1175,1176,1179],{},[940,1177,1178],{},"Блокировка",": при достижении лимита блокирует выполнение до сброса статистики",[614,1181,1183],{"id":1182},"operatinglimiter-особенности","OperatingLimiter — особенности",[1035,1185,1186,1189,1192],{},[1014,1187,1188],{},"Для batch-запросов анализирует все вложенные методы",[1014,1190,1191],{},"Автоматическая очистка устаревших данных (> windowMs + 10 секунд)",[1014,1193,1194,1195],{},"Логирование тяжёлых запросов при превышении ",[483,1196,1197],{"className":478,"language":480,"style":481},[486,1198,1199],{"class":502},"heavyPercent",[609,1201,1203],{"id":1202},"_3-adaptivedelayer-adaptive-delays","3. AdaptiveDelayer (адаптивные задержки)",[472,1205,1206,1208],{},[940,1207,942],{},": динамически рассчитывает задержки на основе опыта выполнения предыдущих запросов.",[614,1210,1212],{"id":1211},"adaptivedelayer-конфигурация","AdaptiveDelayer — конфигурация",[476,1214,1216],{"className":478,"code":1215,"language":480,"meta":481,"style":481},"interface AdaptiveConfig {\n  enabled: boolean        \u002F\u002F Включить адаптивные задержки\n  thresholdPercent: number \u002F\u002F Порог активации (% от operating limit)\n  coefficient: number     \u002F\u002F Множитель задержки (0.01 = 1% от оставшегося времени блокировки)\n  maxDelay: number        \u002F\u002F Максимальная задержка в миллисекундах\n}\n",[483,1217,1218,1227,1240,1253,1265,1278],{"__ignoreMap":481},[486,1219,1220,1222,1225],{"class":488,"line":489},[486,1221,627],{"class":502},[486,1223,1224],{"class":502}," AdaptiveConfig",[486,1226,633],{"class":492},[486,1228,1229,1232,1234,1237],{"class":488,"line":496},[486,1230,1231],{"class":502},"  enabled",[486,1233,969],{"class":656},[486,1235,1236],{"class":492}," boolean        ",[486,1238,1239],{"class":829},"\u002F\u002F Включить адаптивные задержки\n",[486,1241,1242,1245,1247,1250],{"class":488,"line":509},[486,1243,1244],{"class":502},"  thresholdPercent",[486,1246,969],{"class":656},[486,1248,1249],{"class":492}," number ",[486,1251,1252],{"class":829},"\u002F\u002F Порог активации (% от operating limit)\n",[486,1254,1255,1258,1260,1262],{"class":488,"line":535},[486,1256,1257],{"class":502},"  coefficient",[486,1259,969],{"class":656},[486,1261,985],{"class":492},[486,1263,1264],{"class":829},"\u002F\u002F Множитель задержки (0.01 = 1% от оставшегося времени блокировки)\n",[486,1266,1267,1270,1272,1275],{"class":488,"line":541},[486,1268,1269],{"class":502},"  maxDelay",[486,1271,969],{"class":656},[486,1273,1274],{"class":492}," number        ",[486,1276,1277],{"class":829},"\u002F\u002F Максимальная задержка в миллисекундах\n",[486,1279,1280],{"class":488,"line":547},[486,1281,798],{"class":492},[614,1283,1285],{"id":1284},"adaptivedelayer-алгоритм-расчёта-задержки","AdaptiveDelayer — алгоритм расчёта задержки",[476,1287,1291],{"className":1288,"code":1289,"language":1290,"meta":481,"style":481},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Если operating текущего метода > (limitMs × thresholdPercent \u002F 100):\n  Если operating_reset_at > текущее время:\n    Задержка = (operating_reset_at - текущее время) × coefficient\n  Иначе:\n    Задержка = 7000 мс (значение по умолчанию)\n  \n  Итоговая задержка = min(рассчитанная, maxDelay)\n","html",[483,1292,1293,1298,1303,1308,1313,1318,1323],{"__ignoreMap":481},[486,1294,1295],{"class":488,"line":489},[486,1296,1297],{"class":492},"Если operating текущего метода > (limitMs × thresholdPercent \u002F 100):\n",[486,1299,1300],{"class":488,"line":496},[486,1301,1302],{"class":492},"  Если operating_reset_at > текущее время:\n",[486,1304,1305],{"class":488,"line":509},[486,1306,1307],{"class":492},"    Задержка = (operating_reset_at - текущее время) × coefficient\n",[486,1309,1310],{"class":488,"line":535},[486,1311,1312],{"class":492},"  Иначе:\n",[486,1314,1315],{"class":488,"line":541},[486,1316,1317],{"class":492},"    Задержка = 7000 мс (значение по умолчанию)\n",[486,1319,1320],{"class":488,"line":547},[486,1321,1322],{"class":492},"  \n",[486,1324,1325],{"class":488,"line":553},[486,1326,1327],{"class":492},"  Итоговая задержка = min(рассчитанная, maxDelay)\n",[614,1329,1331],{"id":1330},"adaptivedelayer-особенности","AdaptiveDelayer — особенности",[1035,1333,1334,1337,1340],{},[1014,1335,1336],{},"Для batch-запросов выбирает максимальную задержку среди всех методов",[1014,1338,1339],{},"Не блокирует выполнение, только добавляет задержку",[1014,1341,1342],{},"Использует статистику из OperatingLimiter",[609,1344,1346],{"id":1345},"_4-restrictionmanager-main-coordinator","4. RestrictionManager (главный координатор)",[472,1348,1349,1351],{},[940,1350,942],{},": управляет всеми типами ограничений и обработкой ошибок.",[614,1353,1355],{"id":1354},"порядок-применения-ограничений","Порядок применения ограничений",[1011,1357,1358,1364,1370],{},[1014,1359,1360,1363],{},[940,1361,1362],{},"Проверка Operating Limit",": проверяет лимит времени операций",[1014,1365,1366,1369],{},[940,1367,1368],{},"Адаптивная задержка",": при необходимости применяет адаптивную задержку",[1014,1371,1372,1375],{},[940,1373,1374],{},"Rate Limit",": проверяет и применяет ограничение частоты (цикл для параллельных запросов)",[614,1377,375],{"id":1378},"обработка-ошибок",[476,1380,1382],{"className":478,"code":1381,"language":480,"meta":481,"style":481},"\u002F\u002F Определение типа ошибки\n#isRateLimitError(error): boolean          \u002F\u002F 503 или QUERY_LIMIT_EXCEEDED\n#isOperatingLimitError(error): boolean     \u002F\u002F 429 или OPERATION_TIME_LIMIT\n#isNonRetryableClientError(error): boolean \u002F\u002F HTTP 4xx (кроме 429 \u002F 408)\n#isNeedThrowError(error): boolean          \u002F\u002F Критические ошибки (повтор бессмыслен)\n",[483,1383,1384,1389,1403,1416,1429],{"__ignoreMap":481},[486,1385,1386],{"class":488,"line":489},[486,1387,1388],{"class":829},"\u002F\u002F Определение типа ошибки\n",[486,1390,1391,1394,1397,1400],{"class":488,"line":496},[486,1392,1393],{"class":492},"#",[486,1395,1396],{"class":638},"isRateLimitError",[486,1398,1399],{"class":492},"(error): boolean          ",[486,1401,1402],{"class":829},"\u002F\u002F 503 или QUERY_LIMIT_EXCEEDED\n",[486,1404,1405,1407,1410,1413],{"class":488,"line":509},[486,1406,1393],{"class":492},[486,1408,1409],{"class":638},"isOperatingLimitError",[486,1411,1412],{"class":492},"(error): boolean     ",[486,1414,1415],{"class":829},"\u002F\u002F 429 или OPERATION_TIME_LIMIT\n",[486,1417,1418,1420,1423,1426],{"class":488,"line":535},[486,1419,1393],{"class":492},[486,1421,1422],{"class":638},"isNonRetryableClientError",[486,1424,1425],{"class":492},"(error): boolean ",[486,1427,1428],{"class":829},"\u002F\u002F HTTP 4xx (кроме 429 \u002F 408)\n",[486,1430,1431,1433,1436,1438],{"class":488,"line":541},[486,1432,1393],{"class":492},[486,1434,1435],{"class":638},"isNeedThrowError",[486,1437,1399],{"class":492},[486,1439,1440],{"class":829},"\u002F\u002F Критические ошибки (повтор бессмыслен)\n",[614,1442,1444],{"id":1443},"стратегия-повторов","Стратегия повторов",[1011,1446,1447,1453,1478,1484],{},[1014,1448,1449,1452],{},[940,1450,1451],{},"Для ошибок лимитов",": экспоненциальная задержка с учётом номера попытки",[1014,1454,1455,1458,1459,1462,1463,1466,1467,1469,1470,1473,1474,1477],{},[940,1456,1457],{},"Для клиентских ошибок (HTTP 4xx, кроме 429 \u002F 408)",": без повторов — ответ ",[483,1460,1461],{},"4xx","\nдетерминирован, поэтому повтор не изменит исход. Ошибка\nвыходит из цикла повторов на первой попытке; далее применяется обычная классификация hard\u002Fsoft\n(выбрасывается как ",[483,1464,1465],{},"AjaxError"," или возвращается внутри ",[483,1468,262],{}," для soft-кодов). ",[483,1471,1472],{},"429"," повторяется как rate\u002Foperating limit; ",[483,1475,1476],{},"408"," (таймаут запроса) остаётся временным.",[1014,1479,1480,1483],{},[940,1481,1482],{},"Для прочих ошибок",": базовый backoff с jitter (±10%)",[1014,1485,1486,1489],{},[940,1487,1488],{},"Критические ошибки",": без повторов",[467,1491,1493],{"id":1492},"default-configurations","Конфигурации по умолчанию",[609,1495,1497],{"id":1496},"default-parameters-for-regular-tariffs-standard","Параметры по умолчанию для обычных тарифов (standard)",[476,1499,1501],{"className":478,"code":1500,"language":480,"meta":481,"style":481},"{\n  rateLimit: {\n    burstLimit: 50,      \u002F\u002F 50 одновременных запросов\n    drainRate: 2,        \u002F\u002F 2 запроса в секунду\n    adaptiveEnabled: true\n  },\n  operatingLimit: {\n    windowMs: 600000,    \u002F\u002F 10 минут\n    limitMs: 480000,     \u002F\u002F 480 секунд (8 минут)\n    heavyPercent: 80     \u002F\u002F Уведомление при 80% использования\n  },\n  adaptiveConfig: {\n    enabled: true,\n    thresholdPercent: 80, \u002F\u002F Активация при 80% лимита\n    coefficient: 0.01,    \u002F\u002F 1% от оставшегося времени блокировки\n    maxDelay: 7000        \u002F\u002F Максимум 7 секунд задержки\n  },\n  maxRetries: 3,\n  retryDelay: 1000,\n  retryOnNetworkError: true\n}\n",[483,1502,1503,1508,1517,1532,1547,1557,1562,1570,1585,1600,1613,1617,1626,1640,1655,1671,1685,1690,1702,1714,1723],{"__ignoreMap":481},[486,1504,1505],{"class":488,"line":489},[486,1506,1507],{"class":656},"{\n",[486,1509,1510,1513,1515],{"class":488,"line":496},[486,1511,821],{"class":1512},"swJcz",[486,1514,969],{"class":656},[486,1516,633],{"class":656},[486,1518,1519,1522,1524,1527,1529],{"class":488,"line":509},[486,1520,1521],{"class":1512},"    burstLimit",[486,1523,969],{"class":656},[486,1525,1526],{"class":1055}," 50",[486,1528,687],{"class":656},[486,1530,1531],{"class":829},"      \u002F\u002F 50 одновременных запросов\n",[486,1533,1534,1537,1539,1542,1544],{"class":488,"line":535},[486,1535,1536],{"class":1512},"    drainRate",[486,1538,969],{"class":656},[486,1540,1541],{"class":1055}," 2",[486,1543,687],{"class":656},[486,1545,1546],{"class":829},"        \u002F\u002F 2 запроса в секунду\n",[486,1548,1549,1552,1554],{"class":488,"line":541},[486,1550,1551],{"class":1512},"    adaptiveEnabled",[486,1553,969],{"class":656},[486,1555,1556],{"class":502}," true\n",[486,1558,1559],{"class":488,"line":547},[486,1560,1561],{"class":656},"  },\n",[486,1563,1564,1566,1568],{"class":488,"line":553},[486,1565,835],{"class":1512},[486,1567,969],{"class":656},[486,1569,633],{"class":656},[486,1571,1572,1575,1577,1580,1582],{"class":488,"line":559},[486,1573,1574],{"class":1512},"    windowMs",[486,1576,969],{"class":656},[486,1578,1579],{"class":1055}," 600000",[486,1581,687],{"class":656},[486,1583,1584],{"class":829},"    \u002F\u002F 10 минут\n",[486,1586,1587,1590,1592,1595,1597],{"class":488,"line":583},[486,1588,1589],{"class":1512},"    limitMs",[486,1591,969],{"class":656},[486,1593,1594],{"class":1055}," 480000",[486,1596,687],{"class":656},[486,1598,1599],{"class":829},"     \u002F\u002F 480 секунд (8 минут)\n",[486,1601,1602,1605,1607,1610],{"class":488,"line":604},[486,1603,1604],{"class":1512},"    heavyPercent",[486,1606,969],{"class":656},[486,1608,1609],{"class":1055}," 80",[486,1611,1612],{"class":829},"     \u002F\u002F Уведомление при 80% использования\n",[486,1614,1615],{"class":488,"line":795},[486,1616,1561],{"class":656},[486,1618,1620,1622,1624],{"class":488,"line":1619},12,[486,1621,848],{"class":1512},[486,1623,969],{"class":656},[486,1625,633],{"class":656},[486,1627,1629,1632,1634,1637],{"class":488,"line":1628},13,[486,1630,1631],{"class":1512},"    enabled",[486,1633,969],{"class":656},[486,1635,1636],{"class":502}," true",[486,1638,1639],{"class":656},",\n",[486,1641,1643,1646,1648,1650,1652],{"class":488,"line":1642},14,[486,1644,1645],{"class":1512},"    thresholdPercent",[486,1647,969],{"class":656},[486,1649,1609],{"class":1055},[486,1651,687],{"class":656},[486,1653,1654],{"class":829}," \u002F\u002F Активация при 80% лимита\n",[486,1656,1658,1661,1663,1666,1668],{"class":488,"line":1657},15,[486,1659,1660],{"class":1512},"    coefficient",[486,1662,969],{"class":656},[486,1664,1665],{"class":1055}," 0.01",[486,1667,687],{"class":656},[486,1669,1670],{"class":829},"    \u002F\u002F 1% от оставшегося времени блокировки\n",[486,1672,1674,1677,1679,1682],{"class":488,"line":1673},16,[486,1675,1676],{"class":1512},"    maxDelay",[486,1678,969],{"class":656},[486,1680,1681],{"class":1055}," 7000",[486,1683,1684],{"class":829},"        \u002F\u002F Максимум 7 секунд задержки\n",[486,1686,1688],{"class":488,"line":1687},17,[486,1689,1561],{"class":656},[486,1691,1693,1695,1697,1700],{"class":488,"line":1692},18,[486,1694,861],{"class":1512},[486,1696,969],{"class":656},[486,1698,1699],{"class":1055}," 3",[486,1701,1639],{"class":656},[486,1703,1705,1707,1709,1712],{"class":488,"line":1704},19,[486,1706,874],{"class":1512},[486,1708,969],{"class":656},[486,1710,1711],{"class":1055}," 1000",[486,1713,1639],{"class":656},[486,1715,1717,1719,1721],{"class":488,"line":1716},20,[486,1718,886],{"class":1512},[486,1720,969],{"class":656},[486,1722,1556],{"class":502},[486,1724,1726],{"class":488,"line":1725},21,[486,1727,798],{"class":656},[609,1729,1731],{"id":1730},"parameters-for-the-enterprise-plan","Параметры для тарифа Enterprise",[476,1733,1735],{"className":478,"code":1734,"language":480,"meta":481,"style":481},"{\n  ...standard,\n  rateLimit: {\n    burstLimit: 250,     \u002F\u002F 250 одновременных запросов\n    drainRate: 5,        \u002F\u002F 5 запросов в секунду\n    adaptiveEnabled: true\n  }\n}\n",[483,1736,1737,1741,1751,1759,1773,1786,1794,1799],{"__ignoreMap":481},[486,1738,1739],{"class":488,"line":489},[486,1740,1507],{"class":656},[486,1742,1743,1746,1749],{"class":488,"line":496},[486,1744,1745],{"class":656},"  ...",[486,1747,1748],{"class":502},"standard",[486,1750,1639],{"class":656},[486,1752,1753,1755,1757],{"class":488,"line":509},[486,1754,821],{"class":1512},[486,1756,969],{"class":656},[486,1758,633],{"class":656},[486,1760,1761,1763,1765,1768,1770],{"class":488,"line":535},[486,1762,1521],{"class":1512},[486,1764,969],{"class":656},[486,1766,1767],{"class":1055}," 250",[486,1769,687],{"class":656},[486,1771,1772],{"class":829},"     \u002F\u002F 250 одновременных запросов\n",[486,1774,1775,1777,1779,1781,1783],{"class":488,"line":541},[486,1776,1536],{"class":1512},[486,1778,969],{"class":656},[486,1780,1067],{"class":1055},[486,1782,687],{"class":656},[486,1784,1785],{"class":829},"        \u002F\u002F 5 запросов в секунду\n",[486,1787,1788,1790,1792],{"class":488,"line":547},[486,1789,1551],{"class":1512},[486,1791,969],{"class":656},[486,1793,1556],{"class":502},[486,1795,1796],{"class":488,"line":553},[486,1797,1798],{"class":656},"  }\n",[486,1800,1801],{"class":488,"line":559},[486,1802,798],{"class":656},[609,1804,1806],{"id":1805},"parameters-for-bulk-data-processing","Параметры для массовой обработки данных",[476,1808,1810],{"className":478,"code":1809,"language":480,"meta":481,"style":481},"{\n  ...standard,\n  rateLimit: {\n    burstLimit: 30,\n    drainRate: 1,\n    adaptiveEnabled: true\n  },\n  operatingLimit: {\n    windowMs: 600_000,\n    limitMs: 480_000,\n    heavyPercent: 50 \u002F\u002F Более высокий порог для уведомлений\n  },\n  adaptiveConfig: {\n    enabled: true,\n    thresholdPercent: 50, \u002F\u002F Больше порог\n    coefficient: 0.015, \u002F\u002F Больше пауза\n    maxDelay: 10_000 \u002F\u002F Макс 10 секунд\n  },\n  maxRetries: 5 \u002F\u002F Больше попыток\n}\n",[483,1811,1812,1816,1824,1832,1843,1854,1862,1866,1874,1885,1896,1907,1911,1919,1929,1942,1956,1968,1972,1983],{"__ignoreMap":481},[486,1813,1814],{"class":488,"line":489},[486,1815,1507],{"class":656},[486,1817,1818,1820,1822],{"class":488,"line":496},[486,1819,1745],{"class":656},[486,1821,1748],{"class":502},[486,1823,1639],{"class":656},[486,1825,1826,1828,1830],{"class":488,"line":509},[486,1827,821],{"class":1512},[486,1829,969],{"class":656},[486,1831,633],{"class":656},[486,1833,1834,1836,1838,1841],{"class":488,"line":535},[486,1835,1521],{"class":1512},[486,1837,969],{"class":656},[486,1839,1840],{"class":1055}," 30",[486,1842,1639],{"class":656},[486,1844,1845,1847,1849,1852],{"class":488,"line":541},[486,1846,1536],{"class":1512},[486,1848,969],{"class":656},[486,1850,1851],{"class":1055}," 1",[486,1853,1639],{"class":656},[486,1855,1856,1858,1860],{"class":488,"line":547},[486,1857,1551],{"class":1512},[486,1859,969],{"class":656},[486,1861,1556],{"class":502},[486,1863,1864],{"class":488,"line":553},[486,1865,1561],{"class":656},[486,1867,1868,1870,1872],{"class":488,"line":559},[486,1869,835],{"class":1512},[486,1871,969],{"class":656},[486,1873,633],{"class":656},[486,1875,1876,1878,1880,1883],{"class":488,"line":583},[486,1877,1574],{"class":1512},[486,1879,969],{"class":656},[486,1881,1882],{"class":1055}," 600_000",[486,1884,1639],{"class":656},[486,1886,1887,1889,1891,1894],{"class":488,"line":604},[486,1888,1589],{"class":1512},[486,1890,969],{"class":656},[486,1892,1893],{"class":1055}," 480_000",[486,1895,1639],{"class":656},[486,1897,1898,1900,1902,1904],{"class":488,"line":795},[486,1899,1604],{"class":1512},[486,1901,969],{"class":656},[486,1903,1526],{"class":1055},[486,1905,1906],{"class":829}," \u002F\u002F Более высокий порог для уведомлений\n",[486,1908,1909],{"class":488,"line":1619},[486,1910,1561],{"class":656},[486,1912,1913,1915,1917],{"class":488,"line":1628},[486,1914,848],{"class":1512},[486,1916,969],{"class":656},[486,1918,633],{"class":656},[486,1920,1921,1923,1925,1927],{"class":488,"line":1642},[486,1922,1631],{"class":1512},[486,1924,969],{"class":656},[486,1926,1636],{"class":502},[486,1928,1639],{"class":656},[486,1930,1931,1933,1935,1937,1939],{"class":488,"line":1657},[486,1932,1645],{"class":1512},[486,1934,969],{"class":656},[486,1936,1526],{"class":1055},[486,1938,687],{"class":656},[486,1940,1941],{"class":829}," \u002F\u002F Больше порог\n",[486,1943,1944,1946,1948,1951,1953],{"class":488,"line":1673},[486,1945,1660],{"class":1512},[486,1947,969],{"class":656},[486,1949,1950],{"class":1055}," 0.015",[486,1952,687],{"class":656},[486,1954,1955],{"class":829}," \u002F\u002F Больше пауза\n",[486,1957,1958,1960,1962,1965],{"class":488,"line":1687},[486,1959,1676],{"class":1512},[486,1961,969],{"class":656},[486,1963,1964],{"class":1055}," 10_000",[486,1966,1967],{"class":829}," \u002F\u002F Макс 10 секунд\n",[486,1969,1970],{"class":488,"line":1692},[486,1971,1561],{"class":656},[486,1973,1974,1976,1978,1980],{"class":488,"line":1704},[486,1975,861],{"class":1512},[486,1977,969],{"class":656},[486,1979,1067],{"class":1055},[486,1981,1982],{"class":829}," \u002F\u002F Больше попыток\n",[486,1984,1985],{"class":488,"line":1716},[486,1986,798],{"class":656},[609,1988,1990],{"id":1989},"real-time-parameters","Параметры реального времени",[476,1992,1994],{"className":478,"code":1993,"language":480,"meta":481,"style":481},"{\n  ...standard,\n  adaptiveConfig: {\n    enabled: false, \u002F\u002F Выключено\n    thresholdPercent: 100,\n    coefficient: 0.001,\n    maxDelay: 480_000\n  },\n  maxRetries: 1\n}\n",[483,1995,1996,2000,2008,2016,2030,2041,2052,2061,2065,2074],{"__ignoreMap":481},[486,1997,1998],{"class":488,"line":489},[486,1999,1507],{"class":656},[486,2001,2002,2004,2006],{"class":488,"line":496},[486,2003,1745],{"class":656},[486,2005,1748],{"class":502},[486,2007,1639],{"class":656},[486,2009,2010,2012,2014],{"class":488,"line":509},[486,2011,848],{"class":1512},[486,2013,969],{"class":656},[486,2015,633],{"class":656},[486,2017,2018,2020,2022,2025,2027],{"class":488,"line":535},[486,2019,1631],{"class":1512},[486,2021,969],{"class":656},[486,2023,2024],{"class":502}," false",[486,2026,687],{"class":656},[486,2028,2029],{"class":829}," \u002F\u002F Выключено\n",[486,2031,2032,2034,2036,2039],{"class":488,"line":541},[486,2033,1645],{"class":1512},[486,2035,969],{"class":656},[486,2037,2038],{"class":1055}," 100",[486,2040,1639],{"class":656},[486,2042,2043,2045,2047,2050],{"class":488,"line":547},[486,2044,1660],{"class":1512},[486,2046,969],{"class":656},[486,2048,2049],{"class":1055}," 0.001",[486,2051,1639],{"class":656},[486,2053,2054,2056,2058],{"class":488,"line":553},[486,2055,1676],{"class":1512},[486,2057,969],{"class":656},[486,2059,2060],{"class":1055}," 480_000\n",[486,2062,2063],{"class":488,"line":559},[486,2064,1561],{"class":656},[486,2066,2067,2069,2071],{"class":488,"line":583},[486,2068,861],{"class":1512},[486,2070,969],{"class":656},[486,2072,2073],{"class":1055}," 1\n",[486,2075,2076],{"class":488,"line":604},[486,2077,798],{"class":656},[467,2079,2081],{"id":2080},"monitoring-and-statistics","Мониторинг и статистика",[609,2083,2085],{"id":2084},"getting-statistics","Получение статистики",[476,2087,2091],{"className":2088,"code":2089,"language":2090,"meta":481,"style":481},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { ApiVersion } from '@bitrix24\u002Fb24jssdk'\n\n\u002F\u002F const $b24 = ...\n\nconst statsV2 = $b24.getHttpClient(ApiVersion.v2).getStats()\nconst statsV3 = $b24.getHttpClient(ApiVersion.v3).getStats()\n","ts",[483,2092,2093,2121,2127,2132,2136,2173],{"__ignoreMap":481},[486,2094,2095,2099,2102,2105,2108,2111,2114,2118],{"class":488,"line":489},[486,2096,2098],{"class":2097},"s7zQu","import",[486,2100,2101],{"class":656}," {",[486,2103,2104],{"class":492}," ApiVersion",[486,2106,2107],{"class":656}," }",[486,2109,2110],{"class":2097}," from",[486,2112,2113],{"class":656}," '",[486,2115,2117],{"class":2116},"sfazB","@bitrix24\u002Fb24jssdk",[486,2119,2120],{"class":656},"'\n",[486,2122,2123],{"class":488,"line":496},[486,2124,2126],{"emptyLinePlaceholder":2125},true,"\n",[486,2128,2129],{"class":488,"line":509},[486,2130,2131],{"class":829},"\u002F\u002F const $b24 = ...\n",[486,2133,2134],{"class":488,"line":535},[486,2135,2126],{"emptyLinePlaceholder":2125},[486,2137,2138,2142,2145,2148,2151,2154,2157,2160,2162,2165,2167,2170],{"class":488,"line":541},[486,2139,2141],{"class":2140},"spNyl","const",[486,2143,2144],{"class":492}," statsV2 ",[486,2146,2147],{"class":656},"=",[486,2149,2150],{"class":492}," $b24",[486,2152,2153],{"class":656},".",[486,2155,2156],{"class":638},"getHttpClient",[486,2158,2159],{"class":492},"(ApiVersion",[486,2161,2153],{"class":656},[486,2163,2164],{"class":492},"v2)",[486,2166,2153],{"class":656},[486,2168,2169],{"class":638},"getStats",[486,2171,2172],{"class":492},"()\n",[486,2174,2175,2177,2180,2182,2184,2186,2188,2190,2192,2195,2197,2199],{"class":488,"line":547},[486,2176,2141],{"class":2140},[486,2178,2179],{"class":492}," statsV3 ",[486,2181,2147],{"class":656},[486,2183,2150],{"class":492},[486,2185,2153],{"class":656},[486,2187,2156],{"class":638},[486,2189,2159],{"class":492},[486,2191,2153],{"class":656},[486,2193,2194],{"class":492},"v3)",[486,2196,2153],{"class":656},[486,2198,2169],{"class":638},[486,2200,2172],{"class":492},[472,2202,2203],{},"Структура статистики:",[476,2205,2207],{"className":478,"code":2206,"language":480,"meta":481,"style":481},"{\n  \u002F\u002F Общая статистика\n  retries: number,                 \u002F\u002F Число попыток повтора\n  consecutiveErrors: number,       \u002F\u002F Последовательные ошибки\n  limitHits: number,               \u002F\u002F Попадания в лимит\n  \n  \u002F\u002F Rate Limiter\n  tokens: number,                  \u002F\u002F Текущее число токенов\n  burstLimit: number,              \u002F\u002F Текущий burst limit\n  drainRate: number,               \u002F\u002F Текущий drain rate\n  \n  \u002F\u002F Adaptive Delayer\n  adaptiveDelays: number,          \u002F\u002F Число применённых задержек\n  totalAdaptiveDelay: number,      \u002F\u002F Суммарное время задержек\n  adaptiveDelayAvg: number,        \u002F\u002F Средняя задержка\n  \n  \u002F\u002F Operating Limiter\n  heavyRequestCount: number,       \u002F\u002F Число тяжёлых запросов\n  operatingStats: {                \u002F\u002F Статистика по методам (в секундах)\n    [method: string]: number\n  },\n  \n  \u002F\u002F Ошибки по методам\n  errorCounts: {\n    [method: string]: number\n  }\n}\n",[483,2208,2209,2213,2218,2233,2247,2261,2265,2270,2284,2297,2310,2314,2319,2333,2347,2361,2365,2370,2384,2396,2418,2422,2427,2433,2443,2460,2465],{"__ignoreMap":481},[486,2210,2211],{"class":488,"line":489},[486,2212,1507],{"class":656},[486,2214,2215],{"class":488,"line":496},[486,2216,2217],{"class":829},"  \u002F\u002F Общая статистика\n",[486,2219,2220,2223,2225,2228,2230],{"class":488,"line":509},[486,2221,2222],{"class":1512},"  retries",[486,2224,969],{"class":656},[486,2226,2227],{"class":502}," number",[486,2229,687],{"class":656},[486,2231,2232],{"class":829},"                 \u002F\u002F Число попыток повтора\n",[486,2234,2235,2238,2240,2242,2244],{"class":488,"line":535},[486,2236,2237],{"class":1512},"  consecutiveErrors",[486,2239,969],{"class":656},[486,2241,2227],{"class":502},[486,2243,687],{"class":656},[486,2245,2246],{"class":829},"       \u002F\u002F Последовательные ошибки\n",[486,2248,2249,2252,2254,2256,2258],{"class":488,"line":541},[486,2250,2251],{"class":1512},"  limitHits",[486,2253,969],{"class":656},[486,2255,2227],{"class":502},[486,2257,687],{"class":656},[486,2259,2260],{"class":829},"               \u002F\u002F Попадания в лимит\n",[486,2262,2263],{"class":488,"line":547},[486,2264,1322],{"class":492},[486,2266,2267],{"class":488,"line":553},[486,2268,2269],{"class":829},"  \u002F\u002F Rate Limiter\n",[486,2271,2272,2275,2277,2279,2281],{"class":488,"line":559},[486,2273,2274],{"class":1512},"  tokens",[486,2276,969],{"class":656},[486,2278,2227],{"class":502},[486,2280,687],{"class":656},[486,2282,2283],{"class":829},"                  \u002F\u002F Текущее число токенов\n",[486,2285,2286,2288,2290,2292,2294],{"class":488,"line":583},[486,2287,966],{"class":1512},[486,2289,969],{"class":656},[486,2291,2227],{"class":502},[486,2293,687],{"class":656},[486,2295,2296],{"class":829},"              \u002F\u002F Текущий burst limit\n",[486,2298,2299,2301,2303,2305,2307],{"class":488,"line":604},[486,2300,980],{"class":1512},[486,2302,969],{"class":656},[486,2304,2227],{"class":502},[486,2306,687],{"class":656},[486,2308,2309],{"class":829},"               \u002F\u002F Текущий drain rate\n",[486,2311,2312],{"class":488,"line":795},[486,2313,1322],{"class":492},[486,2315,2316],{"class":488,"line":1619},[486,2317,2318],{"class":829},"  \u002F\u002F Adaptive Delayer\n",[486,2320,2321,2324,2326,2328,2330],{"class":488,"line":1628},[486,2322,2323],{"class":1512},"  adaptiveDelays",[486,2325,969],{"class":656},[486,2327,2227],{"class":502},[486,2329,687],{"class":656},[486,2331,2332],{"class":829},"          \u002F\u002F Число применённых задержек\n",[486,2334,2335,2338,2340,2342,2344],{"class":488,"line":1642},[486,2336,2337],{"class":1512},"  totalAdaptiveDelay",[486,2339,969],{"class":656},[486,2341,2227],{"class":502},[486,2343,687],{"class":656},[486,2345,2346],{"class":829},"      \u002F\u002F Суммарное время задержек\n",[486,2348,2349,2352,2354,2356,2358],{"class":488,"line":1657},[486,2350,2351],{"class":1512},"  adaptiveDelayAvg",[486,2353,969],{"class":656},[486,2355,2227],{"class":502},[486,2357,687],{"class":656},[486,2359,2360],{"class":829},"        \u002F\u002F Средняя задержка\n",[486,2362,2363],{"class":488,"line":1673},[486,2364,1322],{"class":492},[486,2366,2367],{"class":488,"line":1687},[486,2368,2369],{"class":829},"  \u002F\u002F Operating Limiter\n",[486,2371,2372,2375,2377,2379,2381],{"class":488,"line":1692},[486,2373,2374],{"class":1512},"  heavyRequestCount",[486,2376,969],{"class":656},[486,2378,2227],{"class":502},[486,2380,687],{"class":656},[486,2382,2383],{"class":829},"       \u002F\u002F Число тяжёлых запросов\n",[486,2385,2386,2389,2391,2393],{"class":488,"line":1704},[486,2387,2388],{"class":1512},"  operatingStats",[486,2390,969],{"class":656},[486,2392,2101],{"class":656},[486,2394,2395],{"class":829},"                \u002F\u002F Статистика по методам (в секундах)\n",[486,2397,2398,2401,2405,2407,2410,2413,2415],{"class":488,"line":1716},[486,2399,2400],{"class":492},"    [",[486,2402,2404],{"class":2403},"sHdIc","method",[486,2406,969],{"class":656},[486,2408,2409],{"class":502}," string",[486,2411,2412],{"class":492},"]",[486,2414,969],{"class":656},[486,2416,2417],{"class":502}," number\n",[486,2419,2420],{"class":488,"line":1725},[486,2421,1561],{"class":656},[486,2423,2425],{"class":488,"line":2424},22,[486,2426,1322],{"class":492},[486,2428,2430],{"class":488,"line":2429},23,[486,2431,2432],{"class":829},"  \u002F\u002F Ошибки по методам\n",[486,2434,2436,2439,2441],{"class":488,"line":2435},24,[486,2437,2438],{"class":1512},"  errorCounts",[486,2440,969],{"class":656},[486,2442,633],{"class":656},[486,2444,2446,2448,2450,2452,2454,2456,2458],{"class":488,"line":2445},25,[486,2447,2400],{"class":492},[486,2449,2404],{"class":2403},[486,2451,969],{"class":656},[486,2453,2409],{"class":502},[486,2455,2412],{"class":492},[486,2457,969],{"class":656},[486,2459,2417],{"class":502},[486,2461,2463],{"class":488,"line":2462},26,[486,2464,1798],{"class":656},[486,2466,2468],{"class":488,"line":2467},27,[486,2469,798],{"class":656},[609,2471,2473],{"id":2472},"resetting-statistics","Сброс статистики",[476,2475,2477],{"className":2088,"code":2476,"language":2090,"meta":481,"style":481},"\u002F\u002F Полный сброс всей статистики лимитера\nimport { ApiVersion } from '@bitrix24\u002Fb24jssdk'\n\n\u002F\u002F const $b24 = ...\n\nawait $b24.getHttpClient(ApiVersion.v2).reset()\nawait $b24.getHttpClient(ApiVersion.v3).reset()\n",[483,2478,2479,2484,2502,2506,2510,2514,2538],{"__ignoreMap":481},[486,2480,2481],{"class":488,"line":489},[486,2482,2483],{"class":829},"\u002F\u002F Полный сброс всей статистики лимитера\n",[486,2485,2486,2488,2490,2492,2494,2496,2498,2500],{"class":488,"line":496},[486,2487,2098],{"class":2097},[486,2489,2101],{"class":656},[486,2491,2104],{"class":492},[486,2493,2107],{"class":656},[486,2495,2110],{"class":2097},[486,2497,2113],{"class":656},[486,2499,2117],{"class":2116},[486,2501,2120],{"class":656},[486,2503,2504],{"class":488,"line":509},[486,2505,2126],{"emptyLinePlaceholder":2125},[486,2507,2508],{"class":488,"line":535},[486,2509,2131],{"class":829},[486,2511,2512],{"class":488,"line":541},[486,2513,2126],{"emptyLinePlaceholder":2125},[486,2515,2516,2519,2521,2523,2525,2527,2529,2531,2533,2536],{"class":488,"line":547},[486,2517,2518],{"class":2097},"await",[486,2520,2150],{"class":492},[486,2522,2153],{"class":656},[486,2524,2156],{"class":638},[486,2526,2159],{"class":492},[486,2528,2153],{"class":656},[486,2530,2164],{"class":492},[486,2532,2153],{"class":656},[486,2534,2535],{"class":638},"reset",[486,2537,2172],{"class":492},[486,2539,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558],{"class":488,"line":553},[486,2541,2518],{"class":2097},[486,2543,2150],{"class":492},[486,2545,2153],{"class":656},[486,2547,2156],{"class":638},[486,2549,2159],{"class":492},[486,2551,2153],{"class":656},[486,2553,2194],{"class":492},[486,2555,2153],{"class":656},[486,2557,2535],{"class":638},[486,2559,2172],{"class":492},[467,2561,2563],{"id":2562},"long-running-requests-non-idempotent-calls","Долгие запросы и неидемпотентные вызовы",[472,2565,2566,2567,2570,2571,1057,2574,2577,2578,2581,2582,2153],{},"SDK поставляется с 30-секундным таймаутом axios и повторяет неудавшиеся запросы до ",[483,2568,2569],{},"maxRetries"," раз. Оба значения по умолчанию неверны для ",[940,2572,2573],{},"долгих",[940,2575,2576],{},"неидемпотентных"," REST-методов — канонический пример ",[483,2579,2580],{},"crm.documentgenerator.document.add",", который может рендерить шаблон 10‒60 секунд и является исходным репортом из ",[2583,2584,2588],"a",{"href":2585,"rel":2586},"https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Fissues\u002F24",[2587],"nofollow","issue #24",[609,2590,2592],{"id":2591},"why-it-goes-wrong-by-default","Почему по умолчанию это ломается",[472,2594,2595],{},"Когда сервер отвечает дольше таймаута axios, разворачивается такая последовательность:",[1011,2597,2598,2601,2612,2617,2627],{},[1014,2599,2600],{},"Клиент открывает запрос, сервер начинает обработку.",[1014,2602,2603,2604,2607,2608,2611],{},"Axios срабатывает по таймауту, SDK видит ",[483,2605,2606],{},"REQUEST_TIMEOUT"," (",[483,2609,2610],{},"code: ECONNABORTED",").",[1014,2613,2614,2616],{},[483,2615,2606],{}," трактуется как временная ошибка → SDK повторяет.",[1014,2618,2619,2620,2623,2624,2153],{},"Сервер, не зная, что клиент сдался, завершает первый запрос и\n",[940,2621,2622],{},"сохраняет документ",". Затем принимает повтор и сохраняет ",[940,2625,2626],{},"ещё один",[1014,2628,2629,2630,2632],{},"После ",[483,2631,2569],{}," попыток SDK выбрасывает исходную ошибку (её реальный код),\nи у вызывающего остаётся 2-3 дубликата в CRM.",[472,2634,2635,2636,1639,2639,1057,2642,1057,2645,2648],{},"Тот же риск касается каждого неидемпотентного метода: ",[483,2637,2638],{},"crm.deal.add",[483,2640,2641],{},"crm.contact.add",[483,2643,2644],{},"disk.folder.uploadfile",[483,2646,2647],{},"tasks.task.add",", любого кастомного REST-\nendpoint, создающего состояние.",[609,2650,2652],{"id":2651},"recommended-configuration","Рекомендуемая конфигурация",[472,2654,2655],{},"Используйте этот паттерн для любого вызова, создающего сущность, независимо от ожидаемой длительности:",[476,2657,2659],{"className":2088,"code":2658,"language":2090,"meta":481,"style":481},"import { ApiVersion, ParamsFactory } from '@bitrix24\u002Fb24jssdk'\n\n\u002F\u002F const $b24 = ...\n\n\u002F\u002F 1. Поднимите таймаут, чтобы клиент действительно ждал медленную операцию.\nconst clientAxios = $b24.getHttpClient(ApiVersion.v2).ajaxClient\nclientAxios.defaults.timeout = 120_000 \u002F\u002F по умолчанию 30_000\n\n\u002F\u002F 2. Отключите повторы на транспортных ошибках, чтобы клиентский таймаут никогда\n\u002F\u002F    не создавал дубликаты сущностей на сервере.\nawait $b24.setRestrictionManagerParams({\n  ...ParamsFactory.getDefault(),\n  retryOnNetworkError: false\n})\n\n\u002F\u002F Теперь безопасно для неидемпотентных вызовов.\nconst result = await $b24.actions.v2.call.make({\n  method: 'crm.documentgenerator.document.add',\n  params: { templateId: 42, entityTypeId: 2, entityId: 6014, values: {} }\n})\n",[483,2660,2661,2684,2688,2692,2696,2701,2727,2750,2754,2759,2764,2780,2797,2807,2815,2819,2824,2861,2877,2926],{"__ignoreMap":481},[486,2662,2663,2665,2667,2669,2671,2674,2676,2678,2680,2682],{"class":488,"line":489},[486,2664,2098],{"class":2097},[486,2666,2101],{"class":656},[486,2668,2104],{"class":492},[486,2670,687],{"class":656},[486,2672,2673],{"class":492}," ParamsFactory",[486,2675,2107],{"class":656},[486,2677,2110],{"class":2097},[486,2679,2113],{"class":656},[486,2681,2117],{"class":2116},[486,2683,2120],{"class":656},[486,2685,2686],{"class":488,"line":496},[486,2687,2126],{"emptyLinePlaceholder":2125},[486,2689,2690],{"class":488,"line":509},[486,2691,2131],{"class":829},[486,2693,2694],{"class":488,"line":535},[486,2695,2126],{"emptyLinePlaceholder":2125},[486,2697,2698],{"class":488,"line":541},[486,2699,2700],{"class":829},"\u002F\u002F 1. Поднимите таймаут, чтобы клиент действительно ждал медленную операцию.\n",[486,2702,2703,2705,2708,2710,2712,2714,2716,2718,2720,2722,2724],{"class":488,"line":547},[486,2704,2141],{"class":2140},[486,2706,2707],{"class":492}," clientAxios ",[486,2709,2147],{"class":656},[486,2711,2150],{"class":492},[486,2713,2153],{"class":656},[486,2715,2156],{"class":638},[486,2717,2159],{"class":492},[486,2719,2153],{"class":656},[486,2721,2164],{"class":492},[486,2723,2153],{"class":656},[486,2725,2726],{"class":492},"ajaxClient\n",[486,2728,2729,2732,2734,2737,2739,2742,2744,2747],{"class":488,"line":553},[486,2730,2731],{"class":492},"clientAxios",[486,2733,2153],{"class":656},[486,2735,2736],{"class":492},"defaults",[486,2738,2153],{"class":656},[486,2740,2741],{"class":492},"timeout ",[486,2743,2147],{"class":656},[486,2745,2746],{"class":1055}," 120_000",[486,2748,2749],{"class":829}," \u002F\u002F по умолчанию 30_000\n",[486,2751,2752],{"class":488,"line":559},[486,2753,2126],{"emptyLinePlaceholder":2125},[486,2755,2756],{"class":488,"line":583},[486,2757,2758],{"class":829},"\u002F\u002F 2. Отключите повторы на транспортных ошибках, чтобы клиентский таймаут никогда\n",[486,2760,2761],{"class":488,"line":604},[486,2762,2763],{"class":829},"\u002F\u002F    не создавал дубликаты сущностей на сервере.\n",[486,2765,2766,2768,2770,2772,2775,2778],{"class":488,"line":795},[486,2767,2518],{"class":2097},[486,2769,2150],{"class":492},[486,2771,2153],{"class":656},[486,2773,2774],{"class":638},"setRestrictionManagerParams",[486,2776,2777],{"class":492},"(",[486,2779,1507],{"class":656},[486,2781,2782,2784,2787,2789,2792,2795],{"class":488,"line":1619},[486,2783,1745],{"class":656},[486,2785,2786],{"class":492},"ParamsFactory",[486,2788,2153],{"class":656},[486,2790,2791],{"class":638},"getDefault",[486,2793,2794],{"class":492},"()",[486,2796,1639],{"class":656},[486,2798,2799,2801,2803],{"class":488,"line":1628},[486,2800,886],{"class":1512},[486,2802,969],{"class":656},[486,2804,2806],{"class":2805},"sfNiH"," false\n",[486,2808,2809,2812],{"class":488,"line":1642},[486,2810,2811],{"class":656},"}",[486,2813,2814],{"class":492},")\n",[486,2816,2817],{"class":488,"line":1657},[486,2818,2126],{"emptyLinePlaceholder":2125},[486,2820,2821],{"class":488,"line":1673},[486,2822,2823],{"class":829},"\u002F\u002F Теперь безопасно для неидемпотентных вызовов.\n",[486,2825,2826,2828,2831,2833,2836,2838,2840,2842,2844,2847,2849,2852,2854,2857,2859],{"class":488,"line":1687},[486,2827,2141],{"class":2140},[486,2829,2830],{"class":492}," result ",[486,2832,2147],{"class":656},[486,2834,2835],{"class":2097}," await",[486,2837,2150],{"class":492},[486,2839,2153],{"class":656},[486,2841,91],{"class":492},[486,2843,2153],{"class":656},[486,2845,2846],{"class":492},"v2",[486,2848,2153],{"class":656},[486,2850,2851],{"class":492},"call",[486,2853,2153],{"class":656},[486,2855,2856],{"class":638},"make",[486,2858,2777],{"class":492},[486,2860,1507],{"class":656},[486,2862,2863,2866,2868,2870,2872,2875],{"class":488,"line":1692},[486,2864,2865],{"class":1512},"  method",[486,2867,969],{"class":656},[486,2869,2113],{"class":656},[486,2871,2580],{"class":2116},[486,2873,2874],{"class":656},"'",[486,2876,1639],{"class":656},[486,2878,2879,2882,2884,2886,2889,2891,2894,2896,2899,2901,2903,2905,2908,2910,2913,2915,2918,2920,2923],{"class":488,"line":1704},[486,2880,2881],{"class":1512},"  params",[486,2883,969],{"class":656},[486,2885,2101],{"class":656},[486,2887,2888],{"class":1512}," templateId",[486,2890,969],{"class":656},[486,2892,2893],{"class":1055}," 42",[486,2895,687],{"class":656},[486,2897,2898],{"class":1512}," entityTypeId",[486,2900,969],{"class":656},[486,2902,1541],{"class":1055},[486,2904,687],{"class":656},[486,2906,2907],{"class":1512}," entityId",[486,2909,969],{"class":656},[486,2911,2912],{"class":1055}," 6014",[486,2914,687],{"class":656},[486,2916,2917],{"class":1512}," values",[486,2919,969],{"class":656},[486,2921,2922],{"class":656}," {}",[486,2924,2925],{"class":656}," }\n",[486,2927,2928,2930],{"class":488,"line":1716},[486,2929,2811],{"class":656},[486,2931,2814],{"class":492},[2933,2934,2935],"note",{},[472,2936,2937,2940,2941,2944],{},[940,2938,2939],{},"Одного шага недостаточно.","\nДлинный таймаут без ",[483,2942,2943],{},"retryOnNetworkError: false"," всё равно создаёт дубликаты\nна нестабильной сети (сервер ответил, но ответ не дошёл). Флаг\nбез таймаута срабатывает слишком рано на запросах, которые завершились бы\nза 35-40 секунд.",[609,2946,2948],{"id":2947},"targeted-use-per-call-override","Точечное применение — переопределение на вызов",[472,2950,2951,2952,2954],{},"Если строгое поведение нужно только для конкретного участка кода, создайте отдельный\n",[483,2953,117],{}," для этого вызова вместо мутации глобального:",[476,2956,2958],{"className":2088,"code":2957,"language":2090,"meta":481,"style":481},"import { B24Hook, ParamsFactory } from '@bitrix24\u002Fb24jssdk'\nimport { ApiVersion } from '@bitrix24\u002Fb24jssdk'\n\nconst $b24Strict = B24Hook.fromWebhookUrl(hookUrl, {\n  restrictionParams: {\n    ...ParamsFactory.getDefault(),\n    retryOnNetworkError: false\n  }\n})\n$b24Strict.getHttpClient(ApiVersion.v2).ajaxClient.defaults.timeout = 120_000\n\nawait $b24Strict.actions.v2.call.make({ method: 'crm.deal.add', params: {\u002F*…*\u002F} })\n",[483,2959,2960,2983,3001,3005,3028,3037,3052,3061,3065,3071,3104,3108],{"__ignoreMap":481},[486,2961,2962,2964,2966,2969,2971,2973,2975,2977,2979,2981],{"class":488,"line":489},[486,2963,2098],{"class":2097},[486,2965,2101],{"class":656},[486,2967,2968],{"class":492}," B24Hook",[486,2970,687],{"class":656},[486,2972,2673],{"class":492},[486,2974,2107],{"class":656},[486,2976,2110],{"class":2097},[486,2978,2113],{"class":656},[486,2980,2117],{"class":2116},[486,2982,2120],{"class":656},[486,2984,2985,2987,2989,2991,2993,2995,2997,2999],{"class":488,"line":496},[486,2986,2098],{"class":2097},[486,2988,2101],{"class":656},[486,2990,2104],{"class":492},[486,2992,2107],{"class":656},[486,2994,2110],{"class":2097},[486,2996,2113],{"class":656},[486,2998,2117],{"class":2116},[486,3000,2120],{"class":656},[486,3002,3003],{"class":488,"line":509},[486,3004,2126],{"emptyLinePlaceholder":2125},[486,3006,3007,3009,3012,3014,3016,3018,3021,3024,3026],{"class":488,"line":535},[486,3008,2141],{"class":2140},[486,3010,3011],{"class":492}," $b24Strict ",[486,3013,2147],{"class":656},[486,3015,2968],{"class":492},[486,3017,2153],{"class":656},[486,3019,3020],{"class":638},"fromWebhookUrl",[486,3022,3023],{"class":492},"(hookUrl",[486,3025,687],{"class":656},[486,3027,633],{"class":656},[486,3029,3030,3033,3035],{"class":488,"line":541},[486,3031,3032],{"class":1512},"  restrictionParams",[486,3034,969],{"class":656},[486,3036,633],{"class":656},[486,3038,3039,3042,3044,3046,3048,3050],{"class":488,"line":547},[486,3040,3041],{"class":656},"    ...",[486,3043,2786],{"class":492},[486,3045,2153],{"class":656},[486,3047,2791],{"class":638},[486,3049,2794],{"class":492},[486,3051,1639],{"class":656},[486,3053,3054,3057,3059],{"class":488,"line":553},[486,3055,3056],{"class":1512},"    retryOnNetworkError",[486,3058,969],{"class":656},[486,3060,2806],{"class":2805},[486,3062,3063],{"class":488,"line":559},[486,3064,1798],{"class":656},[486,3066,3067,3069],{"class":488,"line":583},[486,3068,2811],{"class":656},[486,3070,2814],{"class":492},[486,3072,3073,3076,3078,3080,3082,3084,3086,3088,3091,3093,3095,3097,3099,3101],{"class":488,"line":604},[486,3074,3075],{"class":492},"$b24Strict",[486,3077,2153],{"class":656},[486,3079,2156],{"class":638},[486,3081,2159],{"class":492},[486,3083,2153],{"class":656},[486,3085,2164],{"class":492},[486,3087,2153],{"class":656},[486,3089,3090],{"class":492},"ajaxClient",[486,3092,2153],{"class":656},[486,3094,2736],{"class":492},[486,3096,2153],{"class":656},[486,3098,2741],{"class":492},[486,3100,2147],{"class":656},[486,3102,3103],{"class":1055}," 120_000\n",[486,3105,3106],{"class":488,"line":795},[486,3107,2126],{"emptyLinePlaceholder":2125},[486,3109,3110,3112,3115,3117,3119,3121,3123,3125,3127,3129,3131,3133,3136,3139,3141,3143,3145,3147,3149,3151,3153,3155,3158,3160,3162],{"class":488,"line":1619},[486,3111,2518],{"class":2097},[486,3113,3114],{"class":492}," $b24Strict",[486,3116,2153],{"class":656},[486,3118,91],{"class":492},[486,3120,2153],{"class":656},[486,3122,2846],{"class":492},[486,3124,2153],{"class":656},[486,3126,2851],{"class":492},[486,3128,2153],{"class":656},[486,3130,2856],{"class":638},[486,3132,2777],{"class":492},[486,3134,3135],{"class":656},"{",[486,3137,3138],{"class":1512}," method",[486,3140,969],{"class":656},[486,3142,2113],{"class":656},[486,3144,2638],{"class":2116},[486,3146,2874],{"class":656},[486,3148,687],{"class":656},[486,3150,695],{"class":1512},[486,3152,969],{"class":656},[486,3154,2101],{"class":656},[486,3156,3157],{"class":829},"\u002F*…*\u002F",[486,3159,2811],{"class":656},[486,3161,2107],{"class":656},[486,3163,2814],{"class":492},[609,3165,3167],{"id":3166},"last-resort-disable-all-retries","Крайний случай — отключить все повторы",[472,3169,3170,3171,969],{},"Если вы не можете позволить ни одного повтора ни при каких обстоятельствах (например, биллинговая\nоперация), задайте ",[483,3172,3173],{},"maxRetries: 1",[476,3175,3177],{"className":2088,"code":3176,"language":2090,"meta":481,"style":481},"import { ParamsFactory } from '@bitrix24\u002Fb24jssdk'\n\nawait $b24.setRestrictionManagerParams({\n  ...ParamsFactory.getDefault(),\n  maxRetries: 1\n})\n",[483,3178,3179,3197,3201,3215,3229,3237],{"__ignoreMap":481},[486,3180,3181,3183,3185,3187,3189,3191,3193,3195],{"class":488,"line":489},[486,3182,2098],{"class":2097},[486,3184,2101],{"class":656},[486,3186,2673],{"class":492},[486,3188,2107],{"class":656},[486,3190,2110],{"class":2097},[486,3192,2113],{"class":656},[486,3194,2117],{"class":2116},[486,3196,2120],{"class":656},[486,3198,3199],{"class":488,"line":496},[486,3200,2126],{"emptyLinePlaceholder":2125},[486,3202,3203,3205,3207,3209,3211,3213],{"class":488,"line":509},[486,3204,2518],{"class":2097},[486,3206,2150],{"class":492},[486,3208,2153],{"class":656},[486,3210,2774],{"class":638},[486,3212,2777],{"class":492},[486,3214,1507],{"class":656},[486,3216,3217,3219,3221,3223,3225,3227],{"class":488,"line":535},[486,3218,1745],{"class":656},[486,3220,2786],{"class":492},[486,3222,2153],{"class":656},[486,3224,2791],{"class":638},[486,3226,2794],{"class":492},[486,3228,1639],{"class":656},[486,3230,3231,3233,3235],{"class":488,"line":541},[486,3232,861],{"class":1512},[486,3234,969],{"class":656},[486,3236,2073],{"class":1055},[486,3238,3239,3241],{"class":488,"line":547},[486,3240,2811],{"class":656},[486,3242,2814],{"class":492},[472,3244,3245],{},"Это затрагивает каждый класс ошибок, а не только транспортные, поэтому используйте осторожно.",[467,3247,3249],{"id":3248},"customizing-error-classification","Настройка классификации ошибок",[472,3251,3252],{},"SDK группирует коды ошибок REST на три категории:",[1011,3254,3255,3264,3281],{},[1014,3256,3257,3260,3261,3263],{},[940,3258,3259],{},"Hard-ошибки"," — выбрасываются сразу как ",[483,3262,1465],{},". Без повтора. Используются для фатальных\nситуаций (сбои авторизации, неверные аргументы, удалённые порталы).",[1014,3265,3266,3269,3270,3272,3273,3276,3277,3280],{},[940,3267,3268],{},"Soft-ошибки"," — возвращаются внутри ",[483,3271,262],{}," как payload ошибки, ",[940,3274,3275],{},"не","\nвыбрасываются. Используются для кодов, которые вызывающий код обычно проверяет в рамках обычного\nпотока управления (например, ",[483,3278,3279],{},"ENTITY_NOT_FOUND",", ошибки валидации v3).",[1014,3282,3283,3286,3287,3289,3290,3292,3293,3295,3296,3299,3300,1057,3303,1639,3305,3307,3308,3310],{},[940,3284,3285],{},"Всё остальное"," — возможность повтора определяется HTTP-статусом. Клиентские ошибки\n(HTTP ",[483,3288,1461],{},", кроме ",[483,3291,1472],{}," и ",[483,3294,1476],{},") ",[940,3297,3298],{},"никогда не повторяются"," — они\nдетерминированы, поэтому SDK быстро завершается на первой попытке независимо от того,\nперечислен ли код ошибки. Временные состояния (",[483,3301,3302],{},"5xx",[483,3304,1472],{},[483,3306,1476],{},", сетевые ошибки) повторяются до ",[483,3309,2569],{}," раз с backoff и jitter.",[472,3312,3313,3314,3316,3317,3320],{},"Встроенные списки покрывают стандартную REST-поверхность Bitrix24. Если ваше приложение\nиспользует кастомные REST-endpoint-ы (например, из локального приложения или обработчика placement), которые\nвозвращают свои коды ошибок со статусом не ",[483,3315,1461],{},", эти коды будут\n",[940,3318,3319],{},"повторяться по умолчанию"," — что неверно для неидемпотентных бизнес-ошибок.",[472,3322,3323,3324,3292,3327,969],{},"Расширьте классификацию через ",[483,3325,3326],{},"hardErrorCodes",[483,3328,3329],{},"softErrorCodes",[476,3331,3333],{"className":2088,"code":3332,"language":2090,"meta":481,"style":481},"import { ParamsFactory } from '@bitrix24\u002Fb24jssdk'\n\n\u002F\u002F const $b24 = ...\n\nawait $b24.setRestrictionManagerParams({\n  ...ParamsFactory.getDefault(),\n\n  \u002F\u002F Эти будут выброшены сразу вместо повтора:\n  hardErrorCodes: [\n    'DOCUMENT_GENERATOR_ALREADY_IN_QUEUE', \u002F\u002F бизнес-код: не повторять\n    'MY_APP_INVALID_PAYLOAD'               \u002F\u002F кастомный REST: нужна правка на стороне вызывающего\n  ],\n\n  \u002F\u002F Эти будут возвращены в AjaxResult вместо выброса:\n  softErrorCodes: [\n    'MY_APP_VALIDATION_FAILED'             \u002F\u002F ожидается в рамках обычного потока\n  ]\n})\n",[483,3334,3335,3353,3357,3361,3365,3379,3393,3397,3402,3411,3426,3438,3445,3449,3454,3462,3474,3479],{"__ignoreMap":481},[486,3336,3337,3339,3341,3343,3345,3347,3349,3351],{"class":488,"line":489},[486,3338,2098],{"class":2097},[486,3340,2101],{"class":656},[486,3342,2673],{"class":492},[486,3344,2107],{"class":656},[486,3346,2110],{"class":2097},[486,3348,2113],{"class":656},[486,3350,2117],{"class":2116},[486,3352,2120],{"class":656},[486,3354,3355],{"class":488,"line":496},[486,3356,2126],{"emptyLinePlaceholder":2125},[486,3358,3359],{"class":488,"line":509},[486,3360,2131],{"class":829},[486,3362,3363],{"class":488,"line":535},[486,3364,2126],{"emptyLinePlaceholder":2125},[486,3366,3367,3369,3371,3373,3375,3377],{"class":488,"line":541},[486,3368,2518],{"class":2097},[486,3370,2150],{"class":492},[486,3372,2153],{"class":656},[486,3374,2774],{"class":638},[486,3376,2777],{"class":492},[486,3378,1507],{"class":656},[486,3380,3381,3383,3385,3387,3389,3391],{"class":488,"line":547},[486,3382,1745],{"class":656},[486,3384,2786],{"class":492},[486,3386,2153],{"class":656},[486,3388,2791],{"class":638},[486,3390,2794],{"class":492},[486,3392,1639],{"class":656},[486,3394,3395],{"class":488,"line":553},[486,3396,2126],{"emptyLinePlaceholder":2125},[486,3398,3399],{"class":488,"line":559},[486,3400,3401],{"class":829},"  \u002F\u002F Эти будут выброшены сразу вместо повтора:\n",[486,3403,3404,3406,3408],{"class":488,"line":583},[486,3405,904],{"class":1512},[486,3407,969],{"class":656},[486,3409,3410],{"class":492}," [\n",[486,3412,3413,3416,3419,3421,3423],{"class":488,"line":604},[486,3414,3415],{"class":656},"    '",[486,3417,3418],{"class":2116},"DOCUMENT_GENERATOR_ALREADY_IN_QUEUE",[486,3420,2874],{"class":656},[486,3422,687],{"class":656},[486,3424,3425],{"class":829}," \u002F\u002F бизнес-код: не повторять\n",[486,3427,3428,3430,3433,3435],{"class":488,"line":795},[486,3429,3415],{"class":656},[486,3431,3432],{"class":2116},"MY_APP_INVALID_PAYLOAD",[486,3434,2874],{"class":656},[486,3436,3437],{"class":829},"               \u002F\u002F кастомный REST: нужна правка на стороне вызывающего\n",[486,3439,3440,3443],{"class":488,"line":1619},[486,3441,3442],{"class":492},"  ]",[486,3444,1639],{"class":656},[486,3446,3447],{"class":488,"line":1628},[486,3448,2126],{"emptyLinePlaceholder":2125},[486,3450,3451],{"class":488,"line":1642},[486,3452,3453],{"class":829},"  \u002F\u002F Эти будут возвращены в AjaxResult вместо выброса:\n",[486,3455,3456,3458,3460],{"class":488,"line":1657},[486,3457,917],{"class":1512},[486,3459,969],{"class":656},[486,3461,3410],{"class":492},[486,3463,3464,3466,3469,3471],{"class":488,"line":1673},[486,3465,3415],{"class":656},[486,3467,3468],{"class":2116},"MY_APP_VALIDATION_FAILED",[486,3470,2874],{"class":656},[486,3472,3473],{"class":829},"             \u002F\u002F ожидается в рамках обычного потока\n",[486,3475,3476],{"class":488,"line":1687},[486,3477,3478],{"class":492},"  ]\n",[486,3480,3481,3483],{"class":488,"line":1692},[486,3482,2811],{"class":656},[486,3484,2814],{"class":492},[2933,3486,3487],{},[472,3488,3489,3492,3493,3496,3497,3500,3501,2153],{},[940,3490,3491],{},"Объединение, не замена."," Коды, заданные пользователем, добавляются к встроенным\nспискам. Вы можете только ",[940,3494,3495],{},"добавлять"," коды — встроенные (коды авторизации,\n",[483,3498,3499],{},"INTERNAL_SERVER_ERROR",", коды валидации v3 и т.д.) остаются на месте. Это\nпредотвращает случайное отключение критичных защит, таких как обнаружение\n",[483,3502,3503],{},"expired_token",[472,3505,3506],{},"Встроенные списки доступны как статические поля для справки:",[476,3508,3510],{"className":2088,"code":3509,"language":2090,"meta":481,"style":481},"import { RestrictionManager } from '@bitrix24\u002Fb24jssdk'\n\nconsole.log(RestrictionManager.BUILT_IN_HARD_ERROR_CODES)\nconsole.log(RestrictionManager.BUILT_IN_SOFT_ERROR_CODES)\n",[483,3511,3512,3531,3535,3553],{"__ignoreMap":481},[486,3513,3514,3516,3518,3521,3523,3525,3527,3529],{"class":488,"line":489},[486,3515,2098],{"class":2097},[486,3517,2101],{"class":656},[486,3519,3520],{"class":492}," RestrictionManager",[486,3522,2107],{"class":656},[486,3524,2110],{"class":2097},[486,3526,2113],{"class":656},[486,3528,2117],{"class":2116},[486,3530,2120],{"class":656},[486,3532,3533],{"class":488,"line":496},[486,3534,2126],{"emptyLinePlaceholder":2125},[486,3536,3537,3540,3542,3545,3548,3550],{"class":488,"line":509},[486,3538,3539],{"class":492},"console",[486,3541,2153],{"class":656},[486,3543,3544],{"class":638},"log",[486,3546,3547],{"class":492},"(RestrictionManager",[486,3549,2153],{"class":656},[486,3551,3552],{"class":492},"BUILT_IN_HARD_ERROR_CODES)\n",[486,3554,3555,3557,3559,3561,3563,3565],{"class":488,"line":535},[486,3556,3539],{"class":492},[486,3558,2153],{"class":656},[486,3560,3544],{"class":638},[486,3562,3547],{"class":492},[486,3564,2153],{"class":656},[486,3566,3567],{"class":492},"BUILT_IN_SOFT_ERROR_CODES)\n",[467,3569,3571,3572,3574],{"id":3570},"instance-global-scope-of-setrestrictionmanagerparams","Глобальная область ",[483,3573,2774],{}," в пределах экземпляра",[472,3576,3577,3580,3581,3587,3588,3590,3591,3593],{},[483,3578,3579],{},"setRestrictionManagerParams()"," мутирует ",[940,3582,3583,3584],{},"весь экземпляр ",[483,3585,3586],{},"$b24"," — он\nперенастраивает единственный ",[483,3589,503],{},", общий для каждого запроса, идущего\nчерез этот экземпляр. Это ",[940,3592,3275],{}," переопределение на отдельный вызов.",[472,3595,3596,3597,3599,3600,3603],{},"На сервере это грабли, когда один экземпляр ",[483,3598,3586],{}," разделяется между\nпараллельными запросами (типовой паттерн: синглтон уровня модуля, переиспользуемый многими\nHTTP-обработчиками). Изменение параметров для одного запроса меняет их для ",[940,3601,3602],{},"всех\nзапросов в полёте"," на этом экземпляре.",[476,3605,3607],{"className":2088,"code":3606,"language":2090,"meta":481,"style":481},"import { ParamsFactory } from '@bitrix24\u002Fb24jssdk'\n\n\u002F\u002F ⚠️ АНТИ-ПАТТЕРН: общий $b24, параллельные обработчики\n\u002F\u002F Запрос A — неидемпотентное создание, которое хочет ОТКЛЮЧИТЬ повторы:\nawait $b24.setRestrictionManagerParams({\n  ...ParamsFactory.getDefault(),\n  retryOnNetworkError: false\n})\nawait $b24.actions.v2.call.make({\n  method: 'crm.deal.add',\n  params: { fields: { TITLE: 'Deal A' } }\n})\n\n\u002F\u002F Запрос B — выполняется параллельно на ТОМ ЖЕ $b24 — теперь ТОЖЕ видит\n\u002F\u002F retryOnNetworkError: false, хотя никогда об этом не просил. А если\n\u002F\u002F Запрос B первым вызовет setRestrictionManagerParams, создание из\n\u002F\u002F Запроса A незаметно выполнится с параметрами B. Побеждает последний\n\u002F\u002F записавший — глобально.\n",[483,3608,3609,3627,3631,3636,3641,3655,3669,3677,3683,3709,3723,3754,3760,3764,3769,3774,3779,3784],{"__ignoreMap":481},[486,3610,3611,3613,3615,3617,3619,3621,3623,3625],{"class":488,"line":489},[486,3612,2098],{"class":2097},[486,3614,2101],{"class":656},[486,3616,2673],{"class":492},[486,3618,2107],{"class":656},[486,3620,2110],{"class":2097},[486,3622,2113],{"class":656},[486,3624,2117],{"class":2116},[486,3626,2120],{"class":656},[486,3628,3629],{"class":488,"line":496},[486,3630,2126],{"emptyLinePlaceholder":2125},[486,3632,3633],{"class":488,"line":509},[486,3634,3635],{"class":829},"\u002F\u002F ⚠️ АНТИ-ПАТТЕРН: общий $b24, параллельные обработчики\n",[486,3637,3638],{"class":488,"line":535},[486,3639,3640],{"class":829},"\u002F\u002F Запрос A — неидемпотентное создание, которое хочет ОТКЛЮЧИТЬ повторы:\n",[486,3642,3643,3645,3647,3649,3651,3653],{"class":488,"line":541},[486,3644,2518],{"class":2097},[486,3646,2150],{"class":492},[486,3648,2153],{"class":656},[486,3650,2774],{"class":638},[486,3652,2777],{"class":492},[486,3654,1507],{"class":656},[486,3656,3657,3659,3661,3663,3665,3667],{"class":488,"line":547},[486,3658,1745],{"class":656},[486,3660,2786],{"class":492},[486,3662,2153],{"class":656},[486,3664,2791],{"class":638},[486,3666,2794],{"class":492},[486,3668,1639],{"class":656},[486,3670,3671,3673,3675],{"class":488,"line":553},[486,3672,886],{"class":1512},[486,3674,969],{"class":656},[486,3676,2806],{"class":2805},[486,3678,3679,3681],{"class":488,"line":559},[486,3680,2811],{"class":656},[486,3682,2814],{"class":492},[486,3684,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707],{"class":488,"line":583},[486,3686,2518],{"class":2097},[486,3688,2150],{"class":492},[486,3690,2153],{"class":656},[486,3692,91],{"class":492},[486,3694,2153],{"class":656},[486,3696,2846],{"class":492},[486,3698,2153],{"class":656},[486,3700,2851],{"class":492},[486,3702,2153],{"class":656},[486,3704,2856],{"class":638},[486,3706,2777],{"class":492},[486,3708,1507],{"class":656},[486,3710,3711,3713,3715,3717,3719,3721],{"class":488,"line":604},[486,3712,2865],{"class":1512},[486,3714,969],{"class":656},[486,3716,2113],{"class":656},[486,3718,2638],{"class":2116},[486,3720,2874],{"class":656},[486,3722,1639],{"class":656},[486,3724,3725,3727,3729,3731,3734,3736,3738,3741,3743,3745,3748,3750,3752],{"class":488,"line":795},[486,3726,2881],{"class":1512},[486,3728,969],{"class":656},[486,3730,2101],{"class":656},[486,3732,3733],{"class":1512}," fields",[486,3735,969],{"class":656},[486,3737,2101],{"class":656},[486,3739,3740],{"class":1512}," TITLE",[486,3742,969],{"class":656},[486,3744,2113],{"class":656},[486,3746,3747],{"class":2116},"Deal A",[486,3749,2874],{"class":656},[486,3751,2107],{"class":656},[486,3753,2925],{"class":656},[486,3755,3756,3758],{"class":488,"line":1619},[486,3757,2811],{"class":656},[486,3759,2814],{"class":492},[486,3761,3762],{"class":488,"line":1628},[486,3763,2126],{"emptyLinePlaceholder":2125},[486,3765,3766],{"class":488,"line":1642},[486,3767,3768],{"class":829},"\u002F\u002F Запрос B — выполняется параллельно на ТОМ ЖЕ $b24 — теперь ТОЖЕ видит\n",[486,3770,3771],{"class":488,"line":1657},[486,3772,3773],{"class":829},"\u002F\u002F retryOnNetworkError: false, хотя никогда об этом не просил. А если\n",[486,3775,3776],{"class":488,"line":1673},[486,3777,3778],{"class":829},"\u002F\u002F Запрос B первым вызовет setRestrictionManagerParams, создание из\n",[486,3780,3781],{"class":488,"line":1687},[486,3782,3783],{"class":829},"\u002F\u002F Запроса A незаметно выполнится с параметрами B. Побеждает последний\n",[486,3785,3786],{"class":488,"line":1692},[486,3787,3788],{"class":829},"\u002F\u002F записавший — глобально.\n",[472,3790,3791,3792,3795],{},"Поскольку мутация глобальна и нет изоляции на уровне запроса, два\nпараллельных потока ",[483,3793,3794],{},"createDeal"," могут затирать друг у друга конфигурацию\nrate-limit \u002F повторов.",[609,3797,3799],{"id":3798},"safe-patterns","Безопасные паттерны",[1011,3801,3802,4018,4024],{},[1014,3803,3804,3810,3811,3814,3815],{},[940,3805,3806,3807,3809],{},"Выделенный экземпляр ",[483,3808,3586],{}," для неидемпотентных \u002F нестандартных потоков."," Постройте\nотдельный экземпляр (или передайте ",[483,3812,3813],{},"restrictionParams"," при конструировании) для той ветки\nкода, которой нужно другое поведение, чтобы она никогда не разделяла состояние с общим\nпулом по умолчанию:",[476,3816,3818],{"className":2088,"code":3817,"language":2090,"meta":481,"style":481},"import { B24Hook, ParamsFactory, ApiVersion } from '@bitrix24\u002Fb24jssdk'\n\nconst $b24Strict = B24Hook.fromWebhookUrl(hookUrl, {\n  restrictionParams: {\n    ...ParamsFactory.getDefault(),\n    retryOnNetworkError: false\n  }\n})\n$b24Strict.getHttpClient(ApiVersion.v2).ajaxClient.defaults.timeout = 120_000\n\nawait $b24Strict.actions.v2.call.make({\n  method: 'crm.deal.add',\n  params: { fields: { TITLE: 'Deal A' } }\n})\n",[483,3819,3820,3846,3850,3870,3878,3892,3900,3904,3910,3940,3944,3970,3984,4012],{"__ignoreMap":481},[486,3821,3822,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844],{"class":488,"line":489},[486,3823,2098],{"class":2097},[486,3825,2101],{"class":656},[486,3827,2968],{"class":492},[486,3829,687],{"class":656},[486,3831,2673],{"class":492},[486,3833,687],{"class":656},[486,3835,2104],{"class":492},[486,3837,2107],{"class":656},[486,3839,2110],{"class":2097},[486,3841,2113],{"class":656},[486,3843,2117],{"class":2116},[486,3845,2120],{"class":656},[486,3847,3848],{"class":488,"line":496},[486,3849,2126],{"emptyLinePlaceholder":2125},[486,3851,3852,3854,3856,3858,3860,3862,3864,3866,3868],{"class":488,"line":509},[486,3853,2141],{"class":2140},[486,3855,3011],{"class":492},[486,3857,2147],{"class":656},[486,3859,2968],{"class":492},[486,3861,2153],{"class":656},[486,3863,3020],{"class":638},[486,3865,3023],{"class":492},[486,3867,687],{"class":656},[486,3869,633],{"class":656},[486,3871,3872,3874,3876],{"class":488,"line":535},[486,3873,3032],{"class":1512},[486,3875,969],{"class":656},[486,3877,633],{"class":656},[486,3879,3880,3882,3884,3886,3888,3890],{"class":488,"line":541},[486,3881,3041],{"class":656},[486,3883,2786],{"class":492},[486,3885,2153],{"class":656},[486,3887,2791],{"class":638},[486,3889,2794],{"class":492},[486,3891,1639],{"class":656},[486,3893,3894,3896,3898],{"class":488,"line":547},[486,3895,3056],{"class":1512},[486,3897,969],{"class":656},[486,3899,2806],{"class":2805},[486,3901,3902],{"class":488,"line":553},[486,3903,1798],{"class":656},[486,3905,3906,3908],{"class":488,"line":559},[486,3907,2811],{"class":656},[486,3909,2814],{"class":492},[486,3911,3912,3914,3916,3918,3920,3922,3924,3926,3928,3930,3932,3934,3936,3938],{"class":488,"line":583},[486,3913,3075],{"class":492},[486,3915,2153],{"class":656},[486,3917,2156],{"class":638},[486,3919,2159],{"class":492},[486,3921,2153],{"class":656},[486,3923,2164],{"class":492},[486,3925,2153],{"class":656},[486,3927,3090],{"class":492},[486,3929,2153],{"class":656},[486,3931,2736],{"class":492},[486,3933,2153],{"class":656},[486,3935,2741],{"class":492},[486,3937,2147],{"class":656},[486,3939,3103],{"class":1055},[486,3941,3942],{"class":488,"line":604},[486,3943,2126],{"emptyLinePlaceholder":2125},[486,3945,3946,3948,3950,3952,3954,3956,3958,3960,3962,3964,3966,3968],{"class":488,"line":795},[486,3947,2518],{"class":2097},[486,3949,3114],{"class":492},[486,3951,2153],{"class":656},[486,3953,91],{"class":492},[486,3955,2153],{"class":656},[486,3957,2846],{"class":492},[486,3959,2153],{"class":656},[486,3961,2851],{"class":492},[486,3963,2153],{"class":656},[486,3965,2856],{"class":638},[486,3967,2777],{"class":492},[486,3969,1507],{"class":656},[486,3971,3972,3974,3976,3978,3980,3982],{"class":488,"line":1619},[486,3973,2865],{"class":1512},[486,3975,969],{"class":656},[486,3977,2113],{"class":656},[486,3979,2638],{"class":2116},[486,3981,2874],{"class":656},[486,3983,1639],{"class":656},[486,3985,3986,3988,3990,3992,3994,3996,3998,4000,4002,4004,4006,4008,4010],{"class":488,"line":1628},[486,3987,2881],{"class":1512},[486,3989,969],{"class":656},[486,3991,2101],{"class":656},[486,3993,3733],{"class":1512},[486,3995,969],{"class":656},[486,3997,2101],{"class":656},[486,3999,3740],{"class":1512},[486,4001,969],{"class":656},[486,4003,2113],{"class":656},[486,4005,3747],{"class":2116},[486,4007,2874],{"class":656},[486,4009,2107],{"class":656},[486,4011,2925],{"class":656},[486,4013,4014,4016],{"class":488,"line":1642},[486,4015,2811],{"class":656},[486,4017,2814],{"class":492},[1014,4019,4020,4023],{},[940,4021,4022],{},"Задавайте параметры ограничений один раз при старте",", а не на каждый запрос. Считайте\nих конфигурацией экземпляра, а не переключателем на отдельный вызов.",[1014,4025,4026,4029],{},[940,4027,4028],{},"Идемпотентность на уровне приложения."," Для неидемпотентных созданий, которые должны\nпережить повтор независимо от конфигурации ограничений, добавьте собственную защиту\nидемпотентности (ключ дедупликации \u002F уникальное бизнес-поле, проверяемое перед вставкой),\nчтобы дублирующий вызов был no-op, даже если повтор проскочит.",[467,4031,4033],{"id":4032},"usage-recommendations","Рекомендации по использованию",[472,4035,4036],{},"Конфигурация для разных сценариев:",[476,4038,4040],{"className":2088,"code":4039,"language":2090,"meta":481,"style":481},"import { ParamsFactory } from '@bitrix24\u002Fb24jssdk'\n\n\u002F\u002F const $b24 = ...\n\n\u002F\u002F Параметры по умолчанию\n$b24.setRestrictionManagerParams( ParamsFactory.getDefault() )\n\n\u002F\u002F Пакетная обработка\n$b24.setRestrictionManagerParams( ParamsFactory.getBatchProcessing() )\n\n\u002F\u002F Real-time\n$b24.setRestrictionManagerParams( ParamsFactory.getRealtime() )\n\n\u002F\u002F По тарифному плану\n$b24.setRestrictionManagerParams( ParamsFactory.fromTariffPlan('enterprise') )\n\n\u002F\u002F Динамическое изменение конфигурации\n$b24.setRestrictionManagerParams({\n  ...ParamsFactory.getDefault(),\n  rateLimit: {\n    burstLimit: 30,  \u002F\u002F Временное снижение при проблемах\n    drainRate: 1,\n    adaptiveEnabled: true\n  }\n})\n",[483,4041,4042,4060,4064,4068,4072,4077,4095,4099,4104,4121,4125,4130,4147,4151,4156,4183,4187,4192,4204,4218,4226,4239,4249,4257,4261],{"__ignoreMap":481},[486,4043,4044,4046,4048,4050,4052,4054,4056,4058],{"class":488,"line":489},[486,4045,2098],{"class":2097},[486,4047,2101],{"class":656},[486,4049,2673],{"class":492},[486,4051,2107],{"class":656},[486,4053,2110],{"class":2097},[486,4055,2113],{"class":656},[486,4057,2117],{"class":2116},[486,4059,2120],{"class":656},[486,4061,4062],{"class":488,"line":496},[486,4063,2126],{"emptyLinePlaceholder":2125},[486,4065,4066],{"class":488,"line":509},[486,4067,2131],{"class":829},[486,4069,4070],{"class":488,"line":535},[486,4071,2126],{"emptyLinePlaceholder":2125},[486,4073,4074],{"class":488,"line":541},[486,4075,4076],{"class":829},"\u002F\u002F Параметры по умолчанию\n",[486,4078,4079,4081,4083,4085,4088,4090,4092],{"class":488,"line":547},[486,4080,3586],{"class":492},[486,4082,2153],{"class":656},[486,4084,2774],{"class":638},[486,4086,4087],{"class":492},"( ParamsFactory",[486,4089,2153],{"class":656},[486,4091,2791],{"class":638},[486,4093,4094],{"class":492},"() )\n",[486,4096,4097],{"class":488,"line":553},[486,4098,2126],{"emptyLinePlaceholder":2125},[486,4100,4101],{"class":488,"line":559},[486,4102,4103],{"class":829},"\u002F\u002F Пакетная обработка\n",[486,4105,4106,4108,4110,4112,4114,4116,4119],{"class":488,"line":583},[486,4107,3586],{"class":492},[486,4109,2153],{"class":656},[486,4111,2774],{"class":638},[486,4113,4087],{"class":492},[486,4115,2153],{"class":656},[486,4117,4118],{"class":638},"getBatchProcessing",[486,4120,4094],{"class":492},[486,4122,4123],{"class":488,"line":604},[486,4124,2126],{"emptyLinePlaceholder":2125},[486,4126,4127],{"class":488,"line":795},[486,4128,4129],{"class":829},"\u002F\u002F Real-time\n",[486,4131,4132,4134,4136,4138,4140,4142,4145],{"class":488,"line":1619},[486,4133,3586],{"class":492},[486,4135,2153],{"class":656},[486,4137,2774],{"class":638},[486,4139,4087],{"class":492},[486,4141,2153],{"class":656},[486,4143,4144],{"class":638},"getRealtime",[486,4146,4094],{"class":492},[486,4148,4149],{"class":488,"line":1628},[486,4150,2126],{"emptyLinePlaceholder":2125},[486,4152,4153],{"class":488,"line":1642},[486,4154,4155],{"class":829},"\u002F\u002F По тарифному плану\n",[486,4157,4158,4160,4162,4164,4166,4168,4171,4173,4175,4178,4180],{"class":488,"line":1657},[486,4159,3586],{"class":492},[486,4161,2153],{"class":656},[486,4163,2774],{"class":638},[486,4165,4087],{"class":492},[486,4167,2153],{"class":656},[486,4169,4170],{"class":638},"fromTariffPlan",[486,4172,2777],{"class":492},[486,4174,2874],{"class":656},[486,4176,4177],{"class":2116},"enterprise",[486,4179,2874],{"class":656},[486,4181,4182],{"class":492},") )\n",[486,4184,4185],{"class":488,"line":1673},[486,4186,2126],{"emptyLinePlaceholder":2125},[486,4188,4189],{"class":488,"line":1687},[486,4190,4191],{"class":829},"\u002F\u002F Динамическое изменение конфигурации\n",[486,4193,4194,4196,4198,4200,4202],{"class":488,"line":1692},[486,4195,3586],{"class":492},[486,4197,2153],{"class":656},[486,4199,2774],{"class":638},[486,4201,2777],{"class":492},[486,4203,1507],{"class":656},[486,4205,4206,4208,4210,4212,4214,4216],{"class":488,"line":1704},[486,4207,1745],{"class":656},[486,4209,2786],{"class":492},[486,4211,2153],{"class":656},[486,4213,2791],{"class":638},[486,4215,2794],{"class":492},[486,4217,1639],{"class":656},[486,4219,4220,4222,4224],{"class":488,"line":1716},[486,4221,821],{"class":1512},[486,4223,969],{"class":656},[486,4225,633],{"class":656},[486,4227,4228,4230,4232,4234,4236],{"class":488,"line":1725},[486,4229,1521],{"class":1512},[486,4231,969],{"class":656},[486,4233,1840],{"class":1055},[486,4235,687],{"class":656},[486,4237,4238],{"class":829},"  \u002F\u002F Временное снижение при проблемах\n",[486,4240,4241,4243,4245,4247],{"class":488,"line":2424},[486,4242,1536],{"class":1512},[486,4244,969],{"class":656},[486,4246,1851],{"class":1055},[486,4248,1639],{"class":656},[486,4250,4251,4253,4255],{"class":488,"line":2429},[486,4252,1551],{"class":1512},[486,4254,969],{"class":656},[486,4256,1556],{"class":2805},[486,4258,4259],{"class":488,"line":2435},[486,4260,1798],{"class":656},[486,4262,4263,4265],{"class":488,"line":2445},[486,4264,2811],{"class":656},[486,4266,2814],{"class":492},[4268,4269,4270],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":481,"searchDepth":496,"depth":496,"links":4272},[4273,4276,4282,4288,4292,4298,4299,4303],{"id":469,"depth":496,"text":470,"children":4274},[4275],{"id":611,"depth":509,"text":612},{"id":931,"depth":496,"text":932,"children":4277},[4278,4279,4280,4281],{"id":935,"depth":509,"text":936},{"id":1070,"depth":509,"text":1071},{"id":1202,"depth":509,"text":1203},{"id":1345,"depth":509,"text":1346},{"id":1492,"depth":496,"text":1493,"children":4283},[4284,4285,4286,4287],{"id":1496,"depth":509,"text":1497},{"id":1730,"depth":509,"text":1731},{"id":1805,"depth":509,"text":1806},{"id":1989,"depth":509,"text":1990},{"id":2080,"depth":496,"text":2081,"children":4289},[4290,4291],{"id":2084,"depth":509,"text":2085},{"id":2472,"depth":509,"text":2473},{"id":2562,"depth":496,"text":2563,"children":4293},[4294,4295,4296,4297],{"id":2591,"depth":509,"text":2592},{"id":2651,"depth":509,"text":2652},{"id":2947,"depth":509,"text":2948},{"id":3166,"depth":509,"text":3167},{"id":3248,"depth":496,"text":3249},{"id":3570,"depth":496,"text":4300,"children":4301},"Глобальная область setRestrictionManagerParams в пределах экземпляра",[4302],{"id":3798,"depth":509,"text":3799},{"id":4032,"depth":496,"text":4033},"md",[4306,4310,4312],{"label":4307,"iconName":4308,"to":4309},"Limiters","GitHubIcon","https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Ftree\u002Fmain\u002Fpackages\u002Fjssdk\u002Fsrc\u002Fcore\u002Fhttp\u002Flimiters",{"label":503,"iconName":4308,"to":4311},"https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Fblob\u002Fmain\u002Fpackages\u002Fjssdk\u002Fsrc\u002Fcore\u002Fhttp\u002Flimiters\u002Fmanager.ts",{"label":4313,"iconName":4308,"to":4314},"Skill — b24jssdk-core","https:\u002F\u002Fgithub.com\u002Fbitrix24\u002Fb24jssdk\u002Fblob\u002Fmain\u002Fskills\u002Fb24jssdk-core\u002FSKILL.md",{},{"title":288},{"title":461,"description":292},"hPqA4kz-__l-BPJOA_8_ozz4OwuVwAyxTcO6FG3qua0",{"data":4320,"body":4321},{},{"type":4322,"children":4323},"root",[4324],{"type":4325,"tag":472,"props":4326,"children":4327},"element",{},[4328],{"type":4329,"value":292},"text",1783080220981]