[{"data":1,"prerenderedAt":1078},["ShallowReactive",2],{"navigation_docs":3,"-modules-insync-module-structure":238,"-modules-insync-module-structure-surround":1075},[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":87,"body":240,"description":90,"extension":1069,"meta":1070,"navigation":1071,"path":192,"rawbody":1072,"seo":1073,"stem":193,"__hash__":1074},"docs\u002F3.modules\u002F3.insync\u002F10.module-structure.md",{"type":241,"value":242,"toc":1057},"minimark",[243,265,270,297,303,319,336,340,714,720,909,916,938,950,959,963,972,988,995,1024,1035,1039,1045],[244,245,246,247,254,255,260,261,264],"p",{},"Файл про устройство репозитория. Опорные точки модуля — в ",[248,249,253],"a",{"href":250,"rel":251},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002FCLAUDE.md",[252],"nofollow","CLAUDE.md",",\nпроцесс — в ",[248,256,259],{"href":257,"rel":258},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002FCONTRIBUTING.md",[252],"CONTRIBUTING.md",", сборка — в\n",[248,262,263],{"href":236},"build-and-install.md",".",[266,267,269],"h2",{"id":268},"модуль-лежит-в-корне-и-это-вынужденно","Модуль лежит в корне, и это вынужденно",[244,271,272,273,277,278,282,283,282,286,289,290,293,294,264],{},"Composer разворачивает в целевой каталог ",[274,275,276],"strong",{},"корень пакета целиком"," и подкаталоги\nвыбирать не умеет. Поэтому ",[279,280,281],"code",{},"lib\u002F",", ",[279,284,285],{},"install\u002F",[279,287,288],{},"lang\u002F"," лежат прямо в корне\nрепозитория, рядом с ",[279,291,292],{},"build.sh"," и ",[279,295,296],{},".github\u002F",[244,298,299,300,302],{},"Плата за это — два списка в шапке ",[279,301,292],{},":",[304,305,306,313],"ul",{},[307,308,309,312],"li",{},[274,310,311],{},"SHIP"," — уезжает на портал и в Composer-пакет;",[307,314,315,318],{},[274,316,317],{},"KEEP"," — остаётся в репозитории.",[244,320,321,324,325,328,329,332,333,264],{},[274,322,323],{},"Файл, не попавший ни в один список, роняет сборку."," Тот же список продублирован\nв ",[279,326,327],{},".gitattributes"," через ",[279,330,331],{},"export-ignore","; списки обязаны совпадать, сверяется\nавтоматически, см. ",[279,334,335],{},"check_gitattributes",[266,337,339],{"id":338},"что-где-лежит","Что где лежит",[341,342,343,358],"table",{},[344,345,346],"thead",{},[347,348,349,353,355],"tr",{},[350,351,352],"th",{},"путь",[350,354],{},[350,356,357],{},"что это",[359,360,361,378,396,418,437,449,464,480,492,513,527,541,553,568,585,600,612,623,635,647,677,688,701],"tbody",{},[347,362,363,369,371],{},[364,365,366],"td",{},[279,367,368],{},"install\u002Findex.php",[364,370,311],{},[364,372,373,374,377],{},"установщик, класс ",[279,375,376],{},"shef_insync extends CModule",": таблица импорта, левое меню, раскладка компонентов и js",[347,379,380,385,387],{},[364,381,382],{},[279,383,384],{},"install\u002Fversion.php",[364,386,311],{},[364,388,389,293,392,395],{},[279,390,391],{},"VERSION",[279,393,394],{},"VERSION_DATE"," — источник истины о версии",[347,397,398,403,405],{},[364,399,400],{},[279,401,402],{},"install\u002Fcomponents\u002Fshef.insync\u002F",[364,404,311],{},[364,406,407,408,293,411,414,415],{},"компоненты ",[279,409,410],{},"import.from.file",[279,412,413],{},"import.stat.local","; установщик раскладывает их в ",[279,416,417],{},"\u002Fbitrix\u002Fcomponents",[347,419,420,425,427],{},[364,421,422],{},[279,423,424],{},"install\u002Fjs\u002Fshef-insync\u002F",[364,426,311],{},[364,428,429,430,433,434],{},"расширение ",[279,431,432],{},"shef-insync.ui-anchors"," (страницы импорта в слайдере); установщик раскладывает в ",[279,435,436],{},"\u002Fbitrix\u002Fjs",[347,438,439,444,446],{},[364,440,441],{},[279,442,443],{},".settings.php",[364,445,311],{},[364,447,448],{},"зависимости, раскладка, левое меню, контроллеры, откуда брать библиотеки XML",[347,450,451,456,458],{},[364,452,453],{},[279,454,455],{},"include.php",[364,457,311],{},[364,459,460,461],{},"точка входа: ",[279,462,463],{},"autoload.php",[347,465,466,470,472],{},[364,467,468],{},[279,469,463],{},[364,471,311],{},[364,473,474,475,282,477,479],{},"подключает ",[279,476,70],{},[279,478,132],{}," и регистрирует библиотеки XML",[347,481,482,487,489],{},[364,483,484],{},[279,485,486],{},"default_option.php",[364,488,311],{},[364,490,491],{},"умолчания настроек",[347,493,494,502,504],{},[364,495,496,282,499],{},[279,497,498],{},"options.php",[279,500,501],{},"options_conf.php",[364,503,311],{},[364,505,506,507,510,511],{},"страница настроек на ",[279,508,509],{},"ShOptionsConfig"," из ",[279,512,70],{},[347,514,515,519,521],{},[364,516,517],{},[279,518,281],{},[364,520,311],{},[364,522,523,524],{},"классы модуля, ",[274,525,526],{},"имена файлов строго строчными",[347,528,529,534,536],{},[364,530,531],{},[279,532,533],{},"lang\u002Fru\u002F",[364,535,311],{},[364,537,538,539],{},"языковые файлы, зеркалят структуру ",[279,540,281],{},[347,542,543,548,550],{},[364,544,545],{},[279,546,547],{},"meta\u002Form.php",[364,549,311],{},[364,551,552],{},"аннотации ORM для IDE; никем не подключается",[347,554,555,560,562],{},[364,556,557],{},[279,558,559],{},"vendor\u002Fsbwerewolf\u002F",[364,561,311],{},[364,563,564,565],{},"своя копия библиотек разбора XML для установки архивом; версии — в ",[279,566,567],{},"vendor\u002Fversions.json",[347,569,570,581,583],{},[364,571,572,282,575,282,578],{},[279,573,574],{},"README.md",[279,576,577],{},"CHANGELOG.md",[279,579,580],{},"LICENSE",[364,582,311],{},[364,584],{},[347,586,587,592,594],{},[364,588,589],{},[279,590,591],{},"composer.json",[364,593,311],{},[364,595,596,597],{},"манифест пакета ",[279,598,599],{},"bxshef\u002Finsync",[347,601,602,607,609],{},[364,603,604],{},[279,605,606],{},"docs\u002F",[364,608,317],{},[364,610,611],{},"вся документация",[347,613,614,618,620],{},[364,615,616],{},[279,617,292],{},[364,619,317],{},[364,621,622],{},"сборка и проверки",[347,624,625,630,632],{},[364,626,627],{},[279,628,629],{},"tests\u002F",[364,631,317],{},[364,633,634],{},"тесты и заглушки ядра",[347,636,637,642,644],{},[364,638,639],{},[279,640,641],{},"examples\u002F",[364,643,317],{},[364,645,646],{},"запускаемые примеры",[347,648,649,654,656],{},[364,650,651],{},[279,652,653],{},".claude\u002Fskills\u002F",[364,655,317],{},[364,657,658,659,510,662,665,666,669,670,665,673,676],{},"навыки агента: навыки линейки — ",[274,660,661],{},"копия",[279,663,664],{},"bx-shef\u002Foptions"," (",[279,667,668],{},"sync.sh --to","), навыки про shef.insync — свои, перечислены в ",[279,671,672],{},"LOCAL.MANIFEST",[279,674,675],{},"sync.sh --local",")",[347,678,679,683,685],{},[364,680,681],{},[279,682,296],{},[364,684,317],{},[364,686,687],{},"CI и релиз",[347,689,690,696,698],{},[364,691,692,282,694],{},[279,693,259],{},[279,695,253],{},[364,697,317],{},[364,699,700],{},"процесс и памятка агенту",[347,702,703,710,712],{},[364,704,705,282,707],{},[279,706,327],{},[279,708,709],{},".gitignore",[364,711,317],{},[364,713],{},[266,715,717,718],{"id":716},"что-где-в-lib","Что где в ",[279,719,281],{},[341,721,722,732],{},[344,723,724],{},[347,725,726,729],{},[350,727,728],{},"каталог",[350,730,731],{},"что там",[359,733,734,755,772,795,821,834,848,860,879,889,899],{},[347,735,736,741],{},[364,737,738],{},[279,739,740],{},"agents\u002F",[364,742,743,746,747,750,751,754],{},[279,744,745],{},"AAgent"," — базовый агент, ",[279,748,749],{},"Entity"," — описание агента, ",[279,752,753],{},"Manager"," — установка, запуск, остановка, поиск",[347,756,757,762],{},[364,758,759],{},[279,760,761],{},"api\u002F",[364,763,764,767,768,771],{},[279,765,766],{},"AConnector"," — обращение к внешнему API по HTTP, ",[279,769,770],{},"Headers"," — маска секретных заголовков для лога",[347,773,774,779],{},[364,775,776],{},[279,777,778],{},"sync\u002F",[364,780,781,782,282,785,788,789,282,792],{},"интерфейсы импорта (",[279,783,784],{},"IProcess",[279,786,787],{},"IElement",", …), ",[279,790,791],{},"EStatus",[279,793,794],{},"AProcess",[347,796,797,802],{},[364,798,799],{},[279,800,801],{},"sync\u002Ffromfile\u002F",[364,803,804,805,282,808,282,811,814,815,817,818],{},"импорт файлов: ",[279,806,807],{},"AFileProcess",[279,809,810],{},"ACsvProcess",[279,812,813],{},"AXmlProcess",", агент разбора ",[279,816,745],{},", стратегии ",[279,819,820],{},"Strategy\\*",[347,822,823,828],{},[364,824,825],{},[279,826,827],{},"sync\u002Fcrm\u002F",[364,829,830,833],{},[279,831,832],{},"ACrmProcess"," — импорт из сущностей CRM",[347,835,836,841],{},[364,837,838],{},[279,839,840],{},"sync\u002Fmodel\u002F",[364,842,843,844,847],{},"таблица импорта ",[279,845,846],{},"SyncTable",", модели инфоблоков, каталога, складов",[347,849,850,855],{},[364,851,852],{},[279,853,854],{},"sync\u002Fintegration\u002F",[364,856,857,859],{},[279,858,753],{}," — push-обновление страницы статистики",[347,861,862,867],{},[364,863,864],{},[279,865,866],{},"main\u002F",[364,868,869,282,872,282,875,878],{},[279,870,871],{},"Constants",[279,873,874],{},"Utils",[279,876,877],{},"Access"," — кто управляет импортом",[347,880,881,886],{},[364,882,883],{},[279,884,885],{},"main\u002Foptions\u002F",[364,887,888],{},"опции страницы настроек для модулей импорта: агент и пошаговый импорт",[347,890,891,896],{},[364,892,893],{},[279,894,895],{},"integration\u002Fintranet\u002F",[364,897,898],{},"провайдер страниц левого меню",[347,900,901,906],{},[364,902,903],{},[279,904,905],{},"traitlist\u002F",[364,907,908],{},"трейты: класс таблицы импорта, разбор XML",[266,910,912,913,915],{"id":911},"нижний-регистр-в-lib-обязателен","Нижний регистр в ",[279,914,281],{}," обязателен",[244,917,918,921,922,925,926,929,930,933,934,937],{},[279,919,920],{},"Bitrix\\Main\\Loader"," отображает класс в путь ",[274,923,924],{},"строчными",", разбирая первые два\nсегмента namespace как id модуля: ",[279,927,928],{},"Shef\\InSync\\Main\\Utils"," ищется как\n",[279,931,932],{},"bitrix\u002Fmodules\u002Fshef.insync\u002Flib\u002Fmain\u002Futils.php",". Поэтому свой namespace в\n",[279,935,936],{},"registerNamespace"," не нужен — там только библиотеки XML.",[244,939,940,941,282,943,946,947,264],{},"На macOS заглавная буква сходит с рук, на боевом Linux класс просто не найдётся.\nПроверяется в ",[279,942,292],{},[279,944,945],{},"check_lowercase",", и в ",[279,948,949],{},"tests\u002Fautoload_test.php",[244,951,952,953,956,957,264],{},"У ",[279,954,955],{},"vendor\u002F"," соглашение своё — PSR-4 с заглавными, путь задаёт ",[279,958,443],{},[266,960,962],{"id":961},"компоненты-и-фронт","Компоненты и фронт",[964,965,970],"pre",{"className":966,"code":968,"language":969},[967],"language-text","install\u002Fcomponents\u002Fshef.insync\u002F   -> \u002Fbitrix\u002Fcomponents\u002Fshef.insync\u002F\ninstall\u002Fjs\u002Fshef-insync\u002Fui-anchors -> \u002Fbitrix\u002Fjs\u002Fshef-insync\u002Fui-anchors\u002F\n","text",[279,971,968],{"__ignoreMap":105},[244,973,974,975,977,978,981,982,984,985,264],{},"Каталог модуля браузеру недоступен, поэтому компоненты и js копирует\nустановщик — карта в ",[279,976,443],{},", ключ ",[279,979,980],{},"installDir",". Расширение находится\nядром по имени ",[279,983,432],{},": каталог через дефис — требование имён\nрасширений. Сходимость с раскладкой проверяет ",[279,986,987],{},"tests\u002Fassets_test.php",[244,989,990,991,994],{},"До 2.0.0 компоненты ложились в ",[279,992,993],{},"\u002Flocal\u002Fcomponents\u002Fshef.insync",". Ядро смотрит\nтуда первым, и оставшаяся копия перекрыла бы новую, поэтому установщик убирает\nеё и при установке, и при удалении.",[244,996,997,1007,1008,1011,1012,1014,1015,1017,1018,1021,1022,264],{},[274,998,999,1000,282,1003,1006],{},"Минифицированных копий (",[279,1001,1002],{},"*.min.js",[279,1004,1005],{},"*.min.css",") нет."," Ядро берёт ",[279,1009,1010],{},".min",",\nесли он есть, — и устаревший ",[279,1013,1010],{}," молча побеждал бы исправленный исходник.\nОтсутствие проверяет ",[279,1016,987],{},". ",[279,1019,1020],{},"*.min.min.*"," — мусор сборщиков,\nего отсекает ",[279,1023,709],{},[244,1025,1026,1027,1030,1031,1034],{},"Раскладка страниц — штатные ",[279,1028,1029],{},"ui.*"," и свои несколько правил в ",[279,1032,1033],{},"style.css","\nшаблона. Сетка и карточки shef.uiclear ушли вместе с зависимостью.",[266,1036,1038],{"id":1037},"документация-не-едет-на-портал","Документация не едет на портал",[244,1040,1041,1042,1044],{},"Документация живёт в репозитории. В поставке остаётся только ",[279,1043,574],{}," — как\nreadme пакета, — и все ссылки из него ведут на GitHub.",[1046,1047,1048],"note",{},[244,1049,1050,1051,1056],{},"Источник: ",[248,1052,1055],{"href":1053,"rel":1054},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002Fdocs\u002Fmodule-structure.md",[252],"insync\u002Fdocs\u002Fmodule-structure.md"," — правки туда, сайт пересобирается сам.",{"title":105,"searchDepth":1058,"depth":1058,"links":1059},3,[1060,1062,1063,1065,1067,1068],{"id":268,"depth":1061,"text":269},2,{"id":338,"depth":1061,"text":339},{"id":716,"depth":1061,"text":1064},"Что где в lib\u002F",{"id":911,"depth":1061,"text":1066},"Нижний регистр в lib\u002F обязателен",{"id":961,"depth":1061,"text":962},{"id":1037,"depth":1061,"text":1038},"md",{},true,"---\ntitle: \"Раскладка репозитория\"\n---\n\nФайл про устройство репозитория. Опорные точки модуля — в [CLAUDE.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002FCLAUDE.md),\nпроцесс — в [CONTRIBUTING.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002FCONTRIBUTING.md), сборка — в\n[build-and-install.md](\u002Fmodules\u002Finsync\u002Fbuild-and-install).\n\n## Модуль лежит в корне, и это вынужденно\n\nComposer разворачивает в целевой каталог **корень пакета целиком** и подкаталоги\nвыбирать не умеет. Поэтому `lib\u002F`, `install\u002F`, `lang\u002F` лежат прямо в корне\nрепозитория, рядом с `build.sh` и `.github\u002F`.\n\nПлата за это — два списка в шапке `build.sh`:\n\n* **SHIP** — уезжает на портал и в Composer-пакет;\n* **KEEP** — остаётся в репозитории.\n\n**Файл, не попавший ни в один список, роняет сборку.** Тот же список продублирован\nв `.gitattributes` через `export-ignore`; списки обязаны совпадать, сверяется\nавтоматически, см. `check_gitattributes`.\n\n## Что где лежит\n\n| путь | | что это |\n|---|---|---|\n| `install\u002Findex.php` | SHIP | установщик, класс `shef_insync extends CModule`: таблица импорта, левое меню, раскладка компонентов и js |\n| `install\u002Fversion.php` | SHIP | `VERSION` и `VERSION_DATE` — источник истины о версии |\n| `install\u002Fcomponents\u002Fshef.insync\u002F` | SHIP | компоненты `import.from.file` и `import.stat.local`; установщик раскладывает их в `\u002Fbitrix\u002Fcomponents` |\n| `install\u002Fjs\u002Fshef-insync\u002F` | SHIP | расширение `shef-insync.ui-anchors` (страницы импорта в слайдере); установщик раскладывает в `\u002Fbitrix\u002Fjs` |\n| `.settings.php` | SHIP | зависимости, раскладка, левое меню, контроллеры, откуда брать библиотеки XML |\n| `include.php` | SHIP | точка входа: `autoload.php` |\n| `autoload.php` | SHIP | подключает `shef.options`, `shef.problems` и регистрирует библиотеки XML |\n| `default_option.php` | SHIP | умолчания настроек |\n| `options.php`, `options_conf.php` | SHIP | страница настроек на `ShOptionsConfig` из `shef.options` |\n| `lib\u002F` | SHIP | классы модуля, **имена файлов строго строчными** |\n| `lang\u002Fru\u002F` | SHIP | языковые файлы, зеркалят структуру `lib\u002F` |\n| `meta\u002Form.php` | SHIP | аннотации ORM для IDE; никем не подключается |\n| `vendor\u002Fsbwerewolf\u002F` | SHIP | своя копия библиотек разбора XML для установки архивом; версии — в `vendor\u002Fversions.json` |\n| `README.md`, `CHANGELOG.md`, `LICENSE` | SHIP | |\n| `composer.json` | SHIP | манифест пакета `bxshef\u002Finsync` |\n| `docs\u002F` | KEEP | вся документация |\n| `build.sh` | KEEP | сборка и проверки |\n| `tests\u002F` | KEEP | тесты и заглушки ядра |\n| `examples\u002F` | KEEP | запускаемые примеры |\n| `.claude\u002Fskills\u002F` | KEEP | навыки агента: навыки линейки — **копия** из `bx-shef\u002Foptions` (`sync.sh --to`), навыки про shef.insync — свои, перечислены в `LOCAL.MANIFEST` (`sync.sh --local`) |\n| `.github\u002F` | KEEP | CI и релиз |\n| `CONTRIBUTING.md`, `CLAUDE.md` | KEEP | процесс и памятка агенту |\n| `.gitattributes`, `.gitignore` | KEEP | |\n\n## Что где в `lib\u002F`\n\n| каталог | что там |\n|---|---|\n| `agents\u002F` | `AAgent` — базовый агент, `Entity` — описание агента, `Manager` — установка, запуск, остановка, поиск |\n| `api\u002F` | `AConnector` — обращение к внешнему API по HTTP, `Headers` — маска секретных заголовков для лога |\n| `sync\u002F` | интерфейсы импорта (`IProcess`, `IElement`, …), `EStatus`, `AProcess` |\n| `sync\u002Ffromfile\u002F` | импорт файлов: `AFileProcess`, `ACsvProcess`, `AXmlProcess`, агент разбора `AAgent`, стратегии `Strategy\\*` |\n| `sync\u002Fcrm\u002F` | `ACrmProcess` — импорт из сущностей CRM |\n| `sync\u002Fmodel\u002F` | таблица импорта `SyncTable`, модели инфоблоков, каталога, складов |\n| `sync\u002Fintegration\u002F` | `Manager` — push-обновление страницы статистики |\n| `main\u002F` | `Constants`, `Utils`, `Access` — кто управляет импортом |\n| `main\u002Foptions\u002F` | опции страницы настроек для модулей импорта: агент и пошаговый импорт |\n| `integration\u002Fintranet\u002F` | провайдер страниц левого меню |\n| `traitlist\u002F` | трейты: класс таблицы импорта, разбор XML |\n\n## Нижний регистр в `lib\u002F` обязателен\n\n`Bitrix\\Main\\Loader` отображает класс в путь **строчными**, разбирая первые два\nсегмента namespace как id модуля: `Shef\\InSync\\Main\\Utils` ищется как\n`bitrix\u002Fmodules\u002Fshef.insync\u002Flib\u002Fmain\u002Futils.php`. Поэтому свой namespace в\n`registerNamespace` не нужен — там только библиотеки XML.\n\nНа macOS заглавная буква сходит с рук, на боевом Linux класс просто не найдётся.\nПроверяется в `build.sh`, `check_lowercase`, и в `tests\u002Fautoload_test.php`.\n\nУ `vendor\u002F` соглашение своё — PSR-4 с заглавными, путь задаёт `.settings.php`.\n\n## Компоненты и фронт\n\n```\ninstall\u002Fcomponents\u002Fshef.insync\u002F   -> \u002Fbitrix\u002Fcomponents\u002Fshef.insync\u002F\ninstall\u002Fjs\u002Fshef-insync\u002Fui-anchors -> \u002Fbitrix\u002Fjs\u002Fshef-insync\u002Fui-anchors\u002F\n```\n\nКаталог модуля браузеру недоступен, поэтому компоненты и js копирует\nустановщик — карта в `.settings.php`, ключ `installDir`. Расширение находится\nядром по имени `shef-insync.ui-anchors`: каталог через дефис — требование имён\nрасширений. Сходимость с раскладкой проверяет `tests\u002Fassets_test.php`.\n\nДо 2.0.0 компоненты ложились в `\u002Flocal\u002Fcomponents\u002Fshef.insync`. Ядро смотрит\nтуда первым, и оставшаяся копия перекрыла бы новую, поэтому установщик убирает\nеё и при установке, и при удалении.\n\n**Минифицированных копий (`*.min.js`, `*.min.css`) нет.** Ядро берёт `.min`,\nесли он есть, — и устаревший `.min` молча побеждал бы исправленный исходник.\nОтсутствие проверяет `tests\u002Fassets_test.php`. `*.min.min.*` — мусор сборщиков,\nего отсекает `.gitignore`.\n\nРаскладка страниц — штатные `ui.*` и свои несколько правил в `style.css`\nшаблона. Сетка и карточки shef.uiclear ушли вместе с зависимостью.\n\n## Документация не едет на портал\n\nДокументация живёт в репозитории. В поставке остаётся только `README.md` — как\nreadme пакета, — и все ссылки из него ведут на GitHub.\n\n::note\nИсточник: [insync\u002Fdocs\u002Fmodule-structure.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002Fdocs\u002Fmodule-structure.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":87,"description":90},"xl-1rLcMp3kmWmbjlU5Ljn6wcvTSg7sdJnajs2nlyXY",[1076,1077],{"title":187,"path":188,"stem":189,"description":190,"children":-1},{"title":92,"path":195,"stem":196,"description":197,"children":-1},1790857269864]