agentleFS
gybson63gybson63/1c-oData-skill/skills/odata/SKILL.md

odata

Skill8 starsChanged 5 months agoMITView on GitHub

Получение данных из 1С:Предприятие через стандартный OData-интерфейс

3 other projects use a version of this.

Adopted by

Most recently taken up by

The file

Files
SKILL.md

OData — запросы к данным 1С через MCP fetch

Описание

Скилл для получения данных из 1С:Предприятие через стандартный REST OData-интерфейс. 1С реализует OData версии 3.0 (протокол odata/standard.odata). Работает с любой конфигурацией 1С, где опубликована база через веб-сервер.

Подготовка запроса через conf-doc

Если подключён MCP 1c-conf-doc, перед построением OData-запроса уточни структуру метаданных:

  1. conf_doc_search(query="...") — найти объект по смыслу запроса пользователя
  2. conf_doc_get_object + conf_doc_get_object_chunk — прочитать реквизиты и типы полей
  3. Сопоставить тип с OData-префиксом (Document → Document_, Catalog → Catalog_, …)
  4. Выполнить fetch с корректным entity, $filter, $select

Подробнее — skills/conf-doc/SKILL.md.

Пример: вопрос «отпуска сотрудника Иванова за май»:

  • conf-doc: Document.Отпуск, реквизиты Сотрудник, ДатаНачала, ДатаОкончания
  • OData: Document_Отпуск?$filter=...&$select=...

MCP-инструмент fetch

Для запросов к 1С OData используется MCP-инструмент fetch (пакет @modelcontextprotocol/server-fetch).

Все запросы выполняются через вызов:

fetch(
  url="полный_URL_запроса",
  method="GET",
  headers={
    "Authorization": "Basic <base64>",
    "Accept": "application/json"
  }
)

Настройка credentials

Credentials хранятся в файле env.json (вне репозитория, в .gitignore):

{
  "default": {
    "odata_url": "http://localhost/your_base/odata/standard.odata",
    "odata_user": "Администратор",
    "odata_password": "пароль"
  }
}

Подготовка авторизации

Заголовок Authorization формируется один раз — Base64-кодировка строки логин:пароль:

"Authorization": "Basic " + Base64Encode(odata_user + ":" + odata_password)

Важно: Используйте только заголовок Authorization: Basic. Кодировка кириллических паролей корректно работает через Base64 в UTF-8.

Базовый URL

Базовый URL берётся из env.json → odata_url, например: http://localhost/your_base/odata/standard.odata

Все пути ресурсов добавляются после него через /.

Проверить доступные сущности

fetch(
  url="http://localhost/your_base/odata/standard.odata/",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Типы объектов 1С в OData

Каждый тип объекта 1С имеет свой префикс в URL-имени ресурса:

Тип 1СПрефикс ODataПример ресурса
СправочникCatalog_Catalog_Сотрудники
ДокументDocument_Document_Отпуск
Журнал документовDocumentJournal_DocumentJournal_ДокументыОплата
План видов характеристикChartOfCharacteristicTypes_ChartOfCharacteristicTypes_ВидыСубконто
План счетовChartOfAccounts_ChartOfAccounts_Основной
План видов расчетаChartOfCalculationTypes_ChartOfCalculationTypes_Начисления
План обменаExchangePlan_ExchangePlan_ОбменСБухгалтерией
КонстантаConstant_Constant_АдресПубликации
Регистр сведенийInformationRegister_InformationRegister_Цены
Регистр накопленияAccumulationRegister_AccumulationRegister_Продажи
Регистр расчётаCalculationRegister_CalculationRegister_Начисления
Регистр бухгалтерииAccountingRegister_AccountingRegister_Хозрасчетный
Бизнес-процессBusinessProcess_BusinessProcess_ЗаявкаНаСогласование
ЗадачаTask_Task_ЗадачаИсполнителя
ПеречислениеEnum_Enum_ПолФизическогоЛица

Суффиксы ресурсов регистров

Регистры имеют несколько вариантов ресурса в зависимости от типа выборки:

Регистры сведений

СуффиксНазначениеПример
_RecordTypeЗаписи регистраInformationRegister_Цены_RecordType
_СрезПоследнихСрез последних (только периодические)InformationRegister_Цены_СрезПоследних

Регистры накопления / расчёта / бухгалтерии

СуффиксНазначениеПример
_RecordTypeЗаписи регистраAccumulationRegister_Продажи_RecordType

Табличные части

Табличные части объектов доступны как отдельные ресурсы. Имя ресурса: ИмяРесурсаОбъекта_ИмяТабличнойЧасти.

Например, табличная часть Адреса справочника Сотрудники: Catalog_Сотрудники_Адреса

Стандартные поля табличной части:

  • LineNumber — номер строки
  • реквизиты табличной части
  • _Key / _Type суффиксы для ссылочных и составных полей

Стандартные поля OData по типам объектов

Справочники

Поле ODataОписание
Ref_KeyUUID элемента (ссылка)
DeletionMarkПометка удаления
PredefinedПредопределённый элемент
IsFolderЯвляется ли папкой (иерархический справочник)
Parent_KeyUUID родителя (иерархия)
CodeКод элемента
DescriptionНаименование элемента

Документы

Поле ODataОписание
Ref_KeyUUID документа
DeletionMarkПометка удаления
DateДата документа
NumberНомер документа
PostedПроведён

Регистры сведений (записи)

Поле ODataОписание
RecordKeyКлюч записи
PeriodПериод (если регистр периодический)

Для регистров сведений (срез последних) доступны: Period, измерения и ресурсы.

Табличные части

Поле ODataОписание
LineNumberНомер строки

Суффиксы полей

1С добавляет специальные суффиксы к именам реквизитов в OData:

СуффиксКогда появляетсяОписаниеПример
_KeyРеквизит ссылочного типаUUID связанного объектаОрганизация_Key
_TypeРеквизит составного типа (несколько типов)Тип значенияВладелец_Type

Используйте _Key для фильтрации по ссылке, _Type — для определения типа в составных полях.

Параметры OData-запросов

ПараметрОписаниеПример
$topОграничить кол-во записей$top=10
$skipПропустить N записей$skip=20
$filterФильтрация$filter=DeletionMark eq false
$selectВыбрать конкретные поля$select=Ref_Key,Description
$orderbyСортировка$orderby=Description asc
$expandРаскрыть связанные объекты$expand=Организация
$formatФормат ответа$format=json

Операторы фильтрации

Операторы сравнения

ОператорОписаниеПример
eqРавно$filter=DeletionMark eq false
neНе равно$filter=Code ne '000'
gtБольше$filter=Date gt datetime'2024-01-01T00:00:00'
geБольше или равно$filter=Date ge datetime'2024-01-01T00:00:00'
ltМеньше$filter=Date lt datetime'2024-12-31T23:59:59'
leМеньше или равно$filter=Code le '000100'

Строковые функции

ФункцияОписаниеПример
substringofСодержит подстроку$filter=substringof('Иванов', Description) eq true
startswithНачинается с$filter=startswith(Code, '000')
endswithЗаканчивается на$filter=endswith(Description, 'ов')

Важно: 1С использует OData v3. Синтаксис substringof отличается от OData v4:

  • v3: substringof('значение', Поле) eq true
  • v4: contains(Поле, 'значение') — не работает в 1С!

Логические операторы

ОператорОписаниеПример
andЛогическое И$filter=DeletionMark eq false and Date gt datetime'2024-01-01T00:00:00'
orЛогическое ИЛИ$filter=Code eq '001' or Code eq '002'
notОтрицание$filter=not(DeletionMark eq true)

Формат значений в фильтрах

Тип значенияСинтаксисПример
СтрокаОдинарные кавычки'Иванов'
ЧислоБез кавычек100
Булевоtrue / falseeq true
Датаdatetime'YYYY-MM-DDTHH:MM:SS'datetime'2024-01-01T00:00:00'
UUID (Ref_Key)guid'uuid'guid'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'

URL-кодирование кириллических имён

Имена объектов 1С (на русском) нужно URL-кодировать перед подстановкой в URL. Используйте функцию encodeURIComponent() — это стандарт URL-кодировки UTF-8.

Примеры закодированных имён:

Имя 1СURL-encoded
Сотрудники%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8
ФизическиеЛица%D0%A4%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%D0%9B%D0%B8%D1%86%D0%B0
Организации%D0%9E%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8

Примеры запросов через fetch

Запросить данные справочника

fetch(
  url="http://localhost/your_base/odata/standard.odata/Catalog_%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8?$top=10&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Запросить данные документа

fetch(
  url="http://localhost/your_base/odata/standard.odata/Document_%D0%9E%D1%82%D0%BF%D1%83%D1%81%D0%BA?$top=5&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Получить конкретную запись по GUID

fetch(
  url="http://localhost/your_base/odata/standard.odata/Catalog_%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8(guid'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee')?$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Подсчитать количество записей ($count)

fetch(
  url="http://localhost/your_base/odata/standard.odata/Catalog_%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8/$count",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Выбрать конкретные поля ($select)

fetch(
  url="http://localhost/your_base/odata/standard.odata/Catalog_%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8?$select=Ref_Key,Description,Code&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Раскрыть связанный объект ($expand)

fetch(
  url="http://localhost/your_base/odata/standard.odata/Document_%D0%9E%D1%82%D0%BF%D1%83%D1%81%D0%BA?$expand=Организация&$top=5&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Фильтрация по дате

fetch(
  url="http://localhost/your_base/odata/standard.odata/Document_%D0%9E%D1%82%D0%BF%D1%83%D1%81%D0%BA?$filter=Date ge datetime'2024-01-01T00:00:00' and Date le datetime'2024-12-31T23:59:59'&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Фильтрация по наименованию (OData v3 синтаксис!)

fetch(
  url="http://localhost/your_base/odata/standard.odata/Catalog_%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8?$filter=substringof('Иванов', Description) eq true&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Записи регистра сведений

fetch(
  url="http://localhost/your_base/odata/standard.odata/InformationRegister_%D0%A6%D0%B5%D0%BD%D1%8B_RecordType?$top=10&$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Срез последних регистра сведений

fetch(
  url="http://localhost/your_base/odata/standard.odata/InformationRegister_%D0%A6%D0%B5%D0%BD%D1%8B_%D0%A1%D1%80%D0%B5%D0%B7%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D1%85?$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Запрос константы

fetch(
  url="http://localhost/your_base/odata/standard.odata/Constant_%D0%90%D0%B4%D1%80%D0%B5%D1%81%D0%9F%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8/$value",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Запрос перечисления

fetch(
  url="http://localhost/your_base/odata/standard.odata/Enum_%D0%9F%D0%BE%D0%BB%D0%A4%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%D0%9B%D0%B8%D1%86%D0%B0?$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Запрос табличной части

fetch(
  url="http://localhost/your_base/odata/standard.odata/Catalog_%D0%A1%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%B8_%D0%90%D0%B4%D1%80%D0%B5%D1%81%D0%B0?$format=json",
  method="GET",
  headers={"Authorization": "Basic <base64>", "Accept": "application/json"}
)

Формат ответа

{
  "odata.metadata": "...",
  "value": [
    {
      "Ref_Key": "uuid",
      "DataVersion": "...",
      "DeletionMark": false,
      "Code": "000000001",
      "Description": "Название элемента",
      "Предопределенный": false
    }
  ]
}

Включить объект в OData

Если объект не появляется в списке сущностей, он не опубликован. Выполните в 1С (режим Сервер / Внешнее соединение / Интеграция):

МассивОбъектов = Новый Массив();
МассивОбъектов.Добавить(Метаданные.Справочники.ИмяСправочника);
УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектов);

Типичные ошибки

401 Unauthorized / 401.5

Неверная кодировка credentials. Убедитесь, что используете заголовок Authorization: Basic с корректной Base64-кодировкой строки логин:пароль в UTF-8.

Объект не найден в списке сущностей

Объект не опубликован через OData. Выполните enable-odata.bsl или используйте обработку EnableODataInterface.epf.

contains не работает

1С использует OData v3, где вместо contains(Поле, 'значение') нужно использовать substringof('значение', Поле) eq true.

MCP-инструменты analytics (1c-odata-mcp)

Помимо fetch, сервер mcp_servers/odata_server.py предоставляет:

fetch_table

Загрузить таблицу из одной сущности в CSV или JSON:

fetch_table(
  entity="Catalog_Контрагенты",
  filter="DeletionMark eq false",
  select="Description,Code,ИНН",
  top=200,
  format="csv"
)

analyze_data

Multi-query analytics с join в pandas и опциональным графиком:

analyze_data(
  queries=[
    {"alias": "sales", "entity": "Document_Реализация", "filter": "...", "select": "...", "top": 200}
  ],
  aggregate={"group_by": ["Контрагент"], "agg": {"СуммаДокумента": "sum"}},
  chart={"type": "bar", "x": "Контрагент", "y": "СуммаДокумента", "title": "Продажи"},
  explanation="..."
)

Ответ JSON: rows, columns, csv_preview, chart_png_base64, chart_html.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.