[{"data":1,"prerenderedAt":887},["ShallowReactive",2],{"navigation_docs":3,"-modules-problems":238,"-modules-problems-surround":884},[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":132,"body":240,"description":137,"extension":879,"meta":880,"navigation":624,"path":133,"rawbody":881,"seo":882,"stem":134,"__hash__":883},"docs\u002F3.modules\u002F2.problems\u002Findex.md",{"type":241,"value":242,"toc":873},"minimark",[243,255,263,268,334,338,347,352,376,395,479,483,503,507,510,524,536,540,601,605,608,715,722,731,742,748,752,755,816,820,846,850,857,869],[244,245,246,247,254],"p",{},"Модуль Битрикс24 «коробки» и БУС для логирования и учёта проблем. Подключает\n",[248,249,253],"a",{"href":250,"rel":251},"https:\u002F\u002Fgithub.com\u002FSeldaek\u002Fmonolog",[252],"nofollow","Monolog"," и даёт готовые логгеры: в файл, в\nжурнал событий Битрикса, на экран администратору. Проблемы разложены по типам —\nобщие, синхронизация, товары, продажи, — и у каждой есть ответственный из\nнастроек модуля.",[244,256,257,258,262],{},"Опирается на ",[248,259,70],{"href":260,"rel":261},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Foptions",[252],": его нужно\nпоставить первым.",[264,265,267],"h1",{"id":266},"что-нужно-для-установки","Что нужно для установки",[269,270,271,282],"table",{},[272,273,274],"thead",{},[275,276,277,280],"tr",{},[278,279],"th",{},[278,281],{},[283,284,285,294,302,313,324],"tbody",{},[275,286,287,291],{},[288,289,290],"td",{},"PHP",[288,292,293],{},"8.2 и выше",[275,295,296,299],{},[288,297,298],{},"Главный модуль Битрикс",[288,300,301],{},"22.600.300 и выше",[275,303,304,310],{},[288,305,306,307],{},"Модуль ",[308,309,70],"code",{},[288,311,312],{},"3.0.0 и выше",[275,314,315,318],{},[288,316,317],{},"Кодировка портала",[288,319,320],{},[321,322,323],"strong",{},"только UTF-8",[275,325,326,329],{},[288,327,328],{},"Расширение PHP",[288,330,331],{},[308,332,333],{},"mbstring",[264,335,337],{"id":336},"установка","Установка",[244,339,340,343,344,346],{},[321,341,342],{},"Порядок шагов важен:"," сначала ",[308,345,70],{},", потом файлы этого модуля, потом\nустановка в административном разделе, и только потом настройки.",[348,349,351],"h2",{"id":350},"через-composer","Через Composer",[353,354,358],"pre",{"className":355,"code":356,"language":357,"meta":105,"style":105},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","composer require bxshef\u002Fproblems\n","bash",[308,359,360],{"__ignoreMap":105},[361,362,365,369,373],"span",{"class":363,"line":364},"line",1,[361,366,368],{"class":367},"sbgvK","composer",[361,370,372],{"class":371},"s_sjI"," require",[361,374,375],{"class":371}," bxshef\u002Fproblems\n",[244,377,378,379,382,383,386,387,390,391,394],{},"Модуль развернётся в ",[308,380,381],{},"bitrix\u002Fmodules\u002Fshef.problems\u002F"," сам, вместе с ним приедут\n",[308,384,385],{},"bxshef\u002Foptions"," и ",[308,388,389],{},"monolog\u002Fmonolog",". Composer 2.2+ требует разрешить плагин\nраскладки — один раз, в ",[308,392,393],{},"composer.json"," проекта:",[353,396,400],{"className":397,"code":398,"language":399,"meta":105,"style":105},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n    \"config\": {\n        \"allow-plugins\": {\n            \"composer\u002Finstallers\": true\n        }\n    }\n}\n","json",[308,401,402,408,428,444,461,467,473],{"__ignoreMap":105},[361,403,404],{"class":363,"line":364},[361,405,407],{"class":406},"sP7_E","{\n",[361,409,411,415,419,422,425],{"class":363,"line":410},2,[361,412,414],{"class":413},"s39Yj","    \"",[361,416,418],{"class":417},"sseR_","config",[361,420,421],{"class":413},"\"",[361,423,424],{"class":406},":",[361,426,427],{"class":406}," {\n",[361,429,431,434,438,440,442],{"class":363,"line":430},3,[361,432,433],{"class":413},"        \"",[361,435,437],{"class":436},"sZMiF","allow-plugins",[361,439,421],{"class":413},[361,441,424],{"class":406},[361,443,427],{"class":406},[361,445,447,450,454,456,458],{"class":363,"line":446},4,[361,448,449],{"class":413},"            \"",[361,451,453],{"class":452},"srdBf","composer\u002Finstallers",[361,455,421],{"class":413},[361,457,424],{"class":406},[361,459,460],{"class":413}," true\n",[361,462,464],{"class":363,"line":463},5,[361,465,466],{"class":406},"        }\n",[361,468,470],{"class":363,"line":469},6,[361,471,472],{"class":406},"    }\n",[361,474,476],{"class":363,"line":475},7,[361,477,478],{"class":406},"}\n",[348,480,482],{"id":481},"из-архива","Из архива",[244,484,485,486,489,490,495,496,499,500,502],{},"Скачайте ",[308,487,488],{},"shef.problems.zip"," со ",[248,491,494],{"href":492,"rel":493},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Freleases",[252],"страницы релизов","\nи распакуйте в ",[308,497,498],{},"bitrix\u002Fmodules\u002F",". Должно получиться\n",[308,501,381],{}," — именно через точку. Monolog лежит внутри\nархива, отдельно его ставить не нужно.",[348,504,506],{"id":505},"откуда-берётся-monolog","Откуда берётся Monolog",[244,508,509],{},"Из двух мест, и оба оставлены сознательно:",[511,512,513,517],"ul",{},[514,515,516],"li",{},"есть Monolog в Composer проекта — модуль берёт его;",[514,518,519,520,523],{},"нет — модуль подключает свою копию из ",[308,521,522],{},"vendor\u002F",".",[244,525,526,527,529,530,533,534,523],{},"Решает это модуль сам, при каждой загрузке. Composer проекта Битрикс видит,\nесли путь к ",[308,528,393],{}," указан в ",[308,531,532],{},"\u002Fbitrix\u002F.settings.php",", ключ ",[308,535,368],{},[348,537,539],{"id":538},"дальше-в-административном-разделе","Дальше — в административном разделе",[541,542,543,556,565,593],"ol",{},[514,544,545,548,549,552,553,523],{},[321,546,547],{},"Настройки → Marketplace → Установленные решения"," → «",[361,550,551],{},"SH"," Учёт проблем» →\n",[321,554,555],{},"Установить",[514,557,558,564],{},[321,559,560,561,563],{},"Настройки → Настройки продукта → Настройки модулей → ",[361,562,551],{}," Учёт проблем"," →\nвкладка «Сотрудники»: кому уходят проблемы каждого типа. Не заполните —\nвсё уйдёт пользователю с ID 1.",[514,566,567,568,571,572,575,576,579,580,583,584,587,588,523],{},"Логи пишутся ",[321,569,570],{},"вне корня сайта"," — на уровень выше него: при корне\n",[308,573,574],{},"\u002Fhome\u002Fbitrix\u002Fwww"," это ",[308,577,578],{},"\u002Fhome\u002Fbitrix\u002Fsh_log",". Веб-сервер их не отдаёт,\nсмотреть — через ",[321,581,582],{},"Настройки → Учёт проблем → Логи",". Свой каталог, права,\n",[308,585,586],{},"open_basedir"," и перенос логов 1.x —\n",[248,589,592],{"href":590,"rel":591},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fsecurity.md",[252],"безопасность логов",[514,594,595,596,523],{},"По желанию — ",[248,597,600],{"href":598,"rel":599},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F5_logrotate.md",[252],"ротация логов",[264,602,604],{"id":603},"как-пользоваться","Как пользоваться",[244,606,607],{},"Проблема в своём классе — трейт, две строки настройки, одна строка записи:",[353,609,613],{"className":610,"code":611,"language":612,"meta":105,"style":105},"language-php shiki shiki-themes material-theme-lighter github-light github-dark","\\Bitrix\\Main\\Loader::includeModule('shef.problems');\n\nfinal class OrdersExchange\n{\n    use \\Shef\\Problems\\Factory\\Trait\\LoggerProblems;\n\n    public function __construct()\n    {\n        $this->initLogger();\n    }\n\n    public static function getClassName(): string { return static::class; }\n    public static function getModuleId(): string { return 'acme.exchange'; }\n\n    public function run(): void\n    {\n        $this->logger->error('1С не ответила', ['itemId' => 1024]);\n    }\n}\n","php",[308,614,615,620,626,631,635,640,644,649,655,661,666,671,677,683,688,694,699,705,710],{"__ignoreMap":105},[361,616,617],{"class":363,"line":364},[361,618,619],{},"\\Bitrix\\Main\\Loader::includeModule('shef.problems');\n",[361,621,622],{"class":363,"line":410},[361,623,625],{"emptyLinePlaceholder":624},true,"\n",[361,627,628],{"class":363,"line":430},[361,629,630],{},"final class OrdersExchange\n",[361,632,633],{"class":363,"line":446},[361,634,407],{},[361,636,637],{"class":363,"line":463},[361,638,639],{},"    use \\Shef\\Problems\\Factory\\Trait\\LoggerProblems;\n",[361,641,642],{"class":363,"line":469},[361,643,625],{"emptyLinePlaceholder":624},[361,645,646],{"class":363,"line":475},[361,647,648],{},"    public function __construct()\n",[361,650,652],{"class":363,"line":651},8,[361,653,654],{},"    {\n",[361,656,658],{"class":363,"line":657},9,[361,659,660],{},"        $this->initLogger();\n",[361,662,664],{"class":363,"line":663},10,[361,665,472],{},[361,667,669],{"class":363,"line":668},11,[361,670,625],{"emptyLinePlaceholder":624},[361,672,674],{"class":363,"line":673},12,[361,675,676],{},"    public static function getClassName(): string { return static::class; }\n",[361,678,680],{"class":363,"line":679},13,[361,681,682],{},"    public static function getModuleId(): string { return 'acme.exchange'; }\n",[361,684,686],{"class":363,"line":685},14,[361,687,625],{"emptyLinePlaceholder":624},[361,689,691],{"class":363,"line":690},15,[361,692,693],{},"    public function run(): void\n",[361,695,697],{"class":363,"line":696},16,[361,698,654],{},[361,700,702],{"class":363,"line":701},17,[361,703,704],{},"        $this->logger->error('1С не ответила', ['itemId' => 1024]);\n",[361,706,708],{"class":363,"line":707},18,[361,709,472],{},[361,711,713],{"class":363,"line":712},19,[361,714,478],{},[244,716,717,718,721],{},"Запись ляжет в ",[308,719,720],{},"sh_problems_problem.log"," в каталоге логов и в журнал событий.\nОтладка на экран администратору:",[353,723,725],{"className":610,"code":724,"language":612,"meta":105,"style":105},"\\Shef\\Problems\\Logger::PrHtml->getLogger()->debug('что пришло', $fields);\n",[308,726,727],{"__ignoreMap":105},[361,728,729],{"class":363,"line":364},[361,730,724],{},[244,732,733,734,737,738,741],{},"Логгеру можно отдать не только строку, а исключение, ",[308,735,736],{},"Result"," или ",[308,739,740],{},"Error","\nядра, массив — он сам разложит их по сообщению и контексту.",[244,743,744,745,523],{},"Логи и журнал — в меню административной части: ",[321,746,747],{},"Настройки → Учёт проблем",[264,749,751],{"id":750},"документация","Документация",[244,753,754],{},"Вся документация — в репозитории:",[511,756,757,764,771,778,785,790,795,802,809],{},[514,758,759],{},[248,760,763],{"href":761,"rel":762},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F1_events.md",[252],"события и меню",[514,765,766],{},[248,767,770],{"href":768,"rel":769},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F2_deffunctions.md",[252],"_pr, _log, _log1 и исключения",[514,772,773],{},[248,774,777],{"href":775,"rel":776},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F3_loglevel.md",[252],"уровни логирования",[514,779,780],{},[248,781,784],{"href":782,"rel":783},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F4_monolog.md",[252],"Monolog: логгеры, фабрика, свои настройки",[514,786,787],{},[248,788,600],{"href":598,"rel":789},[252],[514,791,792],{},[248,793,592],{"href":590,"rel":794},[252],[514,796,797],{},[248,798,801],{"href":799,"rel":800},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fexamples\u002FREADME.md",[252],"запускаемые примеры",[514,803,804],{},[248,805,808],{"href":806,"rel":807},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fportal-check.md",[252],"проверка на портале",[514,810,811],{},[248,812,815],{"href":813,"rel":814},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FCHANGELOG.md",[252],"change log",[264,817,819],{"id":818},"развитие","Развитие",[511,821,822,825,828,831,834,840,843],{},[514,823,824],{},"робот для бизнес-процессов",[514,826,827],{},"проблема — задачей",[514,829,830],{},"проблема — письмом через Битрикс24",[514,832,833],{},"проблема — в чат Битрикс24",[514,835,836,837],{},"проблема — администратору через ",[308,838,839],{},"CAdminNotify::Add",[514,841,842],{},"проблема — пользователю в верхнюю панель Битрикс24",[514,844,845],{},"проблема — в Telegram",[264,847,849],{"id":848},"лицензия","Лицензия",[244,851,852],{},[248,853,856],{"href":854,"rel":855},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FLICENSE",[252],"MIT",[858,859,860],"note",{},[244,861,862,863,868],{},"Источник: ",[248,864,867],{"href":865,"rel":866},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FREADME.md",[252],"problems\u002FREADME.md"," — правки туда, сайт пересобирается сам.",[870,871,872],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":105,"searchDepth":430,"depth":430,"links":874},[875,876,877,878],{"id":350,"depth":410,"text":351},{"id":481,"depth":410,"text":482},{"id":505,"depth":410,"text":506},{"id":538,"depth":410,"text":539},"md",{},"---\ntitle: \"shef.problems\"\ndescription: \"логи, журнал событий, учёт проблем\"\n---\n\nМодуль Битрикс24 «коробки» и БУС для логирования и учёта проблем. Подключает\n[Monolog](https:\u002F\u002Fgithub.com\u002FSeldaek\u002Fmonolog) и даёт готовые логгеры: в файл, в\nжурнал событий Битрикса, на экран администратору. Проблемы разложены по типам —\nобщие, синхронизация, товары, продажи, — и у каждой есть ответственный из\nнастроек модуля.\n\nОпирается на [shef.options](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Foptions): его нужно\nпоставить первым.\n\n# Что нужно для установки\n\n| | |\n|---|---|\n| PHP | 8.2 и выше |\n| Главный модуль Битрикс | 22.600.300 и выше |\n| Модуль `shef.options` | 3.0.0 и выше |\n| Кодировка портала | **только UTF-8** |\n| Расширение PHP | `mbstring` |\n\n# Установка\n\n**Порядок шагов важен:** сначала `shef.options`, потом файлы этого модуля, потом\nустановка в административном разделе, и только потом настройки.\n\n## Через Composer\n\n```bash\ncomposer require bxshef\u002Fproblems\n```\n\nМодуль развернётся в `bitrix\u002Fmodules\u002Fshef.problems\u002F` сам, вместе с ним приедут\n`bxshef\u002Foptions` и `monolog\u002Fmonolog`. Composer 2.2+ требует разрешить плагин\nраскладки — один раз, в `composer.json` проекта:\n\n```json\n{\n\t\"config\": {\n\t\t\"allow-plugins\": {\n\t\t\t\"composer\u002Finstallers\": true\n\t\t}\n\t}\n}\n```\n\n## Из архива\n\nСкачайте `shef.problems.zip` со [страницы релизов](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Freleases)\nи распакуйте в `bitrix\u002Fmodules\u002F`. Должно получиться\n`bitrix\u002Fmodules\u002Fshef.problems\u002F` — именно через точку. Monolog лежит внутри\nархива, отдельно его ставить не нужно.\n\n## Откуда берётся Monolog\n\nИз двух мест, и оба оставлены сознательно:\n\n* есть Monolog в Composer проекта — модуль берёт его;\n* нет — модуль подключает свою копию из `vendor\u002F`.\n\nРешает это модуль сам, при каждой загрузке. Composer проекта Битрикс видит,\nесли путь к `composer.json` указан в `\u002Fbitrix\u002F.settings.php`, ключ `composer`.\n\n## Дальше — в административном разделе\n\n1. **Настройки → Marketplace → Установленные решения** → «[SH] Учёт проблем» →\n   **Установить**.\n2. **Настройки → Настройки продукта → Настройки модулей → [SH] Учёт проблем** →\n   вкладка «Сотрудники»: кому уходят проблемы каждого типа. Не заполните —\n   всё уйдёт пользователю с ID 1.\n3. Логи пишутся **вне корня сайта** — на уровень выше него: при корне\n   `\u002Fhome\u002Fbitrix\u002Fwww` это `\u002Fhome\u002Fbitrix\u002Fsh_log`. Веб-сервер их не отдаёт,\n   смотреть — через **Настройки → Учёт проблем → Логи**. Свой каталог, права,\n   `open_basedir` и перенос логов 1.x —\n   [безопасность логов](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fsecurity.md).\n4. По желанию — [ротация логов](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F5_logrotate.md).\n\n# Как пользоваться\n\nПроблема в своём классе — трейт, две строки настройки, одна строка записи:\n\n```php\n\\Bitrix\\Main\\Loader::includeModule('shef.problems');\n\nfinal class OrdersExchange\n{\n\tuse \\Shef\\Problems\\Factory\\Trait\\LoggerProblems;\n\n\tpublic function __construct()\n\t{\n\t\t$this->initLogger();\n\t}\n\n\tpublic static function getClassName(): string { return static::class; }\n\tpublic static function getModuleId(): string { return 'acme.exchange'; }\n\n\tpublic function run(): void\n\t{\n\t\t$this->logger->error('1С не ответила', ['itemId' => 1024]);\n\t}\n}\n```\n\nЗапись ляжет в `sh_problems_problem.log` в каталоге логов и в журнал событий.\nОтладка на экран администратору:\n\n```php\n\\Shef\\Problems\\Logger::PrHtml->getLogger()->debug('что пришло', $fields);\n```\n\nЛоггеру можно отдать не только строку, а исключение, `Result` или `Error`\nядра, массив — он сам разложит их по сообщению и контексту.\n\nЛоги и журнал — в меню административной части: **Настройки → Учёт проблем**.\n\n# Документация\n\nВся документация — в репозитории:\n\n* [события и меню](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F1_events.md)\n* [_pr, _log, _log1 и исключения](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F2_deffunctions.md)\n* [уровни логирования](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F3_loglevel.md)\n* [Monolog: логгеры, фабрика, свои настройки](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F4_monolog.md)\n* [ротация логов](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002F5_logrotate.md)\n* [безопасность логов](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fsecurity.md)\n* [запускаемые примеры](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fexamples\u002FREADME.md)\n* [проверка на портале](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fportal-check.md)\n* [change log](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FCHANGELOG.md)\n\n# Развитие\n\n* робот для бизнес-процессов\n* проблема — задачей\n* проблема — письмом через Битрикс24\n* проблема — в чат Битрикс24\n* проблема — администратору через `CAdminNotify::Add`\n* проблема — пользователю в верхнюю панель Битрикс24\n* проблема — в Telegram\n\n# Лицензия\n\n[MIT](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FLICENSE)\n\n::note\nИсточник: [problems\u002FREADME.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FREADME.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":132,"description":137},"XxE-f-beSGjW1cbOvygyRNPAH_O7huDJYxAntNU7-hk",[885,886],{"title":128,"path":129,"stem":130,"description":105,"children":-1},{"title":139,"path":140,"stem":141,"description":142,"children":-1},1790857269088]