Стандартный интерфейс OData. Регистры бухгалтерии
Стандартный интерфейс OData в «1С:Предприятии» предназначен для получения доступа к данным системы из внешнего приложения без модификации кода прикладного решения. О настройке поддержки стандартного интерфейса OData можно посмотреть здесь
В данной статье я показываю как научиться работать с регистром бухгалтерии через стандартной интерфейс OData. Для этой цели, я опубликовал демонстрационную версию библиотеки стандартных подсистем 3.0 локально на моем компьютере и включил интерфейс
OData

Обращение к стандартному интерфейсу OData выполняется с помощью HTTP-запроса, выполнено по определенному URL. URL формируется специальным образом и состоит из следующих частей:
- Адрес информационной базы, например, localhost/DemoSSL;
- Признак обращения к стандартному интерфейсу OData, например, / odata/standard.odata;
- Имя ресурса, к которому выполняется обращение, например, ChartOfAccounts__ДемоОсновной;
- Параметры запроса обращения к ресурсу, например ,
$metadata , $top, $format и др .
Для получения описания стандартного интерфейса OData необходимо выполнить в браузере URL
http://localhost/DemoSSL/odata/standard.odata/$metadata
В результате будет получен полный список доступных сущностей, их атрибутов и функций в виде XML-документа. Подробное описание структуры XML- документа можно получить по адресу http://www.odata.org/documentation/odata-version-3-0/common-schema-definition-language-csdl/ (на английском языке).
Отметим, что опция $metadata не поддерживает параметры , такие как $format и другие
Для работы с регистрами бухгалтерии нужно прежде всего научиться работать с планом счетов ( см рис 1) в стандартном интерфейсе OData

С целью получения атрибуты таблиц сущности ChartOfAccounts ( План счетов) , которые показаны на рис 1, я использовал параметр $top, чтобы ограничить количество записей, возвращаемых при обращении к ресурсу .
http://localhost/DemoSSL/odata/standard.odata/ChartOfAccounts__ДемоОсновной?&$top=1&$format=json
Результат в формате json :
{ "odata.metadata": "http://localhost/DemoSSL/odata/standard.odata/$metadata#ChartOfAccounts__ДемоОсновной", "value": [{ "Ref_Key": "603effb0-2696-11e3-9e14-bcaec5d979f0", "DataVersion": "AAAAAQAAAAg=", "DeletionMark": false, "Parent_Key": "00000000-0000-0000-0000-000000000000", "Code": "68", "Description": "Расчеты по налогам и сборам", "Order": "68", "Type": "ActivePassive", "OffBalance": false, "Комментарий": "", "Валютный": false, "Количественный": false, "ExtDimensionTypes": [ { "LineNumber": "1", "ExtDimensionType_Key": "603effae-2696-11e3-9e14-bcaec5d979f0", "Predefined": true, "TurnoversOnly": false, "Валютный": true, "Количественный": true, "Суммовой": true } ], "Predefined": true, "PredefinedDataName": "РасчетыПоНалогам" }] }
Запись, возвращаемая в этом XML- документе соответствует элементу плана счетов на рис 2 :

Отметим, что если в адресе ресурса не указывать $format , то возвращаются данные в формате atom-xml. Подробнее о работе с форматом json можно посмотреть здесь
После детального анализа XML- документа можно установить соответствие между именами атрибута ресурса в интерфейсе
OData и в запросе конфигурации (см. рис 1) .
Поиск счета по уникальному номеру (Ref_Key ) :
//localhost/DemoSSL/odata/standard.odata/ChartOfAccounts__ДемоОсновной(guid'603effb0-2696-11e3-9e14-bcaec5d979f0')&$format=json
Поиск счета по коду (Code):
//localhost/DemoSSL/odata/standard.odata/ChartOfAccounts__ДемоОсновной?$filter=Code eq '68'&$format=json
Поиск счета по предопреленному значению (PredefinedDataName)
//localhost/DemoSSL/odata/standard.odata/ChartOfAccounts__ДемоОсновной?$filter=PredefinedDataName eq 'РасчетыПоНалогам'&$format=json
Обращение к регистрам бухгалтерии
У регистра бухгалтерии кроме основной таблицы есть еще виртуальные таблицы ( См рис 4)

С целью получения атрибуты таблиц объекта РегистрыБухгалтерии, которые показаны на рис 1 я использовал параметр $top, чтобы ограничить количество записей, возвращаемых при обращении к ресурсу .
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной?&$top=1&$format=json
Результат:
{ "Period": "2012-02-14T16:52:49", "LineNumber": "1", "Active": true, "AccountDr_Key": "603effaf-2696-11e3-9e14-bcaec5d979f0", "AccountCr_Key": "603effbe-2696-11e3-9e14-bcaec5d979f0", "Организация_Key": "09ce35a0-39c5-11e4-9e14-005056c00008", "ВалютаDr_Key": null, "ВалютаCr_Key": "00000000-0000-0000-0000-000000000000", "Сумма": 500, "ВалютнаяСуммаDr": 0, "ВалютнаяСуммаCr": 500, "КоличествоDr": 5, "КоличествоCr": 5, "Содержание": "Поступление товаров" }, { "Period": "2012-02-14T16:52:49", "LineNumber": "2", "Active": true, "AccountDr_Key": "603effaf-2696-11e3-9e14-bcaec5d979f0", "AccountCr_Key": "603effbe-2696-11e3-9e14-bcaec5d979f0", "Организация_Key": "09ce35a0-39c5-11e4-9e14-005056c00008", "ВалютаDr_Key": null, "ВалютаCr_Key": "00000000-0000-0000-0000-000000000000", "Сумма": 100, "ВалютнаяСуммаDr": 0, "ВалютнаяСуммаCr": 100, "КоличествоDr": 1, "КоличествоCr": 1, "Содержание": "Поступление товаров" }, { "Period": "2012-02-14T16:52:49", "LineNumber": "3", "Active": true, "AccountDr_Key": "603effaf-2696-11e3-9e14-bcaec5d979f0", "AccountCr_Key": "603effbe-2696-11e3-9e14-bcaec5d979f0", "Организация_Key": "09ce35a0-39c5-11e4-9e14-005056c00008", "ВалютаDr_Key": null, "ВалютаCr_Key": "00000000-0000-0000-0000-000000000000", "Сумма": 2500, "ВалютнаяСуммаDr": 0, "ВалютнаяСуммаCr": 2500, "КоличествоDr": 25, "КоличествоCr": 25, "Содержание": "Поступление товаров" }, { "Period": "2012-02-14T16:52:49", "LineNumber": "4", "Active": true, "AccountDr_Key": "603effaf-2696-11e3-9e14-bcaec5d979f0", "AccountCr_Key": "603effbe-2696-11e3-9e14-bcaec5d979f0", "Организация_Key": "09ce35a0-39c5-11e4-9e14-005056c00008", "ВалютаDr_Key": null, "ВалютаCr_Key": "00000000-0000-0000-0000-000000000000", "Сумма": 19230, "ВалютнаяСуммаDr": 0, "ВалютнаяСуммаCr": 19230, "КоличествоDr": 1, "КоличествоCr": 1, "Содержание": "Поступление товаров" } ]
При обращении к виртуальным таблицам можно также получить аналогичный XML- документ, который позволить имена полей таблицы:
- РегистрБухгалтерии._ДемоОсновной.ДвиженияССубконто
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/RecordsWithExtDimensions?&$top=1&$format=json
- РегистрБухгалтерии._ДемоОсновной.Обороты
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/Turnovers?&$top=1&$format=json
- РегистрБухгалтерии._ДемоОсновной.ОборотыДтКт
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/DrCrTurnover?&$top=1&$format=json
- РегистрБухгалтерии._ДемоОсновной.Остатки
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/Balance?&$top=1&$format=json
РегистрБухгалтерии._ДемоОсновной.ОстаткиИОбороты
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/BalanceAndTurnovers?&$top=1&$format=json
- РегистрБухгалтерии._ДемоОсновной.Субконто
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/ExtDimensions?&$top=1&$format=json
Примеры использования параметров
$expand
Данный параметр позволяет вместе с результатами основного запроса получать значения связанных сущностей, что позволит не запрашивать каждую сущность отдельно.
В следующем примере возвращаются не только остатки на текущий день , но и все сущности, связанные с организацией :
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/Balance?$expand=Организация&$format=json
В результате исполнения этого запроса будет добавлен на каждый запись следующий результат:
"Организация": {
…ДанныеОбъекта…
},
$select
Допускается совместное использование параметров запроса $select и $expand. В этом случае необходимо указать в выражении оператора $select перечень (через запятую) всех необходимых полей.
В параметре $select, при использовании совместно с параметром $expand,поддерживается использование символов * и **. Указание символа * означает, что необходимо развернуть все реквизиты получаемого объекта. Указание символа ** означает, что необходимо развернуть все реквизиты получаемого объекта, кроме табличных частей.
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/Balance?$expand=Организация&$select=*,Организация/Description&$format=json
В результате исполнения этого запроса будет получено все реквизиты регистра и еще добавлен следующий результат:
"Организация": { "Description": "Ромашка ОАО" }
$Cast(expr, type)
Возвращает объект, на который указывает параметр expr, приведенный к типу, указанному параметром type. В качестве типа значения принимается строка, обозначающая имя данного типа, например: String, Number, Boolean, Date,Catalog_Товары и т. д.
Пример получения остатков на счете из регистра бухгалтерии с условием по конкретному контрагенту:
http://localhost/DemoSSL/odata/standard.odata/AccountingRegister__ДемоОсновной/Balance
(
AccountCondition='Account_Key eq guid'value1'' ,
Condition='ExtDimension1 eq cast(guid'value2','Catalog__ДемоКонтрагенты')',
ExtraDimensions='value3'
)
?$format=json
В данном примере:
- guid’value1′ ‑ уникальный идентификатор элемента плана счетов;
- guid’value2′ ‑ уникальный идентификатор элемента плана видов характеристик ВидыСубконтоХозрасчетные с типом значения СправочникСсылка._ДемоКонтрагенты;
- ‘value3’ ‑ уникальный идентификатор элемента справочника _ДемоКонтрагенты.
Balance(), Turnovers() и BalanceAndTurnovers()
Для регистра накопления и регистра бухгалтерии – Balance(), Turnovers() и BalanceAndTurnovers()
Пример использования функции Balance() с параметрами показан в примере выше
Продолжение следует …….
См. также:
Доброго дня. Не подскажите в чем подвох.
Используем Бухгалтерию для Казахстана типовою С типовым планом счетов.
Никак не могу запросом получить остатки по контрагенту из вашего Примера получения остатков на счете из регистра бухгалтерии с условием по конкретному контрагенту:
http://localhost:9917/1C/odata/standard.odata/AccountingRegister_Типовой/Balance
(Period=’2021-03-09T23:59:59′,
Condition=’ExtDimension1 eq cast(guid’25d9067b-0d96-4f0d-a5fd-12d29fba60b8′, ‘Catalog_Контрагенты’)’,AccountCondition=’Account_Key eq guid’fb7e7924-33e5-4d5b-b3a6-24262a02d563”,ExtraDimensions=’6ed5d4f6-85f2-11e6-8658-00241dceef65′,)?$format=json
Приходит пустой результат, хотя по по счету 1210 и этому контрагенту движения есть 100%.
Про порядок я первое что попробовал. Думаю это не принципиально.
Как передать в качестве счетов учета массив строк как это сделал бы я в запросе.
Я так же думаю, что порядок не имеет значения, но я НЕ нашел ошибку в нотации. Тогда проблему нужно искать в передаваемых значениях value .
Чтобы работать с массивами, нужно использовать конкатенацию логических выражений OR или AND из каждого элемента массива в зависимости от логики.
Пример массива счетов из трех значений
AccountCondition=’Account_Key eq guid’value1 or Account_Key eq guid’value2′ or Account_Key eq guid’value3′ ‘
Если массив состоит из больше 3-х элементов лучше использовать цикл
Пример поиска элемента по полям поиска
в поиске элемента по
отбору $filter по нескольким полям я использую не массив, а список значений, где представление – это ключ . Например:
Условие = “”;
Для Каждого Эл из ПоляПоиска Цикл
Ключ = Эл.Представление;
Value = Эл.Значение
Условие = Условие + Ключ+ ” eq ‘” +Value + “‘ and “;
КонецЦикла;
КонечноеУсловие = Лев(Условие, СтрДлина(Условие)-5); // удаляем последние 5 символов ‘ and’
ОтборЭлементов = “$filter=”+ КонечноеУсловие;