Имя: Пароль:
1C
 
Отбор в 1C ODATA
0 hiwun
 
18.03.25
10:33
https://server/db/odata/standard.odata/Catalog_ХарактеристикиНоменклатуры?$format=json&$filter=Owner eq 'ae8d0dac-5a7c-11ed-88ce-d8bbc189bb8e'

Под капотом из метадаты тип поля Owner следующий

<Property Name="Owner" Type="Edm.String" Nullable="true"/>

Суть в том, что запрос возвращает пустые результаты value = [], но физически элементы с таким guid(но по метадате это строка) существуют, почему так происходит?

Причем физически я пробовал с разными guid это делать, КОТОРЫЕ РЕАЛЬНО СУЩЕСТВУЮТ, прямо из списка брал

Причем если я делаю аналогичный запрос, но делаю фильтрацию где Description eq 'Наименование какое то', то элементы находятся, хотя у Description точно такой же тип данных как у Owner

<Property Name="Description" Type="Edm.String" Nullable="true"/>

В чем фокус? Кто сталкивался?
1 JeHer
 
18.03.25
10:43
Латиница, кирилллица, не? Какие-то неприятные символы?
2 hiwun
 
18.03.25
10:47
Все пробовали, точно не в этом проблема, именно с полем Owner не работает, оно даже в функции не попадает, в отличии например от Description
Вот на всякий случай xml всей модели, из ней видно почему они сделали Owner строкой, а не guid, потому что есть поле Owner_Type, который обозначает справочник на который ссылается, хотя тоже непонятно почему нельзя было сделать guid, но в целом сути это не меняет

<EntityType Name="Catalog_ХарактеристикиНоменклатуры" OpenType="true">
<Key>
...
</Key>
<Property Name="Ref_Key" Type="Edm.Guid" Nullable="false"/>
<Property Name="Predefined" Type="Edm.Boolean" Nullable="true"/>
<Property Name="PredefinedDataName" Type="Edm.String" Nullable="true"/>
<Property Name="DataVersion" Type="Edm.String" Nullable="true"/>
<Property Name="Description" Type="Edm.String" Nullable="true"/>
<Property Name="Owner" Type="Edm.String" Nullable="true"/>
<Property Name="DeletionMark" Type="Edm.Boolean" Nullable="true"/>
<Property Name="НаименованиеПолное" Type="Edm.String" Nullable="true"/>
<Property Name="Принципал" Type="Edm.String" Nullable="true"/>
<Property Name="Контрагент" Type="Edm.String" Nullable="true"/>
<Property Name="КиЗГИСМGTIN" Type="Edm.String" Nullable="true"/>
<Property Name="ВидНоменклатуры_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="УдалитьВидНоменклатуры_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="ХарактеристикаНоменклатурыДляЦенообразования_Key" Type="Edm.Guid" Nullable="true"/>
<Property Name="ыКод" Type="Edm.String" Nullable="true"/>
<Property Name="НаименованиеЯзык1" Type="Edm.String" Nullable="true"/>
<Property Name="НаименованиеЯзык2" Type="Edm.String" Nullable="true"/>
<Property Name="ДополнительныеРеквизиты" Type="Collection(StandardODATA.Catalog_ХарактеристикиНоменклатуры_ДополнительныеРеквизиты_RowType)" Nullable="true"/>
<Property Name="Owner_Type" Type="Edm.String" Nullable="true"/>
<Property Name="Принципал_Type" Type="Edm.String" Nullable="true"/>
<Property Name="Контрагент_Type" Type="Edm.String" Nullable="true"/>
<NavigationProperty Name="ВидНоменклатуры" Relationship="StandardODATA.Catalog_ХарактеристикиНоменклатуры_ВидНоменклатуры" FromRole="Begin" ToRole="End"/>
<NavigationProperty Name="УдалитьВидНоменклатуры" Relationship="StandardODATA.Catalog_ХарактеристикиНоменклатуры_УдалитьВидНоменклатуры" FromRole="Begin" ToRole="End"/>
</EntityType>
3 RVN
 
18.03.25
10:52
а если написать
Owner eq guid'ae8d0dac-5a7c-11ed-88ce-d8bbc189bb8e'
?
4 hiwun
 
18.03.25
10:55
Тогда ошибка ибо Owner это строка и мы пытаемся сделать сравнение строки с guid

Код ошибки ниже

{
  "odata.error": {
    "code": "-1",
    "message": {
      "lang": "ru",
      "value": "{(3, 25)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля\n неограниченной длины и поля несовместимых типов.\n( sourceAlias.Owner )  \u003C\u003C?\u003E\u003E=  ( &fc_param0 )"
    }
  }
}
5 RVN
 
18.03.25
11:01
для номенклатуры odata включена?
6 hiwun
 
18.03.25
11:03
Да, включена
7 dmt
 
18.03.25
11:08
(0)
Отбор по Owner при запросе через oData

ИТС:

Имеется возможность выполнять отбор сущностей при помощи проверки на равенство поля составного типа и ссылки. Для этого следует использовать функцию cast().

Пример:
Копировать в буфер обмена

$filter=ДокументПрихода­eq­cast(guid'0d4a79cb-9843-4147-bcd9-80ac3ca2b9c7',­'Document_ПриходнаяНакладная')­

В данном примере у используемой сущности имеет реквизит составного типа ДокументПрихода. Запрос будет отбирать все записи сущности, у которой данный реквизит заполнен ссылкой на документ ПриходнаяНакладная с указанным уникальным идентификатором (0d4a79cb-9843-4147-bcd9-80ac3ca2b9c7).

Если требуется выполнить отбор по реквизиту типа УникальныйИдентификатор, то это выполняется с помощью простой операции сравнения:
Копировать в буфер обмена

$filter=ИмяРеквизита­eq­guid'0d4a79cb-9843-4147-bcd9-80ac3ca2b9c7'
8 hiwun
 
18.03.25
11:08
Уже изучали эту статью, там нет решения, просто комментарий - "разобрался, спасибо"

В документации про такие случаи не слова, там только типовые и шаблонные варианты

Опять же через функции like, substring, substringof, cast тоже пробовали, но они видят поле Owner, но любое другое видят, в чем секрет? Неизвестно
9 hiwun
 
18.03.25
11:10
(7) Тип Owner обычная строка Edm.String это не Guid, соответственно к нему не применимо guid'', и да, пробовали, не работает

Это не стандартная ситуация в которой мы не можем разобраться
10 dmt
 
18.03.25
11:12
(8) секрет видимо в поле составного типа
11 hiwun
 
18.03.25
11:18
(10) Кто кто уже сталкивался с работой с ними? Решение в интернете 0, по крайне мере там где искали

Нейронка тоже в тупике, предлагает типовые решения, не работающие
12 hiwun
 
18.03.25
11:19
Хотя казалось бы, задача вообще типовая и обычная, просто получить характеристики где guid номенклатуры равен owner, задача первого класса и на ней споткнуться
13 hiwun
 
18.03.25
11:22
UPD, разобрались, нашли решение, ответом ниже распишу
14 hiwun
 
18.03.25
11:25
Решение следующее $filter=Owner eq cast(guid'ae8d0dac-5a7c-11ed-88ce-d8bbc189bb8e', 'Catalog_Номенклатура')

Решение заключается в том, что мы тип Owner (который в метадате строка, но по факту никто не знает что он такое) сравниваем с искомым элементов через функцию cast где берем guid искомого элемента и приводим его к целевой сущности 'Catalog_Номенклатура'

После этой манипуляции запрос работает как надо, относительного нашего исходного запрос

Исходный запрос: Получить все характеристики, которые есть у НОМЕНКЛАТУРЫ
15 dmt
 
18.03.25
11:29
(14) ну т.е. все как написано в документации
16 hiwun
 
18.03.25
11:31
(15) Да, в путаницу вводит то, что в метадате тип поля обычный Edm.String, мы же разработчики прямолинейные, видим тип, знаем как работать

И когда выходит такое что в метадате ты видишь два поля с одинаковым типом, но к одному применяются правила типа, а к другому нет, это сильно путает и никакая дока не поможет, только метод проб и ошибок
Независимо от того, куда вы едете — это в гору и против ветра!