[{"data":1,"prerenderedAt":612},["ShallowReactive",2],{"navigation_docs":3,"-modules-problems-deffunctions":238,"-modules-problems-deffunctions-surround":609},[4,45,60],{"title":5,"description":6,"icon":7,"path":8,"stem":9,"children":10},"Методология",null,"ruler","\u002Fmethodology","1.methodology",[11,15,20,25,30,35,40],{"title":12,"path":8,"stem":13,"description":14},"bxshef: методология и проверка навыков","1.methodology\u002Findex","Как писать навыки ИИ-агентов для Битрикса и как проверять, что им можно верить",{"title":16,"path":17,"stem":18,"description":19},"Стандарт навыка","\u002Fmethodology\u002Fstandard","1.methodology\u002F1.standard","11 правил, каждое из провала на стенде",{"title":21,"path":22,"stem":23,"description":24},"Методология проверки","\u002Fmethodology\u002Fmethod","1.methodology\u002F2.method","lint → eval → стенд; что измерено",{"title":26,"path":27,"stem":28,"description":29},"bxshef — CLI","\u002Fmethodology\u002Fbxshef","1.methodology\u002F3.bxshef","lint, eval, feedback",{"title":31,"path":32,"stem":33,"description":34},"GitHub Action","\u002Fmethodology\u002Faction","1.methodology\u002F4.action","тот же lint + eval в любом репозитории навыков",{"title":36,"path":37,"stem":38,"description":39},"Заготовка репозитория","\u002Fmethodology\u002Ftemplate","1.methodology\u002F5.template","с чего начать автору модуля",{"title":41,"path":42,"stem":43,"description":44},"Приёмник отзывов","\u002Fmethodology\u002Ffeedback","1.methodology\u002F6.feedback","куда уходят отзывы ИИ-агентов",{"title":46,"description":6,"icon":47,"path":48,"stem":49,"children":50},"Навыки","sparkles","\u002Fskills","2.skills",[51,55],{"title":52,"path":48,"stem":53,"description":54},"Навыки shef.*","2.skills\u002Findex","npx skills add bx-shef\u002Fskills",{"title":56,"path":57,"stem":58,"description":59},"shef-feedback","\u002Fskills\u002Fshef-feedback","2.skills\u002F1.shef-feedback","Отправить отзыв о навыке shef-* или навыке команды. Брать ВСЕГДА, когда просят оставить или отправить отзыв о навыке — даже если сам навык в диалоге не виден, —",{"title":61,"description":6,"icon":62,"path":63,"stem":64,"children":65},"Модули shef.*","package","\u002Fmodules","3.modules",[66,69,131,179],{"title":61,"path":63,"stem":67,"description":68},"3.modules\u002Findex","Что за чем ставить",{"title":70,"description":6,"path":71,"stem":72,"children":73},"shef.options","\u002Fmodules\u002Foptions","3.modules\u002F1.options\u002Findex",[74,76,81,86,91,96,101,106,110,114,119,123,127],{"title":70,"path":71,"stem":72,"description":75},"фундамент: настройки, трейты, компоненты",{"title":77,"path":78,"stem":79,"description":80},"[`\\Shef\\Options\\Installator`] Installer","\u002Fmodules\u002Foptions\u002Finstaller","3.modules\u002F1.options\u002F1.installer","Для облегчения установок.",{"title":82,"path":83,"stem":84,"description":85},"Сборка, CI и релиз","\u002Fmodules\u002Foptions\u002Fbuild-and-install","3.modules\u002F1.options\u002F10.build-and-install","Раскладка репозитория — в module-structure.md, процесс —\nв CONTRIBUTING.md, установка глазами пользователя —\nв README.md.",{"title":87,"path":88,"stem":89,"description":90},"Раскладка репозитория","\u002Fmodules\u002Foptions\u002Fmodule-structure","3.modules\u002F1.options\u002F11.module-structure","Файл про устройство репозитория. Опорные точки модуля — в CLAUDE.md,\nпроцесс — в CONTRIBUTING.md, сборка — в\nbuild-and-install.md.",{"title":92,"path":93,"stem":94,"description":95},"Проверка на портале","\u002Fmodules\u002Foptions\u002Fportal-check","3.modules\u002F1.options\u002F12.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, кеш,\nраскладка файлов, поведение при обновлении. Проверять это приходится руками —\nи лучше по списку, потому что забытый шаг находит не разработчик, а клиент.",{"title":97,"path":98,"stem":99,"description":100},"[`\\Shef\\Options\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Foptions\u002Foptions","3.modules\u002F1.options\u002F2.options","Поддерживает следующие типы:",{"title":102,"path":103,"stem":104,"description":105},"Работа с пользователями","\u002Fmodules\u002Foptions\u002Fsecurity","3.modules\u002F1.options\u002F3.security","",{"title":107,"path":108,"stem":109,"description":105},"[`\\Shef\\Options\\Main\\Utils`] Утилиты","\u002Fmodules\u002Foptions\u002Futils","3.modules\u002F1.options\u002F4.utils",{"title":111,"path":112,"stem":113,"description":105},"[`\\Shef\\Options\\Components`] Работа с компонентами","\u002Fmodules\u002Foptions\u002Fcomponents","3.modules\u002F1.options\u002F5.components",{"title":115,"path":116,"stem":117,"description":118},"[`\\Shef\\Options\\Options`] Паттерны","\u002Fmodules\u002Foptions\u002Fpattern","3.modules\u002F1.options\u002F6.pattern","Запускаемые примеры: singleton.php,\nconfig.php, smartstd.php —\nкак их гонять, написано в examples\u002FREADME.md.",{"title":120,"path":121,"stem":122,"description":105},"[`\\Shef\\Options\\Tests`] Тестирование","\u002Fmodules\u002Foptions\u002Ftests","3.modules\u002F1.options\u002F7.tests",{"title":124,"path":125,"stem":126,"description":105},"[`\\Shef\\Options\\TraitList`] Набор трейтов","\u002Fmodules\u002Foptions\u002Ftraitlist","3.modules\u002F1.options\u002F8.traitlist",{"title":128,"path":129,"stem":130,"description":105},"Правила для ИИ-агентов в этом репозитории","\u002Fmodules\u002Foptions\u002Fagent-rules","3.modules\u002F1.options\u002F9.agent-rules",{"title":132,"description":6,"path":133,"stem":134,"children":135},"shef.problems","\u002Fmodules\u002Fproblems","3.modules\u002F2.problems\u002Findex",[136,138,143,147,152,157,161,166,169,172,175],{"title":132,"path":133,"stem":134,"description":137},"логи, журнал событий, учёт проблем",{"title":139,"path":140,"stem":141,"description":142},"[`\\Shef\\Problems\\Integration`] События и меню","\u002Fmodules\u002Fproblems\u002Fevents","3.modules\u002F2.problems\u002F1.events","Что модуль регистрирует в ядре при установке. Список — в .settings.php, ключ\ninstallEvents; что каждый обработчик существует, сверяет\ntests\u002Fsettings_test.php.",{"title":144,"path":145,"stem":146,"description":105},"Безопасность логов","\u002Fmodules\u002Fproblems\u002Fsecurity","3.modules\u002F2.problems\u002F10.security",{"title":148,"path":149,"stem":150,"description":151},"Быстрая отладка: `_pr`, `_log`, `_log1`","\u002Fmodules\u002Fproblems\u002Fdeffunctions","3.modules\u002F2.problems\u002F2.deffunctions","Функции объявляет def-functions.php, подключается он из include.php.",{"title":153,"path":154,"stem":155,"description":156},"Уровни логирования","\u002Fmodules\u002Fproblems\u002Floglevel","3.modules\u002F2.problems\u002F3.loglevel","Уровни — стандарт PSR-3, в Monolog это \\Monolog\\Level. Ниже — когда какой брать.",{"title":158,"path":159,"stem":160,"description":105},"[`\\Shef\\Problems\\Integration\\Monolog`] Monolog","\u002Fmodules\u002Fproblems\u002Fmonolog","3.modules\u002F2.problems\u002F4.monolog",{"title":162,"path":163,"stem":164,"description":165},"Ротация логов","\u002Fmodules\u002Fproblems\u002Flogrotate","3.modules\u002F2.problems\u002F5.logrotate","Логи модуля лежат в каталоге логов — по умолчанию на уровень выше корня сайта,\nдля BitrixVM \u002Fhome\u002Fbitrix\u002Fsh_log\u002F*.log, — и сами не чистятся. Ротацию делает\nlogrotate — системная утилита, а не Monolog: Monolog тоже умеет\n(RotatingFileHandler), но тогда за файлами следит каждый PHP-процесс, а не\nодна служба.",{"title":128,"path":167,"stem":168,"description":105},"\u002Fmodules\u002Fproblems\u002Fagent-rules","3.modules\u002F2.problems\u002F6.agent-rules",{"title":82,"path":170,"stem":171,"description":85},"\u002Fmodules\u002Fproblems\u002Fbuild-and-install","3.modules\u002F2.problems\u002F7.build-and-install",{"title":87,"path":173,"stem":174,"description":90},"\u002Fmodules\u002Fproblems\u002Fmodule-structure","3.modules\u002F2.problems\u002F8.module-structure",{"title":92,"path":176,"stem":177,"description":178},"\u002Fmodules\u002Fproblems\u002Fportal-check","3.modules\u002F2.problems\u002F9.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, меню,\nраскладка файлов, журнал событий, поведение при обновлении. Проверять это\nприходится руками — и лучше по списку, потому что забытый шаг находит не\nразработчик, а клиент.",{"title":180,"description":6,"path":181,"stem":182,"children":183},"shef.insync","\u002Fmodules\u002Finsync","3.modules\u002F3.insync\u002Findex",[184,186,191,194,198,203,208,213,218,222,227,232,235],{"title":180,"path":181,"stem":182,"description":185},"агенты, импорт, API-клиенты, модели",{"title":187,"path":188,"stem":189,"description":190},"[`\\Shef\\InSync\\Agents`] Агенты","\u002Fmodules\u002Finsync\u002Fagents","3.modules\u002F3.insync\u002F1.agents","Агент импорта — наследник \\Shef\\InSync\\Agents\\AAgent. Описание агента для\nb_agent — \\Shef\\InSync\\Agents\\Entity, установку и управление берёт на себя\n\\Shef\\InSync\\Agents\\Manager.",{"title":87,"path":192,"stem":193,"description":90},"\u002Fmodules\u002Finsync\u002Fmodule-structure","3.modules\u002F3.insync\u002F10.module-structure",{"title":92,"path":195,"stem":196,"description":197},"\u002Fmodules\u002Finsync\u002Fportal-check","3.modules\u002F3.insync\u002F11.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, левое\nменю, раскладка компонентов, агенты, таблица импорта, поведение при\nобновлении. Проверять это приходится руками — и лучше по списку, потому что\nзабытый шаг находит не разработчик, а клиент.",{"title":199,"path":200,"stem":201,"description":202},"Безопасность","\u002Fmodules\u002Finsync\u002Fsecurity","3.modules\u002F3.insync\u002F12.security","Модуль даёт другим модулям заготовки для синхронизаций, и самые опасные места\nу него общие с ними: кто может запускать агенты и импорт, что ложится в каталоги\nимпорта, что уходит в SQL и в лог. Ниже — что держит модуль и что остаётся\nпроекту.",{"title":204,"path":205,"stem":206,"description":207},"[`\\Shef\\InSync\\Sync`] Импорт","\u002Fmodules\u002Finsync\u002Fimport","3.modules\u002F3.insync\u002F2.import","Импорт идёт в два шага через таблицу импорта \\Shef\\InSync\\Sync\\Model\\SyncTable\n(shef_insync_model):",{"title":209,"path":210,"stem":211,"description":212},"[`\\Shef\\InSync\\Api`] API","\u002Fmodules\u002Finsync\u002Fapi","3.modules\u002F3.insync\u002F3.api","Обращение к внешнему API по HTTP — наследник \\Shef\\InSync\\Api\\AConnector.",{"title":214,"path":215,"stem":216,"description":217},"[`\\Shef\\InSync\\TraitList\\Xml`] Парсинг XML","\u002Fmodules\u002Finsync\u002Fxml","3.modules\u002F3.insync\u002F4.xml","Разбор XML сделан через SbWereWolf\u002Fxml-navigator\n(статья на Хабре): XMLReader идёт по\nдокументу потоком, а каждый элемент с нужным тегом HierarchyComposer\nпревращает в массив — n имя, v значение, a атрибуты, s вложенные\nэлементы.",{"title":219,"path":220,"stem":221,"description":105},"Компоненты","\u002Fmodules\u002Finsync\u002Fcomponents","3.modules\u002F3.insync\u002F5.components",{"title":223,"path":224,"stem":225,"description":226},"Страницы","\u002Fmodules\u002Finsync\u002Fpage","3.modules\u002F3.insync\u002F6.page","Страницы модуля — в левом меню, штатным разделом intranet\n(Bitrix\\Intranet\\CustomSection): раздел «SH Импорт», код shinsync.\nВерхней панели и shef.uiclear больше нет.",{"title":228,"path":229,"stem":230,"description":231},"[`\\Shef\\InSync\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Finsync\u002Foptions","3.modules\u002F3.insync\u002F7.options","Опции для страницы настроек модуля импорта (на ShOptionsConfig из\nshef.options): добавьте их во вкладку своего options_conf.php.",{"title":128,"path":233,"stem":234,"description":105},"\u002Fmodules\u002Finsync\u002Fagent-rules","3.modules\u002F3.insync\u002F8.agent-rules",{"title":82,"path":236,"stem":237,"description":85},"\u002Fmodules\u002Finsync\u002Fbuild-and-install","3.modules\u002F3.insync\u002F9.build-and-install",{"id":239,"title":148,"body":240,"description":151,"extension":604,"meta":605,"navigation":460,"path":149,"rawbody":606,"seo":607,"stem":150,"__hash__":608},"docs\u002F3.modules\u002F2.problems\u002F2.deffunctions.md",{"type":241,"value":242,"toc":600},"minimark",[243,256,310,313,318,328,368,385,389,400,440,562,572,584,596],[244,245,246,247,251,252,255],"p",{},"Функции объявляет ",[248,249,250],"code",{},"def-functions.php",", подключается он из ",[248,253,254],{},"include.php",".",[257,258,259,272],"table",{},[260,261,262],"thead",{},[263,264,265,269],"tr",{},[266,267,268],"th",{},"функция",[266,270,271],{},"что делает",[273,274,275,286,300],"tbody",{},[263,276,277,283],{},[278,279,280],"td",{},[248,281,282],{},"_pr($o, bool $show = false)",[278,284,285],{},"вывод на экран, по умолчанию только администратору; всё экранируется",[263,287,288,293],{},[278,289,290],{},[248,291,292],{},"_log(array $value = [], string $fileName = 'log-custom')",[278,294,295,296,299],{},"запись в ",[248,297,298],{},"\u003Cкаталог логов>\u002F\u003CfileName>.log",", дописыванием",[263,301,302,307],{},[278,303,304],{},[248,305,306],{},"_log1(array $value = [], string $fileName = 'log1-custom')",[278,308,309],{},"то же, но первый вызов за запрос файл перезаписывает",[244,311,312],{},"К каждой записи добавляется трассировка — откуда позвали.",[314,315,317],"h2",{"id":316},"чьи-функции-победят","Чьи функции победят",[244,319,320,321,323,324,327],{},"Те же три функции объявляет ",[248,322,70],{},", и каждая закрыта\n",[248,325,326],{},"function_exists",": побеждает тот, кто объявил первым.",[329,330,331,343,363],"ol",{},[332,333,334,338,339,342],"li",{},[335,336,337],"strong",{},"Версия проекта"," — ",[248,340,341],{},"bitrix\u002Fphp_interface\u002Fdef-functions.php",", если есть:\nеё подключают оба модуля до своих.",[332,344,345,338,348,350,351,353,354,357,358,360,361,255],{},[335,346,347],{},"Этот модуль",[248,349,254],{}," подключает ",[248,352,250],{}," до\n",[248,355,356],{},"autoload.php",", а ",[248,359,356],{}," уже подключает ",[248,362,70],{},[332,364,365,367],{},[335,366,70],{}," — если его подключили в запросе раньше этого модуля.",[244,369,370,371,374,375,378,379,381,382,255],{},"Сигнатура ",[248,372,373],{},"_log()"," у обоих модулей одна — массив и имя файла, — так что\nвызов работает с любой. Разница в каталоге: этот модуль пишет в\nкаталог логов вне корня сайта (",[248,376,377],{},"Constants::getLogDir()","), ",[248,380,70],{}," — в\n",[248,383,384],{},"\u002Flocal\u002Flog",[314,386,388],{"id":387},"исключение-в-ошибку-ядра","Исключение в ошибку ядра",[390,391,393,399],"h1",{"id":392},"shefproblemsthrowable-обработка-throwable",[394,395,396],"span",{},[248,397,398],{},"\\Shef\\Problems\\Throwable"," Обработка \\Throwable",[257,401,402,411],{},[260,403,404],{},[263,405,406,409],{},[266,407,408],{},"класс",[266,410,271],{},[273,412,413,428],{},[263,414,415,418],{},[278,416,417],{},"Manager::buildError",[278,419,420,423,424,427],{},[248,421,422],{},"\\Throwable"," → ",[248,425,426],{},"\\Bitrix\\Main\\Error",": текст, файл, строка и по желанию трассировка",[263,429,430,433],{},[278,431,432],{},"Manager::traceToString",[278,434,435,436,439],{},"трассировка строкой, как ",[248,437,438],{},"getTraceAsString()",", но без аргументов вызовов — в них бывают пароли",[441,442,446],"pre",{"className":443,"code":444,"language":445,"meta":105,"style":105},"language-php shiki shiki-themes material-theme-lighter github-light github-dark","$result = new \\Bitrix\\Main\\Result();\n\ntry\n{\n    \u002F\u002F ...\n}\ncatch(\\Throwable $throwable)\n{\n    $result->addError(\n        \\Shef\\Problems\\Throwable\\Manager::buildError(\n            throwable: $throwable,\n            isUseTrace: false,\n            code: 'codeError',\n            customData: [\n                'key' => 'value'\n            ]\n        )\n    );\n}\n","php",[248,447,448,455,462,468,474,480,486,492,497,503,509,515,521,527,533,539,545,551,557],{"__ignoreMap":105},[394,449,452],{"class":450,"line":451},"line",1,[394,453,454],{},"$result = new \\Bitrix\\Main\\Result();\n",[394,456,458],{"class":450,"line":457},2,[394,459,461],{"emptyLinePlaceholder":460},true,"\n",[394,463,465],{"class":450,"line":464},3,[394,466,467],{},"try\n",[394,469,471],{"class":450,"line":470},4,[394,472,473],{},"{\n",[394,475,477],{"class":450,"line":476},5,[394,478,479],{},"    \u002F\u002F ...\n",[394,481,483],{"class":450,"line":482},6,[394,484,485],{},"}\n",[394,487,489],{"class":450,"line":488},7,[394,490,491],{},"catch(\\Throwable $throwable)\n",[394,493,495],{"class":450,"line":494},8,[394,496,473],{},[394,498,500],{"class":450,"line":499},9,[394,501,502],{},"    $result->addError(\n",[394,504,506],{"class":450,"line":505},10,[394,507,508],{},"        \\Shef\\Problems\\Throwable\\Manager::buildError(\n",[394,510,512],{"class":450,"line":511},11,[394,513,514],{},"            throwable: $throwable,\n",[394,516,518],{"class":450,"line":517},12,[394,519,520],{},"            isUseTrace: false,\n",[394,522,524],{"class":450,"line":523},13,[394,525,526],{},"            code: 'codeError',\n",[394,528,530],{"class":450,"line":529},14,[394,531,532],{},"            customData: [\n",[394,534,536],{"class":450,"line":535},15,[394,537,538],{},"                'key' => 'value'\n",[394,540,542],{"class":450,"line":541},16,[394,543,544],{},"            ]\n",[394,546,548],{"class":450,"line":547},17,[394,549,550],{},"        )\n",[394,552,554],{"class":450,"line":553},18,[394,555,556],{},"    );\n",[394,558,560],{"class":450,"line":559},19,[394,561,485],{},[244,563,564,565,255],{},"Запускаемый пример — ",[566,567,571],"a",{"href":568,"rel":569},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fexamples\u002Fthrowable.php",[570],"nofollow","examples\u002Fthrowable.php",[244,573,574,577,578,577,581],{},[566,575,576],{"href":140},"← События"," | ",[566,579,580],{"href":133},"↑ Содержание",[566,582,583],{"href":154},"Уровни логирования →",[585,586,587],"note",{},[244,588,589,590,595],{},"Источник: ",[566,591,594],{"href":592,"rel":593},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F2_deffunctions.md",[570],"problems\u002Fdocs\u002F2_deffunctions.md"," — правки туда, сайт пересобирается сам.",[597,598,599],"style",{},"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);}",{"title":105,"searchDepth":464,"depth":464,"links":601},[602,603],{"id":316,"depth":457,"text":317},{"id":387,"depth":457,"text":388},"md",{},"---\ntitle: \"Быстрая отладка: `_pr`, `_log`, `_log1`\"\n---\n\nФункции объявляет `def-functions.php`, подключается он из `include.php`.\n\n| функция | что делает |\n|---|---|\n| `_pr($o, bool $show = false)` | вывод на экран, по умолчанию только администратору; всё экранируется |\n| `_log(array $value = [], string $fileName = 'log-custom')` | запись в `\u003Cкаталог логов>\u002F\u003CfileName>.log`, дописыванием |\n| `_log1(array $value = [], string $fileName = 'log1-custom')` | то же, но первый вызов за запрос файл перезаписывает |\n\nК каждой записи добавляется трассировка — откуда позвали.\n\n## Чьи функции победят\n\nТе же три функции объявляет `shef.options`, и каждая закрыта\n`function_exists`: побеждает тот, кто объявил первым.\n\n1. **Версия проекта** — `bitrix\u002Fphp_interface\u002Fdef-functions.php`, если есть:\n   её подключают оба модуля до своих.\n2. **Этот модуль** — `include.php` подключает `def-functions.php` до\n   `autoload.php`, а `autoload.php` уже подключает `shef.options`.\n3. **shef.options** — если его подключили в запросе раньше этого модуля.\n\nСигнатура `_log()` у обоих модулей одна — массив и имя файла, — так что\nвызов работает с любой. Разница в каталоге: этот модуль пишет в\nкаталог логов вне корня сайта (`Constants::getLogDir()`), `shef.options` — в\n`\u002Flocal\u002Flog`.\n\n## Исключение в ошибку ядра\n\n# [`\\Shef\\Problems\\Throwable`] Обработка \\Throwable\n\n| класс | что делает |\n|---|---|\n| Manager::buildError | `\\Throwable` → `\\Bitrix\\Main\\Error`: текст, файл, строка и по желанию трассировка |\n| Manager::traceToString | трассировка строкой, как `getTraceAsString()`, но без аргументов вызовов — в них бывают пароли |\n\n```php\n$result = new \\Bitrix\\Main\\Result();\n\ntry\n{\n\t\u002F\u002F ...\n}\ncatch(\\Throwable $throwable)\n{\n\t$result->addError(\n\t\t\\Shef\\Problems\\Throwable\\Manager::buildError(\n\t\t\tthrowable: $throwable,\n\t\t\tisUseTrace: false,\n\t\t\tcode: 'codeError',\n\t\t\tcustomData: [\n\t\t\t\t'key' => 'value'\n\t\t\t]\n\t\t)\n\t);\n}\n```\n\nЗапускаемый пример — [examples\u002Fthrowable.php](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fexamples\u002Fthrowable.php).\n\n[← События](\u002Fmodules\u002Fproblems\u002Fevents) | [↑ Содержание](\u002Fmodules\u002Fproblems) | [Уровни логирования →](\u002Fmodules\u002Fproblems\u002Floglevel)\n\n::note\nИсточник: [problems\u002Fdocs\u002F2_deffunctions.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F2_deffunctions.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":148,"description":151},"aty9a9R6Or-dbW3eEk7zcUA6p6VZWETFNdDaMfvcyME",[610,611],{"title":144,"path":145,"stem":146,"description":105,"children":-1},{"title":153,"path":154,"stem":155,"description":156,"children":-1},1790857269803]