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