kd31-rules
Программная работа с «Конвертация данных, редакция 3.1» (КД 3.1) через MCP-toolkit (HTTP API) к живой ИБ: инспекция и создание Конвертаций, ПКО, ПКС, ПКПД, ПОД, теневой модели метаданных (Конфигурации/Объекты/Свойства/Релизы) и слоя формата EnterpriseData (ВерсииФормата/ОбъектыФо
Install
npx skills add https://github.com/Desko77/claude-code-skills-1c/tree/main/skills/kd31-rules
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install desko77-claude-code-skills-1c@llmmart
git clone https://github.com/Desko77/claude-code-skills-1c.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole desko77/claude-code-skills-1c collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
KD 3.1 - правила обмена EnterpriseData через MCP-toolkit
Скилл описывает работу с живой ИБ "Конвертация данных, редакция 3.1" (КД 3.1)
через MCP-toolkit HTTP API: исследование структуры правил, создание/правка
правил, настройка формата и получение артефактов для расширения формата
EnterpriseData - модуля менеджера обмена (общий модуль BSL) и XDTO-пакета
расширения / версии формата (XSD).
Относится к сборке КД 3.1.6.14 (платформа 8.5.1.1302).
Модель данных: КД 3.1 близка к КД 2.0 + слой формата
В этой сборке КД 3.1 по структуре похожа на КД 2.0:
- Теневая модель метаданных:
Релизы(версия загруженной структуры) ->Объекты(Владелец=Релизы) ->Свойства/Значения(Владелец=Объекты).Конфигурации- топ-контейнер, на который ссылаются Релизы (версии живут в Релизах). - Правила в справочниках:
ПравилаКонвертацииОбъектов(ПКО),ПравилаКонвертацииСвойств(ПКС, Владелец=ПКО - это справочник, не регистр),ПравилаКонвертацииПредопределенныхДанных(ПКПД),ПравилаОбработкиДанных(ПОД),ПравилаРегистрацииОбъектов(ПРО, Владелец=Регистрации). ПКО/ПОД/ПКПД - топ-уровневые (без Владельца), связь с конвертацией - черезСоставыКонвертаций. ВАЖНО: у ПКО нет реквизита Наименование (идентификатор в Коде, искать НайтиПоКоду) и ПКО НЕ иерархичен (нет ЭтоГруппа); ПКС иерархичен. Паттерн заполнения - 2 ПКО на объект (<Объект>_Отправка+<Объект>_Получение), эталон в демо. См. bsl-templates.md. - Дополнительно - слой формата EnterpriseData (цепочка справочников):
ВерсииФормата(ПространствоИмен, признак расширения) ->ОбъектыФормата(Владелец=ВерсииФормата) ->СвойстваФормата->ЗначенияФормата; типы -ТипыФормата.
Отличие результата от КД 2.0: КД 3.1 генерирует модуль менеджера обмена (BSL)
для движка ОбменДаннымиXDTO плюс работает с XDTO-пакетом/версией формата, а
не выгружает XML-правила для "Универсального обмена". Для КД 2.0 - скилл kd2-rules.
Архитектура работы
Claude (агент) --Bash+curl (payload через jq/python в файл)--> MCP-toolkit (КД 3.1, СЕРВЕРНЫЙ контекст)
-> справочники Конвертации/ПКО/ПКС/ПКПД/ПОД + теневая модель + слой формата
-> штатные обработки (ЗагрузкаСтруктурыКонфигурацииИзФайловXML, НастройкаПравилОбмена, ВыгрузкаМодуля)
-> артефакты: CommonModule (менеджер обмена) + XDTOPackage/XSD расширения
-> перенос в расширение конфигурации-приемника (например УНФ)
Эндпоинты toolkit (порт по умолчанию 6011):
POST /api/execute_query- запросы к справочникам/состоянию.POST /api/execute_code- чтение метаданных, создание/правка элементов. Серверный, безВозврат- результат черезРезультат = ....GET /api/get_metadata?type=Configuration- метаданные.
Граница автоматизации
Через toolkit реально:
- Инспекция структуры и состояния (состав справочников, реквизиты, статус Конвертации, есть ли Релиз).
- Создание/правка правил как элементов справочников: Конвертация, ПКО, ПКС, ПКПД, ПОД, СоставыКонвертаций (со снятой защитой записи в форме toolkit). ПКО/ПОД/ПКПД - топ-уровневые, в конвертацию включаются записью СоставыКонвертаций.
- Точечная правка реквизитов и привязок.
- Загрузка структуры и генерация модуля - тоже программно: у форменных обработок есть
headless-точки входа (
ВыполнитьЗагрузкуМетаданных,ВыполнитьВыгрузкуМодулей), вызываемые через фоновое задание. См.methods.md.
Удобнее интерактивно (через формы обработок КД 3.1), но НЕ обязательно:
- Загрузка структуры конфигурации (
ЗагрузкаСтруктурыКонфигурацииИзФайловXML) - заполняет Релиз + Объекты/Свойства. Без нее правила привязывать не к чему. Headless -methods.mdп.1 (для большой конфигурации запускать через фон). - Создание/расширение версии формата (
ВыгрузкаСтруктурыФормата/ редакторы формата). - Генерация модуля менеджера (
ВыгрузкаМодуля). Headless -methods.mdп.2.
Перед массовой работой проверять, что Релизы загружены:
ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Релизы (0 -> структура не загружена).
Карта references
| Документ | Что внутри | Когда читать |
|---|---|---|
references/data-schema.md |
проверенные справочники и реквизиты (Конвертации, ПКО, ПКС, ПКПД, ПОД, теневая модель, слой формата), фактические имена обработок | нужны точные имена объектов/реквизитов |
references/bsl-templates.md |
BSL для execute_code: инспекция, состояние конвертации, создание ПКО/ПКС, привязка версии формата | конкретная операция через toolkit |
references/format-extension.md |
расширение формата ED: версия формата с namespace, привязка к Конвертации, обработчики ПКО, генерация менеджера, перенос в расширение; workflow + контекст проекта | разработка расширения формата и перенос артефактов |
references/methods.md |
программный API обработок (headless): загрузка структуры ВыполнитьЗагрузкуМетаданных, генерация модуля ВыполнитьВыгрузкуМодулей, прием вызова форменной обработки в обход UI, file:line |
нужно вызвать обработку КД программно через toolkit |
references/troubleshooting.md |
ограничения toolkit :6011 и КД 3.1 (кодировка, Количество(), тип коллекции метаданных, длины реквизитов, имена перечислений) | при ошибке execute_code/execute_query |
Scripts
scripts/kd31_query.sh "<запрос>" [out.json]- execute_query.scripts/kd31_exec.sh <файл.bsl> [out.json]- execute_code из BSL-файла.
Оба: payload через jq (fallback python) + curl --data-binary @файл, порт через
KD31_PORT (по умолчанию 6011). Если указан out.json - ответ в файл (читать
через Read: терминал портит кириллицу).
Демо-база КД 3.1 как эталон (НАСТОЯТЕЛЬНО)
Если доступна демо-база КД 3.1 (типовая поставка содержит готовую конвертацию,
напр. "БП->УП" - сотни ПКО, тысячи ПКС) - использовать ее как ЭТАЛОН заполнения
правил, а не угадывать. Демо идентична рабочей ИБ по структуре метаданных. Перед
созданием своего ПКО/ПКС снять образец аналогичного правила из демо (Код, как
заполнены ОбъектКонфигурации/ОбъектФормата, паттерн _Отправка/_Получение, как
оформлены прямые vs алгоритмические ПКС, ссылочные через ПравилоКонвертацииСвойства).
Порт демо задается при запуске ее toolkit (порт toolkit уточнять по своей
конфигурации). Чтение демо - KD31_PORT=<порт> bash scripts/kd31_query.sh "...".
Базовая проверка готовности
curl -s -o /dev/null -w "%{http_code}\n" "http://localhost:6011/api/get_metadata?type=Configuration" # 200
bash scripts/kd31_query.sh "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК К ИЗ Справочник.Конвертации"
bash scripts/kd31_query.sh "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК К ИЗ Справочник.Релизы"
# Релизы=0 -> структура конфигурации не загружена; для расширения проверить ЕстьРасширения
bash scripts/kd31_query.sh "ВЫБРАТЬ Наименование, ЕстьРасширения ИЗ Справочник.Релизы ГДЕ НЕ ЭтоГруппа"
Связанные скиллы
1c-mcp-toolkit- HTTP API к живой ИБ 1С (этот скилл - надстройка).kd2-rules- аналог для КД 2.0 (та же идея, другой результат - XML-правила).composing-1c-queries- синтаксис запросов для execute_query.
Files (claude-code-skills-1c)
-
references
-
bsl-templates.md 21.6 KB
# BSL-шаблоны для execute_code (КД 3.1, toolkit :6011) Серверный контекст, результат через `Результат`. Кириллицу слать payload-файлом (`scripts/kd31_exec.sh`), ответ читать из файла через Read. Считать количество - запросом (не `Количество()`). ПКС - справочник. Реквизиты в шаблонах выверены по EDT-эталону (`data-schema.md`). Перед применением проверить на тестовой копии, снять защиту, сверить перечисления. КРИТИЧНО по владельцам: ПКО/ПОД/ПКПД - **топ-уровневые** (без Владельца). Связь с Конвертацией - запись справочника `СоставыКонвертаций` (Владелец=Конвертация, `ЭлементКонвертации`=ссылка на правило). Только **ПКС** подчинен: Владелец=ПКО. ## Инспекция структуры (надежный однострочный паттерн) ```bsl С = ""; Для Каждого М Из Метаданные.Справочники Цикл С = С + М.Имя + ","; КонецЦикла; Результат = С; ``` Реквизиты объекта: ```bsl С = ""; Для Каждого Р Из Метаданные.Справочники.ПравилаКонвертацииОбъектов.Реквизиты Цикл С = С + Р.Имя + ","; КонецЦикла; Результат = С; ``` Сохранять ответ в файл (`kd31_exec.sh script.bsl out.json`) и читать через Read. ## Количество и состояние (execute_query) ```sql ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК К ИЗ Справочник.Конвертации ``` ```sql ВЫБРАТЬ Наименование, ТипКонвертации, ИнтерфейсКонвертации, Статус, Конфигурация, КонфигурацияКорреспондент, ВерсияФорматаМенеджера ИЗ Справочник.Конвертации ГДЕ НЕ ЭтоГруппа ``` `Конфигурация`/`КонфигурацияКорреспондент` (ссылки на Релизы) пусты -> Релиз не привязан. ## Правила, входящие в конвертацию (через СоставыКонвертаций) ПКО/ПОД/ПКПД не имеют Владельца - их связь с конвертацией идет через `СоставыКонвертаций`. `ЭлементКонвертации` - составной тип (ПКО/ПОД/ПКПД/Алгоритмы/Запросы). ```sql ВЫБРАТЬ Состав.ЭлементКонвертации КАК Правило, Состав.Отключить ИЗ Справочник.СоставыКонвертаций КАК Состав ГДЕ Состав.Владелец.Наименование = &Конв ``` Только ПКО (фильтр по типу значения ссылки): ```sql ВЫБРАТЬ Состав.ЭлементКонвертации КАК ПКО ИЗ Справочник.СоставыКонвертаций КАК Состав ГДЕ Состав.Владелец.Наименование = &Конв И ВЫРАЗИТЬ(Состав.ЭлементКонвертации КАК Справочник.ПравилаКонвертацииОбъектов) ЕСТЬ НЕ NULL ``` Свойства ПКС читаются по Владельцу=ПКО (ПКС иерархичен - ЭтоГруппа есть; ПКО НЕ иерархичен - у ПКО ЭтоГруппа НЕТ): ```sql ВЫБРАТЬ ПКС.СвойствоКонфигурации, ПКС.СвойствоФормата, ПКС.Поиск, ПКС.ПравилоКонвертацииСвойства ИЗ Справочник.ПравилаКонвертацииСвойств КАК ПКС ГДЕ ПКС.Владелец = &ПКО ``` ## Создание ПКО (топ-уровневый) и включение в конвертацию ВАЖНО (эталон демо КД 3.1, конвертация БП->УП): у ПКО **НЕТ реквизита Наименование** и ПКО **НЕ иерархичен** (нет ЭтоГруппа). Идентификатор правила хранится в **Коде** (`Справочник_Номенклатура_Отправка`). Искать ПКО по Коду (НайтиПоКоду), не по Наименованию. Паттерн: на объект создается **2 ПКО - отдельно _Отправка и _Получение** (НЕ одно ПКО на оба направления): - `<Объект>_Отправка`: ИспользоватьДляОтправки=Истина. - `<Объект>_Получение`: ИспользоватьДляПолучения=Истина, ВариантИдентификации=ПоУникальномуИдентификатору. Предусловие: загружен Релиз (есть Объекты), загружен формат (есть ОбъектыФормата). `Объекты` подчинены `Релизы` - искать с Владельцем=Релиз (`Конв.Конфигурация`). ```bsl Конв = Справочники.Конвертации.НайтиПоНаименованию("Демо_РасширениеEnterpriseData"); ОбъКонф = Справочники.Объекты.НайтиПоНаименованию("СправочникСсылка.Номенклатура", Истина, , Конв.Конфигурация); // ПКО _Отправка - топ-уровневый, идентификатор в Коде (Наименования НЕТ) ПКО = Справочники.ПравилаКонвертацииОбъектов.СоздатьЭлемент(); ПКО.Код = "Справочник_Номенклатура_Отправка"; // идентификатор правила ПКО.ОбъектКонфигурации = ОбъКонф; // CatalogRef.Объекты (НЕ строка) ПКО.ОбъектФормата = "Справочник.Номенклатура"; // String (имя объекта формата) ПКО.ИспользоватьДляОтправки = Истина; ПКО.ТипКонвертации = Перечисления.ТипыКонвертаций.XDTO; ПКО.Записать(); // ПКО _Получение - отдельная запись ПКОПолуч = Справочники.ПравилаКонвертацииОбъектов.СоздатьЭлемент(); ПКОПолуч.Код = "Справочник_Номенклатура_Получение"; ПКОПолуч.ОбъектКонфигурации = ОбъКонф; ПКОПолуч.ОбъектФормата = "Справочник.Номенклатура"; ПКОПолуч.ИспользоватьДляПолучения = Истина; ПКОПолуч.ТипКонвертации = Перечисления.ТипыКонвертаций.XDTO; ПКОПолуч.ВариантИдентификации = Перечисления.ВариантыИдентификацииОбъектов.ПоУникальномуИдентификатору; ПКОПолуч.Записать(); // Включение каждого ПКО в конвертацию - запись СоставыКонвертаций (Владелец=Конвертация) Сост = Справочники.СоставыКонвертаций.СоздатьЭлемент(); Сост.Владелец = Конв; Сост.ЭлементКонвертации = ПКО.Ссылка; // составной тип; аналогично для ПКОПолуч Сост.Записать(); Результат = XMLСтрока(ПКО.Ссылка); ``` Значения `ВариантыИдентификацииОбъектов`: `ПоУникальномуИдентификатору`, `ПоПолямПоиска`, `СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска`. `ТипыКонвертаций`: `XML`, `XDTO`. ## Создание ПКС (Владелец=ПКО) Внимание к типам: `СвойствоКонфигурации` - ссылка (CatalogRef.Свойства), а `СвойствоФормата` и `ПравилоКонвертацииСвойства` - **строки**. `ПравилоКонвертацииСвойства` для ссылочного свойства = **Код целевого ПКО строкой** (напр. "Справочник_Контрагенты", "Перечисление_СтавкиНДС") - эталон демо. Паттерн демо: в ПКО _Отправка часть ПКС идет БЕЗ СвойствоКонфигурации (null) + ИспользуетсяАлгоритмКонвертации=Истина (значение кладет алгоритм ПКО ПриОтправкеДанных). Прямые ПКС - со ссылкой СвойствоКонфигурации. ```bsl СвКонф = Справочники.Свойства.НайтиПоНаименованию("Артикул", Истина, , ОбъКонф); // Прямое ПКС: свойство конфигурации <-> свойство формата ПКС = Справочники.ПравилаКонвертацииСвойств.СоздатьЭлемент(); ПКС.Владелец = ПКО.Ссылка; // ПКС подчинен ПКО ПКС.СвойствоКонфигурации = СвКонф; // CatalogRef.Свойства ПКС.СвойствоФормата = "Артикул"; // String (имя свойства формата) ПКС.Поиск = Ложь; // Истина - поле поиска // ссылочное свойство: ПКС.ПравилоКонвертацииСвойства = "Справочник_Контрагенты"; // Код ПКО строкой ПКС.Записать(); Результат = XMLСтрока(ПКС.Ссылка); ``` Алгоритмическое ПКС (значение формирует алгоритм, СвойствоКонфигурации не задаем): ```bsl ПКСа = Справочники.ПравилаКонвертацииСвойств.СоздатьЭлемент(); ПКСа.Владелец = ПКО.Ссылка; ПКСа.СвойствоФормата = "Демо_СтатусИзУНФ"; // только свойство формата ПКСа.ИспользуетсяАлгоритмКонвертации = Истина; ПКСа.АлгоритмПередВыгрузкойСвойства = "Значение = ДанныеИБ.Демо_СтатусИзУНФ;"; ПКСа.Записать(); ``` Алгоритмы ПКС (строки BSL): `АлгоритмПередВыгрузкойСвойства`, `АлгоритмПриВыгрузкеСвойства`, `АлгоритмПослеВыгрузкиСвойства`, `АлгоритмПередОбработкойВыгрузки`, `АлгоритмПослеОбработкиВыгрузки`. ## Привязка версии формата (в т.ч. расширения) к Конвертации В ТЧ `Конвертации.ВерсииФормата` единственный реквизит - `ВерсияФормата` (ссылка на Справочник.ВерсииФормата). ```bsl ВерсияРасш = Справочники.ВерсииФормата.НайтиПоНаименованию("Расширение Демо 1.0"); Об = Конв.ПолучитьОбъект(); Найдено = Ложь; Для Каждого Стр Из Об.ВерсииФормата Цикл Если Стр.ВерсияФормата = ВерсияРасш Тогда Найдено = Истина; КонецЕсли; КонецЦикла; Если НЕ Найдено Тогда НоваяСтр = Об.ВерсииФормата.Добавить(); НоваяСтр.ВерсияФормата = ВерсияРасш; Об.Записать(); КонецЕсли; Результат = "ok"; ``` ## Чтение алгоритма ПКО (для анализа) ПКО искать по Коду (Наименования нет): ```bsl ПКО = Справочники.ПравилаКонвертацииОбъектов.НайтиПоКоду("Справочник_Номенклатура_Отправка"); Результат = "ОТПРАВКА: " + ПКО.АлгоритмПриОтправкеДанных + " || ПОЛУЧЕНИЕ: " + ПКО.АлгоритмПриПолученииДанных; ``` ## Эталон: чтение готовых правил из демо-базы КД 3.1 Демо-база типовой поставки идентична рабочей ИБ по структуре и содержит готовую конвертацию "БП->УП" (сотни ПКО, тысячи ПКС) - эталон заполнения. Снять образец: ```sql ВЫБРАТЬ ПЕРВЫЕ 5 Код, ОбъектКонфигурации, ОбъектФормата, ИспользоватьДляОтправки, ИспользоватьДляПолучения, ВариантИдентификации ИЗ Справочник.ПравилаКонвертацииОбъектов ГДЕ ОбъектФормата = "Справочник.Номенклатура" ``` ПКС конкретного ПКО (через Владелец.ОбъектФормата): ```sql ВЫБРАТЬ ПЕРВЫЕ 12 ПКС.СвойствоКонфигурации, ПКС.СвойствоФормата, ПКС.Поиск, ПКС.ПравилоКонвертацииСвойства, ПКС.ИспользуетсяАлгоритмКонвертации ИЗ Справочник.ПравилаКонвертацииСвойств КАК ПКС ГДЕ ПКС.Владелец.ОбъектФормата = "Справочник.Номенклатура" ``` Перед созданием своих правил - сверять структуру с демо, а не угадывать. ## Версия формата расширения (создание заготовки) `ВерсииФормата` - топ-уровневый справочник. Реквизиты: `ПространствоИмен` (String), `Расширение` (Boolean), `ДоступенЗапросНаВыгрузку` (Boolean). Реквизита `НомерВерсии` НЕТ (версия живет в Наименовании и в URI пространства имен). ```bsl ВФ = Справочники.ВерсииФормата.СоздатьЭлемент(); ВФ.Наименование = "Расширение Демо 1.0"; ВФ.ПространствоИмен = "http://example.com/edi/DemoExtension/1.0"; // не URIПространстваИмен ВФ.Расширение = Истина; ВФ.Записать(); Результат = XMLСтрока(ВФ.Ссылка); ``` (проверить наличие перед созданием). ## Загрузка структуры конфигурации headless Форма `ЗагрузкаСтруктурыКонфигурацииИзФайловXML` собирает файлы и запускает фон. Реальный парсер - экспортный метод менеджера, вызывается из `execute_code`: ``` Обработки.ЗагрузкаСтруктурыКонфигурацииИзФайловXML.ВыполнитьЗагрузкуМетаданных(СтруктураПараметров, АдресРезультата) ``` `СтруктураПараметров` (метод формы `ВыполнитьЗагрузкуСервер`): `СпособЗагрузки` (0=новый Релиз), `ПомещенныеФайлы` (массив структур `{ПолноеИмя, Хранение=путь к файлу на сервере, ЭтоРасширение}`), `ИмяНовойКонфигурации`, `Конфигурация`, `ИсточникДанных`, `ВариантЗагрузкиДвижений`, `ТолькоОбновитьПланыОбмена`, `ТолькоДобавлятьНовые`, `ЕстьРасширения`, `ИмяКаталогаЗагрузки`, `КаталогиРасширений` (если есть расширения). Поддерживается формат EDT напрямую (ридеры `ПрочитатьСведенияОбОбъектеИзEDT`/`ПрочитатьСведенияОСвойствахИзEDT`). ЗАГРУЗКА С РАСШИРЕНИЕМ КОНФИГУРАЦИИ: ЕстьРасширения=Истина; у .mdo расширения в ПомещенныеФайлы ставить ЭтоРасширение=Истина; КаталогиРасширений=[каталог расширения]. Без этого Демо-реквизиты не попадут в теневую модель (Справочник.Свойства) и ПКС для них не создать. ВАЖНО: загрузчик в конце делает `УдалитьФайлы(Хранение)` по каждому файлу - грузить из ВРЕМЕННОЙ копии (robocopy), НЕ из EDT-оригиналов (снесет исходники). Большая конфигурация -> фоновое задание (`ДлительныеОперации.ВыполнитьВФоне`) с опросом состояния. Опрос НЕ по счетчикам (объекты стабилизируются задолго до конца - идет длинная фаза заполнения типов), а по `ФоновыеЗадания.НайтиПоУникальномуИдентификатору(JobID).Состояние`. Делать на тестовой копии КД. Детали - `methods.md`. ## Загрузка базового формата EnterpriseData headless `Обработки.ЗагрузкаСтруктурыФормата.ВыполнитьЗагрузкуФормата(СП, Адрес)` - строит фабрику XDTO из XSD-ФАЙЛОВ и создает ОбъектыФормата/СвойстваФормата/ЗначенияФормата. Нужен XSD стандартного вида (`xs:schema`), НЕ внутренний `Package.xdto` EDT. Источник XSD: выгрузить XDTO-пакет EnterpriseData из УНФ через Конфигуратор (XDTO-пакет -> Выгрузить в файл XSD) + вспомогательный ExchangeMessage.xsd. ```bsl ДанныеДляЗагрузки = Новый Массив; ДанныеДляЗагрузки.Добавить("E:\...\ExchangeMessage.xsd"); // вспомогательный пакет Message ДанныеДляЗагрузки.Добавить("E:\...\EnterpriseData_1_22_1.xsd"); // основной (с xs:import первым) СП = Новый Структура; СП.Вставить("СпособЗагрузки", 0); СП.Вставить("ВерсияФормата", Справочники.ВерсииФормата.ПустаяСсылка()); СП.Вставить("ДобавлятьТолькоНовые", Ложь); СП.Вставить("ЭтоРасширение", Ложь); // Истина - для XSD расширения формата СП.Вставить("ИмяОсновногоПакетаXDTO", "http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.22"); СП.Вставить("РодительВерсии", Справочники.ВерсииФормата.ПустаяСсылка()); СП.Вставить("ШаблонПространстваИмен", "http://v8.1c.ru/edi/edi_stnd/EnterpriseData"); СП.Вставить("НомерВерсииФормата", "1.22"); СП.Вставить("ДанныеДляЗагрузки", ДанныеДляЗагрузки); Адрес = ПоместитьВоВременноеХранилище(Неопределено); Обработки.ЗагрузкаСтруктурыФормата.ВыполнитьЗагрузкуФормата(СП, Адрес); Рез = ПолучитьИзВременногоХранилища(Адрес); Результат = "Успех=" + Строка(Рез.Успех); ``` Распознавание основного пакета: загрузчик считает ОСНОВНЫМ тот XSD, где сразу за `xs:schema` идет `xs:import` (импорт Message). targetNamespace этого файла = `ИмяОсновногоПакетаXDTO`. XSD расширения формата (namespace Демо) грузить отдельно с `ЭтоРасширение=Истина` - создаст связь base<->расширение в РегистрСведений.ВзаимосвязиВерсийФорматовИРасширений. ОГРАНИЧЕНИЕ Gateway Timeout: тяжелый синхронный execute_code (формат ~1.2МБ XSD) дает HTTP `{"error":"Gateway Timeout"}` от прокси, НО на стороне 1С операция ЗАВЕРШАЕТСЯ. Проверять РЕЗУЛЬТАТ отдельным запросом (КОЛИЧЕСТВО ОбъектыФормата), НЕ доверять HTTP-ответу. Не запускать повторно "на всякий случай" - создаст дубль/ошибку. -
data-schema.md 26.2 KB
# Объектная модель КД 3.1 (выверено по EDT) Источник: метаданные КД 3.1 (3.1.6.14, платформа 8.5.1.1302) через EDT MCP. Имена, **типы** реквизитов, владельцы и табличные части получены через EDT MCP (`get_metadata_details full`). Это эталон, заменивший прежние данные из toolkit (toolkit искажал кириллицу и не давал типы). Модель КД 3.1 близка к КД 2.0 (теневая модель метаданных + справочники правил), плюс слой формата EnterpriseData. Результат разработки - не XML-правила, а модуль менеджера обмена (BSL) + версия/пакет формата (XSD). XML-правила для "Универсального обмена" - это КД 2.0 (скилл `kd2-rules`). ## Карта владельцев - ключ к созданию правил | Справочник | Владелец | Иерарх. | |---|---|---| | `Конвертации` | нет (топ) | да, 2 ур. | | `СоставыКонвертаций` | `Конвертации` | нет | | `ПравилаКонвертацииОбъектов` (ПКО) | **нет (топ)** | нет | | `ПравилаКонвертацииСвойств` (ПКС) | **ПКО** | да, 2 ур. | | `ПравилаОбработкиДанных` (ПОД) | **нет (топ)** | нет | | `ПравилаКонвертацииПредопределенныхДанных` (ПКПД) | **нет (топ)** | нет | | `Регистрации` | нет (топ) | - | | `ПравилаРегистрацииОбъектов` (ПРО) | `Регистрации` | - | | `Конфигурации` | нет (топ) | нет | | `Релизы` | нет (топ) | да | | `Объекты` | **`Релизы`** | да, 2 ур. | | `Свойства` | `Объекты` | да, 2 ур. | | `Значения` | `Объекты` | да | | `ВерсииФормата` | нет (топ) | да, 2 ур. | | `ОбъектыФормата` | `ВерсииФормата` | да, 2 ур. | | `СвойстваФормата` | `ОбъектыФормата` | да, 2 ур. | | `ТипыФормата` | `ВерсииФормата` | нет | | `ЗначенияФормата` | `ОбъектыФормата`, `СвойстваФормата` | нет | КРИТИЧНО: ПКО/ПОД/ПКПД - **топ-уровневые, без Владельца**. С конкретной Конвертацией связываются записью справочника `СоставыКонвертаций` (Владелец=Конвертации, реквизит `ЭлементКонвертации` - ссылка на правило). Только ПКС подчинен - его Владелец=ПКО. У стандартного реквизита Владелец у ПОД остался синоним "Конвертация", но элемент `<owners>` в .mdo не задан - это рудимент, а не реальная подчиненность. ПКС - **отдельный справочник** (как в КД 2.0), не регистр сведений. Обращение `Метаданные.РегистрыСведений.ПравилаКонвертацииСвойств` падает; правильно `Метаданные.Справочники.ПравилаКонвертацииСвойств`. ## Справочник.Конвертации (топ, иерарх.) Пара обмена. Реквизиты (тип): - `ТипКонвертации` - EnumRef.ТипыКонвертаций (значения: `XML`, `XDTO`) - `ИнтерфейсКонвертации` - EnumRef.ВариантыМоделейОбмена (синоним "Интерфейс по модели"; значения `ПакетнаяМодель`/`ОбъектнаяМодель`/`КомбинированнаяМодель`) - `Конфигурация`, `КонфигурацияКорреспондент` - **CatalogRef.Релизы** (не Конфигурации!) - `Статус` - EnumRef.СостоянияПравил (`Черновик`/`ВРаботе`/`НаТестировании`/`Готово`/`Архив`) - `Версия82` - Boolean; `ВерсияФорматаМенеджера` - String; `ВидБазы` - Number - Подключение корреспондента: `ИмяБазыДанных`, `СерверБазыДанных`, `ПользовательБазыДанных`, `ПарольПользователя`, `ПолноеИмяФайловойБазы` - String - `ИспользоватьРазделениеМодуля` - Boolean; `СпособВыгрузкиРазделенногоМодуля` - EnumRef.СпособыВыгрузкиРазделенногоМодуля - `ИспользоватьТипизациюПеременных`, `ГруппироватьПоОбъектамВыгрузки`, `ЗапретитьПереводИменОбъектовФормата` - Boolean - `ИмяФайлаДляСохранения`, `Описание` - String - ~19 алгоритмов-обработчиков (String): `АлгоритмПередВыгрузкойДанных`, `АлгоритмПередКонвертацией`, `АлгоритмПослеЗагрузкиДанных`, `АлгоритмПослеЗагрузкиПравилОбмена` и т.д. Табличные части: - `ВерсииФормата` - реквизит **только** `ВерсияФормата` (CatalogRef.ВерсииФормата). (Реквизитов `ОбъектыСохраненыВоВнешнемФайле`/`ИмяВнешнегоФайла` в этой ТЧ нет.) - `Параметры` - `Параметр`, `ОписаниеПараметра`, `УстанавливатьВДиалоге`, `ИспользуетсяПриЗагрузке`, `ПередаватьПараметрПриВыгрузке`, `ТипОбъекта` (CatalogRef.Объекты), `ПравилоКонвертации` (String), `ВременнаяКопия`. `Конфигурация`/`КонфигурацияКорреспондент` пусты, пока не загружен Релиз. ## Справочник.СоставыКонвертаций (Владелец=Конвертации) Связывает Конвертацию с ее правилами и алгоритмами. - `ЭлементКонвертации` - составной тип: CatalogRef из `ПравилаКонвертацииПредопределенныхДанных`, `ПравилаКонвертацииОбъектов`, `Алгоритмы`, `Запросы`, `ПравилаОбработкиДанных`. - `Отключить` - Boolean. Чтобы правило (ПКО/ПОД/ПКПД) попало в конвертацию, создается запись `СоставыКонвертаций` с Владелец=Конвертация и ЭлементКонвертации=ссылка на правило. ## Справочник.ПравилаКонвертацииОбъектов (ПКО, топ-уровневый) Код (String, 50) = идентификатор правила (представление по коду). Реквизиты: - `ОбъектКонфигурации`, `ОбъектКонфигурацииКорреспондент` - CatalogRef.Объекты - `ОбъектКонфигурацииДляВыгрузкиМодуля` - CatalogRef.Объекты - `ОбъектФормата` - String (имя объекта формата) - `ВариантИдентификации` - EnumRef.ВариантыИдентификацииОбъектов (`ПоУникальномуИдентификатору`/`ПоПолямПоиска`/ `СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска`) - `ТипКонвертации` - EnumRef.ТипыКонвертаций - `ПриоритетОбъектовОбмена` - EnumRef.ПриоритетОбъектовОбмена - `ОтборСобытийXDTOПоМодели` - EnumRef.ВариантыМоделейОбмена - `ДополнительныйМодуль` - CatalogRef.ДополнительныеМодули - `ГруппаПравил` - String (НЕ ссылка; справочника `ГруппыПравил` нет) - Флаги (Boolean): `ИспользоватьДляОтправки`, `ИспользоватьДляПолучения`, `ВыгружатьВМодульМенеджера`, `ВыгружатьОбъектТолькоПриНаличииНаНегоСсылки`, `ГенерироватьНовыйНомерИлиКодЕслиНеУказан`, `ИспользоватьБыстрыйПоискПриЗагрузке`, `НеВыгружатьОбъектыСвойствПоСсылкам`, `НеЗамещать`, `НеЗамещатьОбъектСозданныйВИнформационнойБазеПриемнике`, `НеЗапоминатьВыгруженные`, `НеСоздаватьОбъектВПриемникеЕслиНеНайденПоПолямПоиска`, `ПродолжитьПоискПоПолямПоискаЕслиПоИдентификаторуНеНашли`, `ПравилоДляГруппыСправочника`, `ОбъектСДвижениями`, `Отключить`, `Захвачен`, `Копия`, `ВременнаяКопия`, `ВстроенныйОбработчикПослеЗагрузкиВсехДанных`, `ПриПереносеОбъектаПоСсылкеУстанавливатьТолькоGIUD` - `Порядок` - Number; `Описание` - String - Алгоритмы-обработчики (String): `АлгоритмПриОтправкеДанных`, `АлгоритмПриПолученииДанных`, `АлгоритмПередОтправкойДанных`, `АлгоритмПередПолучениемДанных`, `АлгоритмПриВыгрузкеОбъекта`, `АлгоритмПриЗагрузкеОбъекта`, `АлгоритмПередВыгрузкойОбъекта`, `АлгоритмПередЗагрузкойОбъекта`, `АлгоритмПослеВыгрузкиОбъекта`, `АлгоритмПослеЗагрузкиОбъекта`, `АлгоритмПослеЗагрузкиВсехДанных`, `АлгоритмПослеКонвертацииОбъекта`, `АлгоритмПриУдаленииОбъектаИБ`, `АлгоритмПоследовательностьПолейПоиска` и др. Табличные части: `ИдентификацияПоПолямПоиска` (РеквизитыПоиска), `НастройкаВариантовПоискаОбъектовXML` (ИмяНастройкиДляАлгоритма/ДляПользователя), `Теги` (Тег - CatalogRef.Теги), `УдалитьПравилаКонвертацииСвойств` (устаревшая). `АлгоритмПриОтправкеДанных`/`АлгоритмПриПолученииДанных` - тексты BSL обработчиков конвертации (ИБ <-> XDTO). В генерируемом менеджере становятся процедурами. ## Справочник.ПравилаКонвертацииСвойств (ПКС, Владелец=ПКО, иерарх.) Реквизиты (тип): - `СвойствоКонфигурации`, `СвойствоКонфигурацииКорреспондента` - CatalogRef.Свойства - `СвойствоКонфигурацииСтрокой`, `СвойствоФормата` - String - `ПолноеИмяСвойстваКонфигурации`, `ПолноеИмяСвойстваФормата`, `ПолноеИмяСвойстваКонфигурацииКорреспондента` - String - `ТипСвойстваКонфигурации`, `ТипСвойстваФормата`, `ТипСвойстваКонфигурацииКорреспондента` - String - `ПравилоКонвертацииСвойства` - **String** (имя ПКО для ссылочного свойства, не ссылка) - `Поиск` - Boolean (поле поиска; индексируется) - аналог прежнего "искать по свойству" - `ИспользуетсяАлгоритмКонвертации` - Boolean (включает алгоритм) - `АлгоритмПередВыгрузкойСвойства`, `АлгоритмПриВыгрузкеСвойства`, `АлгоритмПослеВыгрузкиСвойства`, `АлгоритмПередОбработкойВыгрузки`, `АлгоритмПослеОбработкиВыгрузки` - String (тексты BSL) - `НеЗамещать`, `ПоискПоДатеНаРавенство`, `ПолучитьИзВходящихДанных`, `АвтоматическиПриводитьЗначениеКДлинеПриемника`, `ВыгружатьГруппуЧерезФайл`, `Отключить`, `Проверено` - Boolean - `ИмяПараметраДляПередачи`, `Комментарий` - String; `Порядок` - Number - `УсловиеПрименения` - CatalogRef.УсловияПримененияПравил ПКС связывает свойство конфигурации (`СвойствоКонфигурации`) и свойство формата (`СвойствоФормата`, строкой). Для нестандартного заполнения - алгоритм + флаг `ИспользуетсяАлгоритмКонвертации`. ПКС создается как элемент справочника, Владелец=ПКО. ## Справочник.ПравилаОбработкиДанных (ПОД, топ-уровневый) Точки выборки/выгрузки данных. Реквизиты: - `ОбъектВыборки` - составной: String + CatalogRef.Объекты - `ПравилоКонвертацииОбъекта` - String (имя ПКО) - `СпособВыборки` - Number; `ОчисткаДанных` - Boolean - `ТипКонвертации` - EnumRef.ТипыКонвертаций - `ДополнительныйМодуль` - CatalogRef.ДополнительныеМодули - `РасположениеОбработчиков` - String; `ГруппаПравил` - String - Флаги: `ИспользоватьДляОтправки`, `ИспользоватьДляПолучения`, `ВыбиратьДанныеДляВыгрузкиОднимЗапросом`, `НеВыгружатьОбъектыСозданныеВБазеПриемнике`, `ВыгружатьВМодульМенеджера`, `Отключить`, `Захвачен`, `Копия`, `ВременнаяКопия` - `ОбъектКонфигурацииДляВыгрузкиМодуля` - CatalogRef.Объекты - `Порядок` - Number; `Комментарий`, `Описание` - String - Алгоритмы (String): `АлгоритмВыборкаДанных`, `АлгоритмПриОбработке`, `АлгоритмПередОбработкойПравила`, `АлгоритмПослеОбработкиПравила`, `АлгоритмПередВыгрузкойОбъекта`, `АлгоритмПослеВыгрузкиОбъекта` ТЧ: `ПравилаКонвертацииОбъектов` (ПравилоКонвертацииОбъекта - String), `Теги`. Свойство `Основание` (BasedOn) = ПКО (можно вводить ПОД на основании ПКО). ## Справочник.ПравилаКонвертацииПредопределенныхДанных (ПКПД, топ-уровневый) - `ОбъектКонфигурации`, `ОбъектКонфигурацииКорреспондент` - CatalogRef.Объекты - `ОбъектФормата` - String - `ТипКонвертации` - EnumRef.ТипыКонвертаций - `ГруппаПравил` - String; `Порядок` - Number - `ИспользоватьДляОтправки`, `ИспользоватьДляПолучения`, `Захвачен`, `Копия`, `ВременнаяКопия` - Boolean - Алгоритмы (String): `АлгоритмПередВыгрузкойОбъекта`, `АлгоритмПриВыгрузкеОбъекта`, `АлгоритмПослеВыгрузкиОбъекта`, `АлгоритмПослеВыгрузкиОбъектаВФайлОбмена`, `АлгоритмПередЗагрузкойОбъекта`, `АлгоритмПриЗагрузкеОбъекта`, `АлгоритмПослеЗагрузкиОбъекта` ТЧ: `СопоставлениеЗначений` (`ЗначениеКонфигурации`, `ЗначениеФормата`, `ЗначениеКонфигурацииКорреспондент` - String; `Тег` - CatalogRef.Теги; `УсловиеПрименения` - CatalogRef.УсловияПримененияПравил), `Теги`. ## Теневая модель метаданных ### Справочник.Конфигурации (топ-контейнер) Реально только `УдалитьТегВырезки` (String, устаревший) + ТЧ `УдалитьПодчиненныеКонфигурации` (устаревшая). Это просто контейнер; версии и структура живут в Релизах, которые ссылаются на Конфигурацию. ### Справочник.Релизы (топ) Версия загруженной структуры конфигурации. - `КонфигурацияВладелец` - CatalogRef.Конфигурации (ShowError) - `Версия`, `Имя`, `Синоним`, `Комментарий` - String - `Приложение` - EnumRef.Приложения; `ИсточникДанных`, `ВариантЗагрузкиДвижений` - Number - `ЕстьРасширения`, `ОбновлятьМетаданныеПоРасписанию` - Boolean - `ДатаОбновления` - Date - Git-поля (String): `АдресGitСервера`, `ИмяВеткиРепозитория`, `КаталогGitРепозитория` - `КаталогЗагрузки`, `РегламентноеЗаданиеGUID` - String - ТЧ `Расширения` (`ИмяКаталогаЗагрузки` - String) Релизов 0 -> структура конфигурации не загружена, привязывать правила не к чему. ### Справочник.Объекты (Владелец=Релизы, иерарх.) - `Имя`, `Синоним`, `Комментарий` - String - `Тип` - **EnumRef.ТипыОбъектов** (не строка) - `Иерархический`, `ОграничиватьКоличествоУровней`, `КонтрольУникальности`, `АвтоНумерация`, `Подчиненный` - Boolean - `ВидИерархии`, `СерииКодов`, `Периодичность` - String; `КоличествоУровней` - Number - `Идентификатор` - String (индекс) - `ОбъектВышестоящегоРелиза` - CatalogRef.Объекты ### Справочник.Свойства (Владелец=Объекты, иерарх.) - `Синоним`, `Комментарий`, `Использование`, `ТипыСтрокой`, `Подсказка` - String - `Вид` - EnumRef.ВидыСвойств; `ВариантИндексирования` - EnumRef.ВариантыИндексирования - `Индексирование`, `Авторегистрация` - Boolean - Квалификаторы: `КвалификаторыЧисла_Длина`/`_Точность` - Number, `КвалификаторыЧисла_Неотрицательное` - Boolean, `КвалификаторыСтроки_Длина` - Number, `КвалификаторыСтроки_Фиксированная` - Boolean, `КвалификаторыДаты_Состав` - String - `Идентификатор` - String (индекс); `СвойствоВышестоящегоРелиза` - CatalogRef.Свойства - ТЧ `Типы` (`Тип` - CatalogRef.Объекты) ### Справочник.Значения (Владелец=Объекты, иерарх.) Значения перечислений/предопределенные. `Синоним`, `Комментарий` - String; `Предопределенное` - Boolean; `Идентификатор` - String. ТЧ `Типы` (Тип - CatalogRef.Объекты). ## Слой формата EnterpriseData Это **цепочка справочников** (не табличные части ВерсииФормата!). ### Справочник.ВерсииФормата (топ, иерарх.) - `ПространствоИмен` - String (namespace; НЕ "URIПространстваИмен") - `Расширение` - Boolean (признак: версия-расширение формата) - `ДоступенЗапросНаВыгрузку` - Boolean - **Табличных частей нет.** Состав формата - в подчиненных справочниках ниже. Расширение формата = запись ВерсииФормата с `Расширение=Истина` и своим `ПространствоИмен`. ### Справочник.ОбъектыФормата (Владелец=ВерсииФормата, иерарх.) Наименование = имя объекта формата. `ЭтоГруппаОбщихСвойств` - Boolean; `ТипОбщегоРеквизита` - EnumRef.ТипыОбщихРеквизитов; `ПереносОписанийВыполнен` - Boolean. ### Справочник.СвойстваФормата (Владелец=ОбъектыФормата, иерарх.) - `Тип`, `ОбъектХранительСвойств` - String - `Обязательное`, `СоставнойТип` - Boolean; `Порядок`, `НижняяГраница` - Number - `ТипОбщегоСвойства` - EnumRef.ТипыОбщихРеквизитов - ТЧ `Состав` (`ТипФормата`, `ИмяТипа` - String), `Фасеты` (`ВидФасета`, `ЗначениеФасета` - String) ### Справочник.ТипыФормата (Владелец=ВерсииФормата) `БазовыйТип`, `ПространствоИмен`, `ПространствоИменБазовогоТипа` - String; `СоставнойТип` - Boolean. ТЧ `Состав`, `Фасеты`. ### Справочник.ЗначенияФормата (Владелец=ОбъектыФормата, СвойстваФормата) `Комментарий` - String, `Порядок` - Number. ## Обработки КД 3.1 (фактические имена; всего 63) | Обработка | Назначение | |---|---| | `ЗагрузкаСтруктурыКонфигурацииИзФайловXML` | загрузить структуру из XML/EDT -> Релиз + Объекты/Свойства | | `ЗагрузкаСтруктурыКонфигурации` | загрузка структуры старых версий (7.7, 8.0) | | `ВыгрузкаСтруктурыФормата` / `ЗагрузкаСтруктурыФормата` | работа со структурой формата ED | | `ДеревоОбъектовФормата` | редактор дерева объектов формата | | `НастройкаПравилОбмена` | основной редактор/мастер правил | | `НастройкаПравилКонвертацииСвойств` | редактор ПКС | | `АвтогенерацияПравилКонвертацииXML` | автонастройка правил | | `ВыгрузкаМодуля` | **генерация модуля менеджера обмена (BSL)** | | `ВыгрузкаКонвертацииXML` / `ЗагрузкаКонвертацииXML` | выгрузка/загрузка правил в XML | | `СохранитьКомплектПравилXML` | сохранить комплект правил | | `ЗагрузкаМодуляМенеджера` | загрузка конвертации XDTO (готовый модуль менеджера) | | `ПроверкаКонвертации` | проверка правил | | `СравнениеВерсийФормата` | сравнение версий формата | | `КопированиеСоставаКонвертаций` | копирование состава конвертации | | `ПомощникСозданияОбменаДанными` | мастер настройки синхронизации | | `КонвертацияОбъектовXDTO` | движок конвертации XDTO | | `ВыполнениеОбменаДанными` | выполнение обмена | | `ВыгрузкаЗагрузкаEnterpriseData` | выгрузка/загрузка EnterpriseData | Имен `ВыгрузкаПравил`, `ПодключениеКорреспондента`, `ПомощникСозданияФорматаXDTO` в сборке нет. ## Общие модули движка конвертации (потребители генерируемого менеджера) `КонвертацияДанныхXDTOСервер`, `КонвертацияДанныхXDTOВызовСервера`, `КонвертацияДанныхXDTOКлиент`, `ОбменДаннымиКонвертацияДанныхXDTO`, `ОбменДаннымиСобытияКонвертацияДанныхXDTO`, `НастройкиКонвертацииВызовСервера`, `НастройкиКонвертацииПовтИсп`, `ОбновлениеИнформационнойБазыКонвертацияДанныхXDTO`. Генерируемый модуль менеджера обмена работает поверх этого движка (`ОбменДаннымиXDTO`). -
format-extension.md 8.7 KB
# Расширение формата EnterpriseData в КД 3.1 + workflow Цель: получить артефакты для расширения формата ED на стороне приемника (например УНФ): **модуль менеджера обмена** (общий модуль BSL с правилами) и **XSD-пакет/версию формата расширения** (собственный namespace поверх базового ED). Состав формата можно только расширять (добавлять свойства/типы), не удалять и не переименовывать существующее. ## End-to-end workflow Шаги со звездочкой (*) штатно делаются через формы обработок КД 3.1; toolkit там помогает инспектировать состояние до/после и при возможности вызвать методы. 1. **Загрузить структуру конфигурации-приемника.** Обработка `ЗагрузкаСтруктурыКонфигурацииИзФайловXML` создает `Релиз` и заполняет `Объекты`/`Свойства`. Можно через форму, но есть и **headless-путь** через экспортный метод `ВыполнитьЗагрузкуМетаданных` + фоновое задание - подробный рецепт в `methods.md` п.1 (поддерживает формат EDT-исходников напрямую, без выгрузки в XML Конфигуратора). Проверка: `ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Релизы`. 2. **Привязать Релиз к Конвертации.** Поля `Конфигурация` и `КонфигурацияКорреспондent` Конвертации = ссылка на загруженный Релиз (для двустороннего УНФ-УНФ - один и тот же Релиз). Можно через toolkit (правка реквизитов после загрузки структуры). 3. **Подготовить базовый формат ED и расширение.** Базовая версия формата ED (например 1.10) и расширение - записи справочника `ВерсииФормата` (расширение - с `Расширение=Истина` и своим `ПространствоИмен`, см. bsl-templates). Состав формата хранится НЕ в табличных частях, а в цепочке подчиненных справочников: `ВерсииФормата` -> `ОбъектыФормата` (Владелец=ВерсииФормата) -> `СвойстваФормата` (Владелец=ОбъектыФормата) -> `ЗначенияФормата`; типы - `ТипыФормата` (Владелец=ВерсииФормата). Добавляемые объекты/свойства расширения создаются как элементы этих справочников под записью ВерсииФормата с `Расширение=Истина`. Привязать версии формата к Конвертации через ТЧ `Конвертации.ВерсииФормата` (реквизит `ВерсияФормата`). 4. **Наполнить правила (*).** `НастройкаПравилОбмена` / `НастройкаПравилКонвертацииСвойств`: ПКО (ОбъектКонфигурации <-> ОбъектФормата), ПКС (свойства, включая Демо_-поля расширения), ПОД (точки выгрузки), ПКПД (предопределенные/перечисления). Простые ПКО/ПКС можно создавать и через toolkit как элементы справочников (см. bsl-templates), нестандартную логику - в алгоритмах ПКО (`АлгоритмПриОтправкеДанных`, `АлгоритмПриПолученииДанных`). 5. **Сгенерировать артефакты.** Обработка `ВыгрузкаМодуля` формирует модуль менеджера обмена. Headless-вызов через экспортный `ВыполнитьВыгрузкуМодулей` + `ПодготовитьНастройкиВыгрузкиМодулей` - см. `methods.md` п.2. Структура формата выгружается как XSD (`ВыгрузкаСтруктурыФормата` / штатная выгрузка пакета). 6. **Перенести в расширение приемника.** XSD -> `XDTOPackage`, BSL -> `CommonModule` в расширении конфигурации (например УНФ). 7. **Зарегистрировать расширение формата на стороне приемника.** Перехват типовой процедуры в `ОбменДаннымиПереопределяемый`: ```bsl &После("ПриПолученииДоступныхРасширенийФормата") Процедура <Преф>_ПриПолученииДоступныхРасширенийФормата(РасширенияФормата) РасширенияФормата.Вставить("<URI расширения>", "<версия базового ED>"); КонецПроцедуры ``` Перехват по имени процедуры, не по строке (устойчиво к обновлениям). ## Обработчики ПКО в генерируемом менеджере - Отправка (ИБ -> XDTO): процедура вида `ПКО_<Имя>_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)` - заполнить `ДанныеXDTO` из `ДанныеИБ`, включая поля расширения. - Получение (XDTO -> ИБ): `ПриКонвертацииДанныхXDTO(ДанныеXDTO, ПолученныеДанные, КонвертацияСвойств, КомпонентыОбмена)` - заполнить объект ИБ. Для ссылочного свойства с динамическим выбором правила значение - структура `Новый Структура("Значение, ИмяПКО", Ссылка, "<ИмяПКО>")`. Табличную часть через алгоритм - заполнить таблицу значений и `ДанныеXDTO.Вставить("<ИмяТЧ>", Таб)`. ## Пример конкретного проекта Иллюстрация привязки к реальной задаче (двусторонний обмен 7.7 <-> УНФ). Значения специфичны для проекта - в переиспользуемом сценарии заменять своими. - Конвертация: `Демо_РасширениеEnterpriseData` (заготовка в ИБ КД 3.1). - URI расширения: `http://example.com/edi/DemoExtension/1.0`; версия формата "Расширение Демо 1.0" (`Расширение=Истина`). - Базовый формат: EnterpriseData (целевая версия 1.10). - Целевые артефакты: `XDTOPackage.Демо_РасширениеФормата_1_0` + `CommonModule.Демо_МенеджерОбменаРасширение` в расширении УНФ `Демо_УНФ_3.Демо`. - Объекты: Catalog.Номенклатура, Catalog.Контрагенты, Document.РасходнаяНакладная, ПриходнаяНакладная, ПеремещениеЗапасов, МаршрутныйЛист, КорректировкаРеализации, КорректировкаПоступления. - В чистой КД (Релизов=0) загрузка структуры - первый шаг workflow. - Контракт формата и план разработки - в документах проекта (`Контракт обмена XML 7.7-УНФ.md`, `План разработки правил обмена XSD и менеджеров 7.7-УНФ.md`). ## Эволюция схемы Новые поля расширения добавлять как необязательные. Изменение XDTO-пакета на стороне приемника требует реструктуризации ИБ - планировать как обновление, не горячую правку. -
methods.md 14.4 KB
# Программный API обработок КД 3.1 (что вызывается headless) Соответствует коду форменных обработок КД 3.1 (3.1.6.14). Форменные обработки КД делают тяжелую работу НЕ в форме, а в экспортных методах ManagerModule/ObjectModule (форма лишь собирает входные данные и запускает фон). Поэтому ключевые шаги вызываемы через `:6011` execute_code, минуя UI. file:line - для чтения исходника при необходимости. Общий прием headless-вызова форменной обработки: 1. `get_module_structure` модуля формы -> найти серверный метод кнопки (`Выполнить*Сервер`). 2. Прочитать его -> увидеть реальный вызов (Export-метод Manager/Object или `ДлительныеОперации.ВыполнитьВФоне("Обработки.X.Метод", Параметры)`). 3. Собрать параметры и вызвать метод. Тяжелые операции (большая конфигурация) - через фон с опросом, не синхронно (иначе таймаут toolkit). ## 1. ЗагрузкаСтруктурыКонфигурацииИзФайловXML - загрузка структуры (-> Релиз/Объекты/Свойства) Заполняет теневую модель (Релиз + Объекты + Свойства + Значения) из исходников конфигурации. Поддерживает форматы XML-дампа Конфигуратора И EDT. Экспортный метод (вызывается фоном из формы): - `ВыполнитьЗагрузкуМетаданных(ОбщиеПеременные, АдресВременногоХранилища)` Export - `DataProcessors/ЗагрузкаСтруктурыКонфигурацииИзФайловXML/ManagerModule.bsl:7`. `ОбщиеПеременные` = СтруктураПараметров (см. ниже); `АдресВременногоХранилища` - адрес для результата. Структура параметров (форма, `Forms/Форма/Module.bsl:344` `ВыполнитьЗагрузкуСервер`): - `СпособЗагрузки` - вариант (XML-дамп / EDT) - `ПомещенныеФайлы` - Массив структур `{ПолноеИмя, Хранение, ЭтоРасширение}`, где `Хранение` - **путь к файлу на сервере** (форма пишет файлы во временный каталог и подставляет путь) - `ИмяНовойКонфигурации`, `Конфигурация`, `ИсточникДанных`, `ВариантЗагрузкиДвижений` - `ТолькоОбновитьПланыОбмена`, `ТолькоДобавлятьНовые` - Boolean - `ЕстьРасширения` - Boolean; `ИмяКаталогаЗагрузки` - String; `КаталогиРасширений` - Массив (если есть расширения) Ридеры форматов внутри менеджера: - EDT: `ПрочитатьСведенияОбОбъектеИзEDT` (`ManagerModule.bsl:1142`), `ПрочитатьСведенияОСвойствахИзEDT` (`:1616`) - XML-дамп: `ПрочитатьСведенияОбОбъектеИзXML` (`:934`), `ПрочитатьСведенияОСвойствахИзXML` (`:1314`) - Хелперы поиска файлов: `НайтиПомещенныеФайлыПоИмени` (`:3062`), `НайтиПомещенныеФайлыПоМаске` (`:3074`) Headless-сценарий: собрать `ПомещенныеФайлы` из EDT-исходников УНФ (`...\Демо_УНФ_3\src`) на сервере КД, вызвать `ВыполнитьЗагрузкуМетаданных` как фоновое задание (`ДлительныеОперации.ВыполнитьВФоне`) с опросом. УНФ большая - синхронно нельзя. #### Рецепт headless-загрузки структуры 1. **robocopy** только загружаемых видов .mdo во ВРЕМЕННЫЙ каталог (база + расширение отдельно). Обязательно во временный: загрузчик в конце делает `УдалитьФайлы(Хранение)` по каждому файлу - если `Хранение` указывает на EDT-оригиналы, он их СНЕСЕТ. Загружаемые виды: `Catalogs,Documents,Enums,Tasks,BusinessProcesses,ChartsOfAccounts, ChartsOfCalculationTypes,ChartsOfCharacteristicTypes,AccountingRegisters, AccumulationRegisters,CalculationRegisters,InformationRegisters,ExchangePlans, EventSubscriptions,Constants,DefinedTypes,CommonAttributes,Configuration` (CommonModules/Roles/Forms и пр. не нужны - загрузчик их не читает). 2. На сервере КД собрать `ПомещенныеФайлы` - массив структур `{ПолноеИмя, Хранение, ЭтоРасширение}`, где и `ПолноеИмя`, и `Хранение` = путь к temp-копии (матчинг идет по подстроке вида в `ПолноеИмя`). База - `ЭтоРасширение=Ложь`, расширение - `Истина`, через `НайтиФайлы(temp\src\<Вид>, "*.mdo", Истина)`. 3. `СтруктураПараметров`: `СпособЗагрузки=0` (новый Релиз), `ИсточникДанных=1` (EDT), `ВариантЗагрузкиДвижений=1`, `ТолькоОбновитьПланыОбмена=Ложь`, `ТолькоДобавлятьНовые=Ложь`, `ЕстьРасширения=Истина`, `ИмяКаталогаЗагрузки`=temp-корень базы, `КаталогиРасширений`=[temp-корень расширения], `ИмяНовойКонфигурации`=имя Релиза, `Конфигурация`=`Справочники.Релизы.ПустаяСсылка()`. 4. Запуск: `ДлительныеОперации.ВыполнитьВФоне("Обработки.ЗагрузкаСтруктурыКонфигурацииИзФайловXML.ВыполнитьЗагрузкуМетаданных", СП, ПарамФон)`. В ФАЙЛОВОЙ базе работает по-настоящему АСИНХРОННО (возвращает Статус=Выполняется + JobID). 5. **Опрос завершения - НЕ по счетчикам!** Объекты/Свойства/Значения стабилизируются ЗАДОЛГО до конца (после создания объектов идет длинная фаза заполнения типов 69к свойств - счетчики не растут, но задание работает). Признак конца: `ФоновыеЗадания.НайтиПоУникальномуИдентификатору(JobID).Состояние <> Активно`, либо `РегистрСведений.СостоянияЗагрузокМетаданных` (Измерение `Релиз`, ресурс `Результат`) = `Выполнено`. Проверять ошибку через `Задание.ИнформацияОбОшибке`. 6. После загрузки - привязать Релиз к Конвертации: `Об=Конв.ПолучитьОбъект(); Об.Конфигурация=Релиз; Об.КонфигурацияКорреспондент=Релиз; Об.Записать();`. Особенности BSL toolkit-компилятора (фрагмент через Выполнить): `Новый Тип(...).Метод()` - chaining прямо на конструкторе ЗАПРЕЩЕН ("Ожидается Тогда") - присваивать в переменную; имя переменной не может быть `И` (зарезервировано - "Ожидается имя переменной"); chaining на результате метода (`Зап.Выполнить().Выгрузить()[0]`) - разрешен. На конфигурации масштаба УНФ загрузка структуры занимает ~30 мин. ## 2. ВыгрузкаМодуля - генерация модуля менеджера обмена (-> BSL) Главный артефакт КД 3.1: текст модуля менеджера обмена для движка `ОбменДаннымиXDTO`. Экспортные методы: - `ВыполнитьВыгрузкуМодулей()` Export - `DataProcessors/ВыгрузкаМодуля/ObjectModule.bsl:9`. **Основной генератор.** Без параметров - читает реквизиты объекта обработки (Конвертация + настройки), возвращает результат (тексты модулей). - `СформироватьТекстПравила(Параметры)` Export - `ObjectModule.bsl:199`. Генерация текста одного правила. - `ПодготовитьНастройкиВыгрузкиМодулей(Конвертация, ИменаФайловДляСохранения, НастройкиВыгрузки, ОбщиеПеременные = Неопределено)` Export - `ManagerModule.bsl:13`. Заполняет `НастройкиВыгрузки` (ИмяКаталога, СпособВыгрузки, ВыгрузкаВТХТ/ВыгрузкаВХМЛ, ТегиДляМодуляМенеджера) и `ИменаФайловДляСохранения` по реквизитам Конвертации (`ИмяФайлаДляСохранения`, `ИспользоватьРазделениеМодуля`, `СпособВыгрузкиРазделенногоМодуля`). - `ПолучитьТекстЗаголовкаКомандыВыгрузкиМодуля(Конвертация)` Export - `ManagerModule.bsl:64`. Рецепт (форма, `Forms/Форма/Module.bsl:53` `ВыгрузитьМодулиСервер`): ```bsl НастройкиВыгрузки = Новый Структура; ИменаФайлов = Новый Структура; Обработки.ВыгрузкаМодуля.ПодготовитьНастройкиВыгрузкиМодулей(Конв, ИменаФайлов, НастройкиВыгрузки); Обр = Обработки.ВыгрузкаМодуля.Создать(); Обр.Конвертация = Конв; // + перенести НастройкиВыгрузки/ИменаФайлов в реквизиты объекта обработки Результат = Обр.ВыполнитьВыгрузкуМодулей(); ``` Для headless нужны точные имена реквизитов объекта обработки `ВыгрузкаМодуля` (получить через `get_metadata_details Обработки.ВыгрузкаМодуля` - настройки кладутся в объект перед вызовом). Зависимость: движок `КонвертацияДанныхXDTOСервер` (`.ТегиДляМодуляМенеджераОбъекта()`). `СпособВыгрузкиРазделенногоМодуля` (EnumRef.СпособыВыгрузкиРазделенногоМодуля): `ФайлыTXT`, `ФайлыXML`. Реквизит Конвертации `ИспользоватьРазделениеМодуля` включает раздельную выгрузку модулей менеджеров. ## 3. Прочие обработки (API не прослежен до конца - пробовать перед использованием) | Обработка | Назначение | Где искать API | |---|---|---| | `ВыгрузкаКонвертацииXML` / `ЗагрузкаКонвертацииXML` | перенос правил между ИБ КД в XML | ManagerModule/ObjectModule | | `СохранитьКомплектПравилXML` | сохранить комплект правил | -"- | | `ЗагрузкаМодуляМенеджера` | загрузка готового модуля (конвертация XDTO) | -"- | | `НастройкаПравилОбмена` / `НастройкаПравилКонвертацииСвойств` | редакторы правил | преимущественно UI (форма) | | `ВыгрузкаСтруктурыФормата` / `ЗагрузкаСтруктурыФормата` | структура формата ED | ManagerModule/ObjectModule | | `ПроверкаКонвертации` | валидация правил | -"- | Перед программным вызовом: `get_module_structure` ManagerModule и ObjectModule, найти Export-метод, прочитать сигнатуру (как сделано выше для загрузчика и генератора). ## Движок конвертации (общие модули - потребители генерируемого менеджера) Генерируемый модуль менеджера обмена работает поверх движка `ОбменДаннымиXDTO` и этих общих модулей: - `КонвертацияДанныхXDTOСервер` - серверный API движка (используется генератором: `ТегиДляМодуляМенеджераОбъекта()` и др.) - `КонвертацияДанныхXDTOВызовСервера`, `КонвертацияДанныхXDTOКлиент` - `ОбменДаннымиКонвертацияДанныхXDTO`, `ОбменДаннымиСобытияКонвертацияДанныхXDTO` - `НастройкиКонвертацииВызовСервера`, `НастройкиКонвертацииПовтИсп` - `ОбновлениеИнформационнойБазыКонвертацияДанныхXDTO` Структура процедур генерируемого менеджера (ПКО_<Имя>_ПриОтправкеДанных и т.п.) - в `format-extension.md`. -
troubleshooting.md 8.8 KB
# Ограничения toolkit :6011 и КД 3.1 Пункты относятся к КД 3.1.6.14 через MCP-toolkit. ## Транспорт и кодировка ### Payload-файл, не -d с кириллицей `curl -d '{"code":"...кириллица..."}'` из bash на Windows бьет кириллицу. Формировать JSON через `jq -Rs '{code: .}'` (fallback `python json.dumps`) в файл, слать `curl --data-binary @файл`. Обертки - `scripts/kd31_query.sh`, `kd31_exec.sh`. ### Ответ читать из файла через Read Вывод curl в терминал портит кириллицу (видно как `Прав著...`) и визуально обрезает строку (кажется, что вернулось ~10 элементов из 46). Сохранять ответ в файл (`curl ... > out.json`) и читать инструментом Read - тогда UTF-8 корректен и виден весь результат. Это критично: на искаженном stdout легко сделать ложный вывод о структуре. ### Формат ответа `execute_code` возвращает `{"success": true, "data": "{\"#\",\"value\":\"...\"}"}` - полезное в `value`. Нормальный формат данной сборки toolkit. ## execute_code ### Серверный контекст, без `Возврат` Результат - через переменную `Результат = ...`, не `Возврат`. ### `Справочники.X.Количество()` не работает `Справочники.Конвертации.Количество()` падает "Метод объекта не обнаружен (Количество)". Считать через запрос: `ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК К ИЗ Справочник.X`. ### Правильная коллекция метаданных (ПКС - справочник) `Метаданные.РегистрыСведений.ПравилаКонвертацииСвойств` падает "Поле объекта не обнаружено" - ПКС в КД 3.1 это **справочник**: `Метаданные.Справочники.ПравилаКонвертацииСвойств`. При "Поле объекта не обнаружено (Имя)" - проверить, в той ли коллекции (Справочники/РегистрыСведений/ Обработки) ищется объект, и точное имя через `Метаданные.Справочники` (список). ### "Неопознанный оператор" - упрощать код Многострочный BSL (циклы, `Если`) в целом исполняется. Но `ВРег("...")` с вложенными кавычками внутри `Если` давал "Неопознанный оператор". При такой ошибке - убрать подозрительную функцию, вынести строку в переменную, сократить код. ### Длинные перечисления - в файл Сбор длинных строк (списки объектов/реквизитов) - сохранять ответ в файл и читать Read; на stdout строка обрезается визуально. ## Поведение КД 3.1 ### Релизы = 0 - структура конфигурации не загружена `ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Релизы` = 0 означает, что структура конфигурации не загружена (обработка `ЗагрузкаСтруктурыКонфигурацииИзФайловXML`). Без Релиза справочники `Объекты`/`Свойства` пусты, ПКО привязать не к чему. Поля Конвертации `Конфигурация`/`КонфигурацияКорреспондент` ссылаются на Релизы. ### ВерсияФорматаМенеджера - короткий реквизит Реквизит `ВерсияФорматаМенеджера` короткий (по наблюдениям - 2 символа): строка вида `"1.10"` молча обрезается до `"1."`. Для двузначного минора хранить иначе (полная версия - в URI пространства имен версии формата), либо проверять записанное значение после `Записать()`. ### Короткие имена перечислений Имена значений перечислений КД 3.1 короткие. Выверено по EDT: - `Перечисления.ТипыКонвертаций` - `XML`, `XDTO` (не `ФорматXDTO`). - `Перечисления.ВариантыМоделейОбмена` - `ПакетнаяМодель`, `ОбъектнаяМодель`, `КомбинированнаяМодель` (тип реквизита `Конвертации.ИнтерфейсКонвертации`; перечисления `ИнтерфейсыКонвертации` НЕТ). - `Перечисления.ВариантыИдентификацииОбъектов` - `ПоУникальномуИдентификатору`, `ПоПолямПоиска`, `СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска` (перечисления `ВариантыИдентификацииОбъектовПКО` НЕТ). - `Перечисления.СостоянияПравил` - `Черновик`, `ВРаботе`, `НаТестировании`, `Готово`, `Архив` (тип реквизита `Конвертации.Статус`). Перед использованием значения перечисления - свериться со списком значений. ### Имена обработок - сверять с фактическими В этой сборке генерация модуля - обработка `ВыгрузкаМодуля`, загрузка структуры - `ЗагрузкаСтруктурыКонфигурацииИзФайловXML`, редактор правил - `НастройкаПравилОбмена`. Имен `ВыгрузкаПравил`/`ПодключениеКорреспондента`/`ПомощникСозданияФорматаXDTO` нет. Перед вызовом обработки - проверить имя через список `Метаданные.Обработки`. ### Загрузчик УДАЛЯЕТ поданные файлы (XSD и .mdo) И `ЗагрузкаСтруктурыКонфигурацииИзФайловXML.ВыполнитьЗагрузкуМетаданных`, и `ЗагрузкаСтруктурыФормата.ВыполнитьЗагрузкуФормata` в КОНЦЕ работы делают `УдалитьФайлы(...)` по каждому поданному файлу (`Хранение` для .mdo, `ФайлыФабрики` для XSD). Поданные напрямую XSD базового формата удаляются после загрузки. ВСЕГДА подавать файлы (XSD расширения, .mdo) из ВРЕМЕННОЙ КОПИИ (robocopy/cp), не из постоянного места и не из EDT-оригиналов. ### Тяжелая загрузка занимает сеанс toolkit (HTTP 000 у параллельных запросов) Загрузка структуры (десятки тысяч объектов, десятки минут) держит сеанс 1С занятым - MCP_Toolkit однопоточный, параллельные запросы к :6011 возвращают HTTP 000 (не отвечает) до завершения. Это НЕ падение. Опрашивать готовность циклом `curl get_metadata` до HTTP 200, только потом проверять результат. Сам факт HTTP Gateway Timeout у запускающего вызова - норма (см. выше), 1С продолжает в своем сеансе. ## Запись / удаление Если в форме toolkit включена защита (`Записать`/`Удалить`/ `УстановитьПривилегированныйРежим`) - для правки ее снять. `Удалить()` в обычных формах может зависнуть на модальном подтверждении - использовать `УстановитьПометкуУдаления(Истина)`, физическое удаление через UI КД. Работать на тестовой копии ИБ КД, не на рабочей.
-
-
scripts
-
kd31_exec.sh 1.4 KB
#!/usr/bin/env bash # execute_code к toolkit КД 3.1 из BSL-файла. # Использование: kd31_exec.sh script.bsl [out.json] # Серверный контекст: НЕ использовать Возврат, результат через переменную Результат. # Порт через переменную окружения KD31_PORT (по умолчанию 6011). # Если указан out.json - ответ сохраняется туда (читать через Read для корректной # кириллицы), иначе печатается в stdout. set -euo pipefail PORT="${KD31_PORT:-6011}" BSL="${1:?Укажите путь к BSL-файлу первым аргументом}" OUT="${2:-}" TMP="$(mktemp)" trap 'rm -f "$TMP"' EXIT if command -v jq >/dev/null 2>&1; then jq -Rs '{code: .}' "$BSL" > "$TMP" else python -c "import json,io,sys; print(json.dumps({'code': io.open(sys.argv[1], encoding='utf-8').read()}))" "$BSL" > "$TMP" fi if [ -n "$OUT" ]; then curl -s --max-time 60 -X POST "http://localhost:${PORT}/api/execute_code" \ -H "Content-Type: application/json; charset=utf-8" --data-binary @"$TMP" > "$OUT" echo "saved -> $OUT (читать через Read для корректной кириллицы)" else curl -s --max-time 60 -X POST "http://localhost:${PORT}/api/execute_code" \ -H "Content-Type: application/json; charset=utf-8" --data-binary @"$TMP" echo "" fi -
kd31_query.sh 1.3 KB
#!/usr/bin/env bash # execute_query к toolkit КД 3.1. # Использование: kd31_query.sh "ВЫБРАТЬ ... ИЗ Справочник.Конвертации" [out.json] # Порт через переменную окружения KD31_PORT (по умолчанию 6011). # Кириллица передаётся payload-файлом (jq, fallback python). Если указан out.json - # ответ сохраняется туда (читать через Read: терминал портит кириллицу), иначе stdout. set -euo pipefail PORT="${KD31_PORT:-6011}" Q="${1:?Укажите текст запроса первым аргументом}" OUT="${2:-}" TMP="$(mktemp)" trap 'rm -f "$TMP"' EXIT if command -v jq >/dev/null 2>&1; then printf '%s' "$Q" | jq -Rs '{query: .}' > "$TMP" else python -c "import json,sys; print(json.dumps({'query': sys.argv[1]}))" "$Q" > "$TMP" fi if [ -n "$OUT" ]; then curl -s --max-time 30 -X POST "http://localhost:${PORT}/api/execute_query" \ -H "Content-Type: application/json; charset=utf-8" --data-binary @"$TMP" > "$OUT" echo "saved -> $OUT (читать через Read для корректной кириллицы)" else curl -s --max-time 30 -X POST "http://localhost:${PORT}/api/execute_query" \ -H "Content-Type: application/json; charset=utf-8" --data-binary @"$TMP" echo "" fi
-
-
SKILL.md 12.4 KB
--- name: kd31-rules description: > Программная работа с "Конвертация данных, редакция 3.1" (КД 3.1) через MCP-toolkit (HTTP API) к живой ИБ: инспекция и создание Конвертаций, ПКО, ПКС, ПКПД, ПОД, теневой модели метаданных (Конфигурации/Объекты/Свойства/Релизы) и слоя формата EnterpriseData (ВерсииФормата/ОбъектыФормата); расширение формата ED с собственным namespace; генерация модуля менеджера обмена и выгрузка XSD штатными обработками КД 3.1; перенос артефактов в расширение конфигурации. Содержит схему данных, BSL-шаблоны для execute_code, ограничения toolkit. Триггеры: "КД 3.1", "конвертация данных 3.1", "правила обмена EnterpriseData", "настроить ПКО ПКС ПКПД ПОД", "расширение формата ED", "модуль менеджера обмена", "обмен через универсальный формат", "подключить конфигурацию к КД". English: "1C Data Conversion 3.1", "KD 3.1", "EnterpriseData exchange rules", "conversion manager module". --- # KD 3.1 - правила обмена EnterpriseData через MCP-toolkit Скилл описывает работу с живой ИБ "Конвертация данных, редакция 3.1" (КД 3.1) через `MCP-toolkit` HTTP API: исследование структуры правил, создание/правка правил, настройка формата и получение артефактов для расширения формата EnterpriseData - **модуля менеджера обмена** (общий модуль BSL) и **XDTO-пакета расширения / версии формата** (XSD). Относится к сборке КД 3.1.6.14 (платформа 8.5.1.1302). ## Модель данных: КД 3.1 близка к КД 2.0 + слой формата В этой сборке КД 3.1 по структуре похожа на КД 2.0: - Теневая модель метаданных: `Релизы` (версия загруженной структуры) -> `Объекты` (Владелец=Релизы) -> `Свойства`/`Значения` (Владелец=Объекты). `Конфигурации` - топ-контейнер, на который ссылаются Релизы (версии живут в Релизах). - Правила в справочниках: `ПравилаКонвертацииОбъектов` (ПКО), `ПравилаКонвертацииСвойств` (ПКС, Владелец=ПКО - **это справочник**, не регистр), `ПравилаКонвертацииПредопределенныхДанных` (ПКПД), `ПравилаОбработкиДанных` (ПОД), `ПравилаРегистрацииОбъектов` (ПРО, Владелец=Регистрации). ПКО/ПОД/ПКПД - **топ-уровневые** (без Владельца), связь с конвертацией - через `СоставыКонвертаций`. ВАЖНО: у ПКО **нет реквизита Наименование** (идентификатор в Коде, искать НайтиПоКоду) и ПКО **НЕ иерархичен** (нет ЭтоГруппа); ПКС иерархичен. Паттерн заполнения - **2 ПКО на объект** (`<Объект>_Отправка` + `<Объект>_Получение`), эталон в демо. См. bsl-templates.md. - Дополнительно - слой формата EnterpriseData (цепочка справочников): `ВерсииФормата` (`ПространствоИмен`, признак расширения) -> `ОбъектыФормата` (Владелец=ВерсииФормата) -> `СвойстваФормата` -> `ЗначенияФормата`; типы - `ТипыФормата`. Отличие результата от КД 2.0: КД 3.1 генерирует **модуль менеджера обмена** (BSL) для движка `ОбменДаннымиXDTO` плюс работает с **XDTO-пакетом/версией формата**, а не выгружает XML-правила для "Универсального обмена". Для КД 2.0 - скилл `kd2-rules`. ## Архитектура работы ``` Claude (агент) --Bash+curl (payload через jq/python в файл)--> MCP-toolkit (КД 3.1, СЕРВЕРНЫЙ контекст) -> справочники Конвертации/ПКО/ПКС/ПКПД/ПОД + теневая модель + слой формата -> штатные обработки (ЗагрузкаСтруктурыКонфигурацииИзФайловXML, НастройкаПравилОбмена, ВыгрузкаМодуля) -> артефакты: CommonModule (менеджер обмена) + XDTOPackage/XSD расширения -> перенос в расширение конфигурации-приемника (например УНФ) ``` Эндпоинты toolkit (порт по умолчанию 6011): - `POST /api/execute_query` - запросы к справочникам/состоянию. - `POST /api/execute_code` - чтение метаданных, создание/правка элементов. **Серверный, без `Возврат`** - результат через `Результат = ...`. - `GET /api/get_metadata?type=Configuration` - метаданные. ## Граница автоматизации Через toolkit реально: - Инспекция структуры и состояния (состав справочников, реквизиты, статус Конвертации, есть ли Релиз). - Создание/правка правил как элементов справочников: Конвертация, ПКО, ПКС, ПКПД, ПОД, СоставыКонвертаций (со снятой защитой записи в форме toolkit). ПКО/ПОД/ПКПД - топ-уровневые, в конвертацию включаются записью СоставыКонвертаций. - Точечная правка реквизитов и привязок. - Загрузка структуры и генерация модуля - тоже программно: у форменных обработок есть headless-точки входа (`ВыполнитьЗагрузкуМетаданных`, `ВыполнитьВыгрузкуМодулей`), вызываемые через фоновое задание. См. `methods.md`. Удобнее интерактивно (через формы обработок КД 3.1), но НЕ обязательно: - Загрузка структуры конфигурации (`ЗагрузкаСтруктурыКонфигурацииИзФайловXML`) - заполняет Релиз + Объекты/Свойства. Без нее правила привязывать не к чему. Headless - `methods.md` п.1 (для большой конфигурации запускать через фон). - Создание/расширение версии формата (`ВыгрузкаСтруктурыФормата` / редакторы формата). - Генерация модуля менеджера (`ВыгрузкаМодуля`). Headless - `methods.md` п.2. Перед массовой работой проверять, что Релизы загружены: `ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Релизы` (0 -> структура не загружена). ## Карта references | Документ | Что внутри | Когда читать | |---|---|---| | `references/data-schema.md` | проверенные справочники и реквизиты (Конвертации, ПКО, ПКС, ПКПД, ПОД, теневая модель, слой формата), фактические имена обработок | нужны точные имена объектов/реквизитов | | `references/bsl-templates.md` | BSL для execute_code: инспекция, состояние конвертации, создание ПКО/ПКС, привязка версии формата | конкретная операция через toolkit | | `references/format-extension.md` | расширение формата ED: версия формата с namespace, привязка к Конвертации, обработчики ПКО, генерация менеджера, перенос в расширение; workflow + контекст проекта | разработка расширения формата и перенос артефактов | | `references/methods.md` | программный API обработок (headless): загрузка структуры `ВыполнитьЗагрузкуМетаданных`, генерация модуля `ВыполнитьВыгрузкуМодулей`, прием вызова форменной обработки в обход UI, file:line | нужно вызвать обработку КД программно через toolkit | | `references/troubleshooting.md` | ограничения toolkit :6011 и КД 3.1 (кодировка, Количество(), тип коллекции метаданных, длины реквизитов, имена перечислений) | при ошибке execute_code/execute_query | ## Scripts - `scripts/kd31_query.sh "<запрос>" [out.json]` - execute_query. - `scripts/kd31_exec.sh <файл.bsl> [out.json]` - execute_code из BSL-файла. Оба: payload через jq (fallback python) + `curl --data-binary @файл`, порт через `KD31_PORT` (по умолчанию 6011). Если указан `out.json` - ответ в файл (читать через Read: терминал портит кириллицу). ## Демо-база КД 3.1 как эталон (НАСТОЯТЕЛЬНО) Если доступна демо-база КД 3.1 (типовая поставка содержит готовую конвертацию, напр. "БП->УП" - сотни ПКО, тысячи ПКС) - использовать ее как ЭТАЛОН заполнения правил, а не угадывать. Демо идентична рабочей ИБ по структуре метаданных. Перед созданием своего ПКО/ПКС снять образец аналогичного правила из демо (Код, как заполнены ОбъектКонфигурации/ОбъектФормата, паттерн _Отправка/_Получение, как оформлены прямые vs алгоритмические ПКС, ссылочные через ПравилоКонвертацииСвойства). Порт демо задается при запуске ее toolkit (порт toolkit уточнять по своей конфигурации). Чтение демо - `KD31_PORT=<порт> bash scripts/kd31_query.sh "..."`. ## Базовая проверка готовности ```bash curl -s -o /dev/null -w "%{http_code}\n" "http://localhost:6011/api/get_metadata?type=Configuration" # 200 bash scripts/kd31_query.sh "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК К ИЗ Справочник.Конвертации" bash scripts/kd31_query.sh "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК К ИЗ Справочник.Релизы" # Релизы=0 -> структура конфигурации не загружена; для расширения проверить ЕстьРасширения bash scripts/kd31_query.sh "ВЫБРАТЬ Наименование, ЕстьРасширения ИЗ Справочник.Релизы ГДЕ НЕ ЭтоГруппа" ``` ## Связанные скиллы - `1c-mcp-toolkit` - HTTP API к живой ИБ 1С (этот скилл - надстройка). - `kd2-rules` - аналог для КД 2.0 (та же идея, другой результат - XML-правила). - `composing-1c-queries` - синтаксис запросов для execute_query.
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.