[{"data":1,"prerenderedAt":1030},["ShallowReactive",2],{"navigation_docs":3,"-modules-insync-import":238,"-modules-insync-import-surround":1027},[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":204,"body":240,"description":207,"extension":1021,"meta":1022,"navigation":1023,"path":205,"rawbody":1024,"seo":1025,"stem":206,"__hash__":1026},"docs\u002F3.modules\u002F3.insync\u002F2.import.md",{"type":241,"value":242,"toc":1002},"minimark",[243,256,284,299,304,374,378,431,458,461,495,499,549,558,572,581,593,598,602,605,608,697,706,716,722,731,736,745,752,764,785,807,833,842,850,860,864,867,876,881,901,908,971,974,986,998],[244,245,246,247,251,252,255],"p",{},"Импорт идёт в два шага через таблицу импорта ",[248,249,250],"code",{},"\\Shef\\InSync\\Sync\\Model\\SyncTable","\n(",[248,253,254],{},"shef_insync_model","):",[257,258,259,271],"ol",{},[260,261,262,266,267,270],"li",{},[263,264,265],"strong",{},"процесс"," (",[248,268,269],{},"\\Shef\\InSync\\Sync\\IProcess",") забирает данные — из файла,\nиз CRM, из API — и складывает строки в таблицу импорта;",[260,272,273,266,276,279,280,283],{},[263,274,275],{},"агент разбора",[248,277,278],{},"\\Shef\\InSync\\Sync\\FromFile\\AAgent",") берёт строки из\nтаблицы пачками и разносит по сущностям. Сколько брать и что делать с\nошибочными строками, решает стратегия\n(",[248,281,282],{},"\\Shef\\InSync\\Sync\\FromFile\\Strategy\\IStrategy",").",[285,286,287],"blockquote",{},[244,288,289,290],{},"Пример смотреть в модуле ",[263,291,292],{},[293,294,298],"a",{"href":295,"rel":296},"https:\u002F\u002Fmarketplace.1c-bitrix.ru\u002Fsolutions\u002Fshef.demosync\u002F",[297],"nofollow","shef.demosync",[300,301,303],"h2",{"id":302},"процессы","Процессы",[305,306,307,323],"table",{},[308,309,310],"thead",{},[311,312,313,317,320],"tr",{},[314,315,316],"th",{},"класс",[314,318,319],{},"что это",[314,321,322],{},"примечание",[324,325,326,338,349,363],"tbody",{},[311,327,328,332,335],{},[329,330,331],"td",{},"FromFile\\AFileProcess",[329,333,334],{},"абстракция импорта файла",[329,336,337],{},"каталоги, движение файла, строки в таблицу",[311,339,340,343,346],{},[329,341,342],{},"FromFile\\ACsvProcess",[329,344,345],{},"импорт CSV",[329,347,348],{},"разделитель, заголовок, карта колонок",[311,350,351,354,357],{},[329,352,353],{},"FromFile\\AXmlProcess",[329,355,356],{},"импорт XML",[329,358,359,360],{},"потоково, по тегу элемента, см. ",[293,361,362],{"href":215},"Парсинг XML",[311,364,365,368,371],{},[329,366,367],{},"Crm\\ACrmProcess",[329,369,370],{},"строки из сущностей CRM",[329,372,373],{},"проходит по типу сущности CRM",[300,375,377],{"id":376},"агент-разбора-и-стратегии","Агент разбора и стратегии",[305,379,380,389],{},[308,381,382],{},[311,383,384,386],{},[314,385,316],{},[314,387,388],{},"что делает",[324,390,391,403,411,423],{},[311,392,393,396],{},[329,394,395],{},"FromFile\\AAgent",[329,397,398,399,402],{},"берёт строки своего импорта, помечает «в работе», зовёт ",[248,400,401],{},"processRow()",", успешные удаляет",[311,404,405,408],{},[329,406,407],{},"FromFile\\Strategy\\Simple",[329,409,410],{},"берёт все строки; ошибочные остаются и будут взяты снова",[311,412,413,416],{},[329,414,415],{},"FromFile\\Strategy\\MarkFail",[329,417,418,419,422],{},"ошибочные помечает маркером ",[248,420,421],{},".error"," в коде импорта; берутся снова",[311,424,425,428],{},[329,426,427],{},"FromFile\\Strategy\\HideFail",[329,429,430],{},"ошибочные помечает и больше не берёт",[244,432,433,434,437,438,441,442,445,446,449,450,453,454,457],{},"Статусы строк — ",[248,435,436],{},"\\Shef\\InSync\\Sync\\EStatus",": ",[248,439,440],{},"U"," — не определён, ",[248,443,444],{},"N"," — новая,\n",[248,447,448],{},"P"," — в работе, ",[248,451,452],{},"S"," — успешно, ",[248,455,456],{},"F"," — ошибка.",[244,459,460],{},"Очистить таблицу импорта из кода:",[462,463,467],"pre",{"className":464,"code":465,"language":466,"meta":105,"style":105},"language-php shiki shiki-themes material-theme-lighter github-light github-dark","\\Bitrix\\Main\\Loader::includeModule('shef.insync');\n$collection = \\Shef\\InSync\\Sync\\Model\\SyncTable::createCollection();\n$collection->clear('ShefDemosyncFromFileCsv');   \u002F\u002F строки одного импорта\n$statistic = $collection->getStatistic();\n","php",[248,468,469,477,483,489],{"__ignoreMap":105},[470,471,474],"span",{"class":472,"line":473},"line",1,[470,475,476],{},"\\Bitrix\\Main\\Loader::includeModule('shef.insync');\n",[470,478,480],{"class":472,"line":479},2,[470,481,482],{},"$collection = \\Shef\\InSync\\Sync\\Model\\SyncTable::createCollection();\n",[470,484,486],{"class":472,"line":485},3,[470,487,488],{},"$collection->clear('ShefDemosyncFromFileCsv');   \u002F\u002F строки одного импорта\n",[470,490,492],{"class":472,"line":491},4,[470,493,494],{},"$statistic = $collection->getStatistic();\n",[300,496,498],{"id":497},"каталоги-для-файлов","Каталоги для файлов",[244,500,501,502,505,506,509,510,513,514,517,518,521,522,525,526,437,529,532,533,536,537,540,541,544,545,548],{},"Файлы кладутся в каталог ",[248,503,504],{},"\\Shef\\InSync\\Sync\\FromFile\\AFileProcess::getImportFolder()",",\nпо умолчанию ",[263,507,508],{},"{каталог импорта}\u002F{код импорта}\u002F",". Каталог импорта — вне корня\nсайта, ",[248,511,512],{},"\\Shef\\InSync\\Main\\Constants::getImportDir()",": на BitrixVM это\n",[248,515,516],{},"\u002Fhome\u002Fbitrix\u002Fsh_import",", свой задаётся в ",[248,519,520],{},"\u002Fbitrix\u002F.settings_extra.php",", см.\n",[293,523,524],{"href":200},"security.md",". Имя файла начинается с префикса — например,\n",[248,527,528],{},"cart-xxx.xml",[248,530,531],{},"getExistFiles('cart-', 'xml')"," берёт файлы, имя которых\n",[263,534,535],{},"начинается"," с префикса, с этим расширением (несколько — через ",[248,538,539],{},"|",":\n",[248,542,543],{},"'xml|zip'","), старые первыми. Файлы в обработке (",[248,546,547],{},"process_\u003Cкод>_…",") и файлы\nбез расширения не берутся.",[285,550,551],{},[244,552,553,554,557],{},"Картинки стоит так же выкладывать в эту папку, например в подпапку ",[263,555,556],{},"img",".",[244,559,560,561,564,565,568,569,557],{},"После обработки файл переезжает в ",[263,562,563],{},"{каталог импорта}\u002Fcopy\u002F{код импорта}\u002F",",\nпри проблеме — в ",[263,566,567],{},"{каталог импорта}\u002Fproblem\u002F{код импорта}\u002F",". Имя архивного\nфайла — ",[248,570,571],{},"done_\u003Cкод>_\u003Cдата>_\u003Cслучайный хвост>.\u003Cрасш>",[244,573,574,575,578,579,557],{},"До 2.0.0 каталог был ",[248,576,577],{},"\u002Fupload\u002Fimport",", под корнем сайта. Внешние обмены,\nкоторые кладут туда файлы, после обновления перенастраиваются на новый\nкаталог — порядок в ",[293,580,524],{"href":200},[285,582,583],{},[244,584,585,586,589,590,283],{},"Сколько дней хранить файлы в архиве, задаётся в настройках модуля, по\nумолчанию 3 дня. Процесс импорта может переопределить срок\n(",[248,587,588],{},"getMaxDayOffDoneFile()"," в своём наследнике ",[248,591,592],{},"AFileProcess",[244,594,595,596,557],{},"Загрузить файл руками — страница импорта из файла, см. ",[293,597,219],{"href":220},[300,599,601],{"id":600},"модели","Модели",[244,603,604],{},"В модуле преследуется цель работать со сущностями Битрикс только через ORM.",[244,606,607],{},"По этой причине созданы необходимые для работы модели и аннотации к ним.\nВсе остальные модели\u002Fаннотации в Битрикс уже присутствуют.",[285,609,610,619,668,675,690],{},[244,611,612,613,618],{},"Аннотацию для модели собирать через ",[293,614,617],{"href":615,"rel":616},"https:\u002F\u002Fdev.1c-bitrix.ru\u002Flearning\u002Fcourse\u002Findex.php?COURSE_ID=43&LESSON_ID=11733",[297],"механизм Битрикс",":",[462,620,624],{"className":621,"code":622,"language":623,"meta":105,"style":105},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","php bitrix.php orm:annotate -m shef.insync \u003Cпуть к модулю>\u002Fmeta\u002Form.php\n","shell",[248,625,626],{"__ignoreMap":105},[470,627,628,631,635,638,642,645,649,652,655,658,662,665],{"class":472,"line":473},[470,629,466],{"class":630},"sbgvK",[470,632,634],{"class":633},"s_sjI"," bitrix.php",[470,636,637],{"class":633}," orm:annotate",[470,639,641],{"class":640},"stzsN"," -m",[470,643,644],{"class":633}," shef.insync",[470,646,648],{"class":647},"smGrS"," \u003C",[470,650,651],{"class":633},"путь",[470,653,654],{"class":633}," к",[470,656,657],{"class":633}," модул",[470,659,661],{"class":660},"su5hD","ю",[470,663,664],{"class":647},">",[470,666,667],{"class":633},"\u002Fmeta\u002Form.php\n",[244,669,670,671,674],{},"Или использовать ",[248,672,673],{},"shef-cli",", если он доступен:",[462,676,678],{"className":621,"code":677,"language":623,"meta":105,"style":105},"shef-cli module:annotate shef.insync\n",[248,679,680],{"__ignoreMap":105},[470,681,682,684,687],{"class":472,"line":473},[470,683,673],{"class":630},[470,685,686],{"class":633}," module:annotate",[470,688,689],{"class":633}," shef.insync\n",[244,691,692,693,696],{},"Аннотации лежат в одном ",[248,694,695],{},"meta\u002Form.php"," в корне модуля — как у модулей ядра.",[698,699,701,705],"h3",{"id":700},"shefinsyncsyncmodelsynctable-таблица-синхронизации",[470,702,703],{},[248,704,250],{}," Таблица синхронизации",[244,707,708,709,712,713,557],{},"Работает через модель ",[248,710,711],{},"EO_",", поддерживает интерфейс ",[248,714,715],{},"\\Shef\\InSync\\Sync\\IElement",[244,717,718,719,721],{},"Интерфейс и магические методы ",[248,720,711],{}," связаны через фасад.",[698,723,725,730],{"id":724},"shefinsyncsyncmodelstore-склады",[470,726,727],{},[248,728,729],{},"\\Shef\\InSync\\Sync\\Model\\Store"," Склады",[244,732,708,733,735],{},[248,734,711],{},", для работы со складами (Название, адрес и тп)",[698,737,739,744],{"id":738},"shefinsyncsyncmodeliblock-инфоблоки",[470,740,741],{},[248,742,743],{},"\\Shef\\InSync\\Sync\\Model\\IBlock\\*"," Инфоблоки",[244,746,747,748,751],{},"Добавили в ",[248,749,750],{},"*Table"," поддержку IblockId.",[244,753,708,754,756,757,760,761,557],{},[248,755,711],{},", для работы с сущностями инфоблоков, поддерживает интерфейсы ",[248,758,759],{},"Model\\IBlock\\IIBlockId",", ",[248,762,763],{},"Model\\IBlock\\IFixGetList",[765,766,767,773,779],"ul",{},[260,768,769,770],{},"разделы ",[248,771,772],{},"Model\\IBlock\\Section",[260,774,775,776],{},"элементы ",[248,777,778],{},"Model\\IBlock\\Element",[260,780,781,782],{},"перечисления для свойства типа список ",[248,783,784],{},"Model\\IBlock\\PropertyEnumeration",[244,786,787,788,791,792,795,796,799,800,803,804,806],{},"Свойства элемента по коду — трейт ",[248,789,790],{},"\\Shef\\InSync\\Sync\\Model\\IBlock\\Element\\PropertyTrait","\nдля драйвера или процесса импорта: строка, число, флажок, файл, список\n(",[248,793,794],{},"getPropertyEnum()"," и ",[248,797,798],{},"getEnum()"," — найти значение списка по XML_ID или по\nзначению без учёта регистра, нет — создать). Описание свойства читается один\nраз на объект; класс задаёт ",[248,801,802],{},"static::$dataClass"," — свой ",[248,805,750],{}," инфоблока.",[285,808,809,812],{},[244,810,811],{},"Для использования аннотаций на конкретный инфоблок нужно:",[765,813,814,817,823,828],{},[260,815,816],{},"задать код ORM в инфоблоке",[260,818,819,820],{},"унаследоваться от ",[248,821,822],{},"\\Shef\\InSync\\Sync\\Model\\IBlock\\*\\*Table",[260,824,825,826],{},"переопределить в нем свои классы для ",[248,827,711],{},[260,829,830,831],{},"построить аннотацию для своего класса ",[248,832,750],{},[698,834,836,841],{"id":835},"shefinsyncsyncmodelcatalogproducttable-каталог",[470,837,838],{},[248,839,840],{},"\\Shef\\InSync\\Sync\\Model\\Catalog\\ProductTable"," Каталог",[244,843,708,844,846,847,557],{},[248,845,711],{},". Наследник ",[248,848,849],{},"\\Bitrix\\Catalog\\ProductTable",[244,851,852,853,856,857,557],{},"Добавлена связь со ставкой НДС ",[248,854,855],{},"SH_VAT"," с ",[248,858,859],{},"\\Bitrix\\Catalog\\VatTable",[300,861,863],{"id":862},"драйверы","Драйверы",[244,865,866],{},"Надстройка над штатным API для чтения\u002Fзаписи данных.",[698,868,870,875],{"id":869},"shefinsyncsyncmodelcatalogdriver-для-bitrixcatalog",[470,871,872],{},[248,873,874],{},"\\Shef\\InSync\\Sync\\Model\\Catalog\\Driver\\*"," для Bitrix\\Catalog",[285,877,878],{},[244,879,880],{},"При работе со складским учётом - нужно импортировать остатки через документы складского учета",[244,882,883,884,887,888,891,892,895,896,898,899,557],{},"Модуль битрикса ",[248,885,886],{},"catalog"," использует ",[889,890,600],"em",{}," и апи ",[889,893,894],{},"v2",". Тк. на текущий момент для ",[889,897,894],{}," написано в коде что оно не стабильно, используем ",[263,900,600],{},[244,902,903,904,907],{},"Интерфейс ",[248,905,906],{},"Driver\\ICatalogModel"," указывает что используется модель каталога.",[305,909,910,925],{},[308,911,912],{},[311,913,914,918,922],{},[314,915,917],{"align":916},"right","Класс",[314,919,921],{"align":920},"left","Интерфейс",[314,923,924],{"align":920},"Описание",[324,926,927,945,959],{},[311,928,929,934,938],{},[329,930,931],{"align":916},[248,932,933],{},"Driver\\Product",[329,935,936],{"align":920},[248,937,906],{},[329,939,940,941,944],{"align":920},"Работа с данными по товару  -> вес, габариты, единица измерения, ",[942,943],"br",{},"цена закупки, НДС, общий остаток и тп",[311,946,947,952,956],{},[329,948,949],{"align":916},[248,950,951],{},"Driver\\Price",[329,953,954],{"align":920},[248,955,906],{},[329,957,958],{"align":920},"Работа с ценами на товары",[311,960,961,966,968],{},[329,962,963],{"align":916},[248,964,965],{},"Driver\\Amount",[329,967],{"align":920},[329,969,970],{"align":920},"Остатки по складам",[972,973],"hr",{},[244,975,976,979,980,979,983],{},[293,977,978],{"href":188},"← Агенты"," | ",[293,981,982],{"href":181},"↑ Содержание",[293,984,985],{"href":210},"API →",[987,988,989],"note",{},[244,990,991,992,997],{},"Источник: ",[293,993,996],{"href":994,"rel":995},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002Fdocs\u002F2_import.md",[297],"insync\u002Fdocs\u002F2_import.md"," — правки туда, сайт пересобирается сам.",[999,1000,1001],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}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 pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":105,"searchDepth":485,"depth":485,"links":1003},[1004,1005,1006,1007,1017],{"id":302,"depth":479,"text":303},{"id":376,"depth":479,"text":377},{"id":497,"depth":479,"text":498},{"id":600,"depth":479,"text":601,"children":1008},[1009,1011,1013,1015],{"id":700,"depth":485,"text":1010},"\\Shef\\InSync\\Sync\\Model\\SyncTable Таблица синхронизации",{"id":724,"depth":485,"text":1012},"\\Shef\\InSync\\Sync\\Model\\Store Склады",{"id":738,"depth":485,"text":1014},"\\Shef\\InSync\\Sync\\Model\\IBlock\\* Инфоблоки",{"id":835,"depth":485,"text":1016},"\\Shef\\InSync\\Sync\\Model\\Catalog\\ProductTable Каталог",{"id":862,"depth":479,"text":863,"children":1018},[1019],{"id":869,"depth":485,"text":1020},"\\Shef\\InSync\\Sync\\Model\\Catalog\\Driver\\* для Bitrix\\Catalog","md",{},true,"---\ntitle: \"[`\\\\Shef\\\\InSync\\\\Sync`] Импорт\"\n---\n\nИмпорт идёт в два шага через таблицу импорта `\\Shef\\InSync\\Sync\\Model\\SyncTable`\n(`shef_insync_model`):\n\n1. **процесс** (`\\Shef\\InSync\\Sync\\IProcess`) забирает данные — из файла,\n   из CRM, из API — и складывает строки в таблицу импорта;\n2. **агент разбора** (`\\Shef\\InSync\\Sync\\FromFile\\AAgent`) берёт строки из\n   таблицы пачками и разносит по сущностям. Сколько брать и что делать с\n   ошибочными строками, решает стратегия\n   (`\\Shef\\InSync\\Sync\\FromFile\\Strategy\\IStrategy`).\n\n> Пример смотреть в модуле **[shef.demosync](https:\u002F\u002Fmarketplace.1c-bitrix.ru\u002Fsolutions\u002Fshef.demosync\u002F)**\n\n## Процессы\n\n| класс | что это | примечание |\n|---|---|---|\n| FromFile\\AFileProcess | абстракция импорта файла | каталоги, движение файла, строки в таблицу |\n| FromFile\\ACsvProcess | импорт CSV | разделитель, заголовок, карта колонок |\n| FromFile\\AXmlProcess | импорт XML | потоково, по тегу элемента, см. [Парсинг XML](\u002Fmodules\u002Finsync\u002Fxml) |\n| Crm\\ACrmProcess | строки из сущностей CRM | проходит по типу сущности CRM |\n\n## Агент разбора и стратегии\n\n| класс | что делает |\n|---|---|\n| FromFile\\AAgent | берёт строки своего импорта, помечает «в работе», зовёт `processRow()`, успешные удаляет |\n| FromFile\\Strategy\\Simple | берёт все строки; ошибочные остаются и будут взяты снова |\n| FromFile\\Strategy\\MarkFail | ошибочные помечает маркером `.error` в коде импорта; берутся снова |\n| FromFile\\Strategy\\HideFail | ошибочные помечает и больше не берёт |\n\nСтатусы строк — `\\Shef\\InSync\\Sync\\EStatus`: `U` — не определён, `N` — новая,\n`P` — в работе, `S` — успешно, `F` — ошибка.\n\nОчистить таблицу импорта из кода:\n\n```php\n\\Bitrix\\Main\\Loader::includeModule('shef.insync');\n$collection = \\Shef\\InSync\\Sync\\Model\\SyncTable::createCollection();\n$collection->clear('ShefDemosyncFromFileCsv');   \u002F\u002F строки одного импорта\n$statistic = $collection->getStatistic();\n```\n\n## Каталоги для файлов\n\nФайлы кладутся в каталог `\\Shef\\InSync\\Sync\\FromFile\\AFileProcess::getImportFolder()`,\nпо умолчанию **{каталог импорта}\u002F{код импорта}\u002F**. Каталог импорта — вне корня\nсайта, `\\Shef\\InSync\\Main\\Constants::getImportDir()`: на BitrixVM это\n`\u002Fhome\u002Fbitrix\u002Fsh_import`, свой задаётся в `\u002Fbitrix\u002F.settings_extra.php`, см.\n[security.md](\u002Fmodules\u002Finsync\u002Fsecurity). Имя файла начинается с префикса — например,\n`cart-xxx.xml`: `getExistFiles('cart-', 'xml')` берёт файлы, имя которых\n**начинается** с префикса, с этим расширением (несколько — через `|`:\n`'xml|zip'`), старые первыми. Файлы в обработке (`process_\u003Cкод>_…`) и файлы\nбез расширения не берутся.\n\n> Картинки стоит так же выкладывать в эту папку, например в подпапку **img**.\n\nПосле обработки файл переезжает в **{каталог импорта}\u002Fcopy\u002F{код импорта}\u002F**,\nпри проблеме — в **{каталог импорта}\u002Fproblem\u002F{код импорта}\u002F**. Имя архивного\nфайла — `done_\u003Cкод>_\u003Cдата>_\u003Cслучайный хвост>.\u003Cрасш>`.\n\nДо 2.0.0 каталог был `\u002Fupload\u002Fimport`, под корнем сайта. Внешние обмены,\nкоторые кладут туда файлы, после обновления перенастраиваются на новый\nкаталог — порядок в [security.md](\u002Fmodules\u002Finsync\u002Fsecurity).\n\n> Сколько дней хранить файлы в архиве, задаётся в настройках модуля, по\n> умолчанию 3 дня. Процесс импорта может переопределить срок\n(`getMaxDayOffDoneFile()` в своём наследнике `AFileProcess`).\n\nЗагрузить файл руками — страница импорта из файла, см. [Компоненты](\u002Fmodules\u002Finsync\u002Fcomponents).\n\n## Модели\nВ модуле преследуется цель работать со сущностями Битрикс только через ORM.\n\nПо этой причине созданы необходимые для работы модели и аннотации к ним.\nВсе остальные модели\u002Fаннотации в Битрикс уже присутствуют.\n\n> Аннотацию для модели собирать через [механизм Битрикс](https:\u002F\u002Fdev.1c-bitrix.ru\u002Flearning\u002Fcourse\u002Findex.php?COURSE_ID=43&LESSON_ID=11733):\n> ```shell\n> php bitrix.php orm:annotate -m shef.insync \u003Cпуть к модулю>\u002Fmeta\u002Form.php\n> ```\n>\n> Или использовать `shef-cli`, если он доступен:\n> ```shell\n> shef-cli module:annotate shef.insync\n> ```\n>\n> Аннотации лежат в одном `meta\u002Form.php` в корне модуля — как у модулей ядра.\n\n### [`\\Shef\\InSync\\Sync\\Model\\SyncTable`] Таблица синхронизации\nРаботает через модель `EO_`, поддерживает интерфейс `\\Shef\\InSync\\Sync\\IElement`. \n\nИнтерфейс и магические методы `EO_` связаны через фасад.\n\n### [`\\Shef\\InSync\\Sync\\Model\\Store`] Склады\nРаботает через модель `EO_`, для работы со складами (Название, адрес и тп)\n\n### [`\\Shef\\InSync\\Sync\\Model\\IBlock\\*`] Инфоблоки\nДобавили в `*Table` поддержку IblockId.\n\nРаботает через модель `EO_`, для работы с сущностями инфоблоков, поддерживает интерфейсы `Model\\IBlock\\IIBlockId`, `Model\\IBlock\\IFixGetList`.\n\n* разделы `Model\\IBlock\\Section`\n* элементы `Model\\IBlock\\Element`\n* перечисления для свойства типа список `Model\\IBlock\\PropertyEnumeration`\n\nСвойства элемента по коду — трейт `\\Shef\\InSync\\Sync\\Model\\IBlock\\Element\\PropertyTrait`\nдля драйвера или процесса импорта: строка, число, флажок, файл, список\n(`getPropertyEnum()` и `getEnum()` — найти значение списка по XML_ID или по\nзначению без учёта регистра, нет — создать). Описание свойства читается один\nраз на объект; класс задаёт `static::$dataClass` — свой `*Table` инфоблока.\n\n> Для использования аннотаций на конкретный инфоблок нужно:\n>\n> * задать код ORM в инфоблоке\n> * унаследоваться от `\\Shef\\InSync\\Sync\\Model\\IBlock\\*\\*Table`\n> * переопределить в нем свои классы для `EO_`\n> * построить аннотацию для своего класса `*Table`\n\n\n### [`\\Shef\\InSync\\Sync\\Model\\Catalog\\ProductTable`] Каталог\nРаботает через модель `EO_`. Наследник `\\Bitrix\\Catalog\\ProductTable`.\n\nДобавлена связь со ставкой НДС `SH_VAT` с `\\Bitrix\\Catalog\\VatTable`.\n\n## Драйверы\nНадстройка над штатным API для чтения\u002Fзаписи данных.\n\n### [`\\Shef\\InSync\\Sync\\Model\\Catalog\\Driver\\*`] для Bitrix\\Catalog\n\n> При работе со складским учётом - нужно импортировать остатки через документы складского учета\n\nМодуль битрикса `catalog` использует _модели_ и апи _v2_. Тк. на текущий момент для _v2_ написано в коде что оно не стабильно, используем **модели**.\n\nИнтерфейс `Driver\\ICatalogModel` указывает что используется модель каталога.\n\n|            Класс | Интерфейс              | Описание                                                                                                    |\n|-----------------:|:-----------------------|:------------------------------------------------------------------------------------------------------------|\n| `Driver\\Product` | `Driver\\ICatalogModel` | Работа с данными по товару  -> вес, габариты, единица измерения, \u003Cbr\u002F>цена закупки, НДС, общий остаток и тп |\n|   `Driver\\Price` | `Driver\\ICatalogModel` | Работа с ценами на товары                                                                                   |\n|  `Driver\\Amount` |                        | Остатки по складам                                                                                          |\n\n\n---\n\n[← Агенты](\u002Fmodules\u002Finsync\u002Fagents) | [↑ Содержание](\u002Fmodules\u002Finsync) | [API →](\u002Fmodules\u002Finsync\u002Fapi)\n\n::note\nИсточник: [insync\u002Fdocs\u002F2_import.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Finsync\u002Fblob\u002Fmain\u002Fdocs\u002F2_import.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":204,"description":207},"-H34bfar6EIl8PV9MEatyWrjN83_GsTRKiNW0LiJj0I",[1028,1029],{"title":199,"path":200,"stem":201,"description":202,"children":-1},{"title":209,"path":210,"stem":211,"description":212,"children":-1},1790857269886]