|
Отбор в 1C ODATA hiwun, dmt, Михаил Козлов, Хряк, RVN, _Batoo, tan76, Гипервизор, Hmster, , ass1c, kir-g, vbus, CaptanG, DeeK, Бычье сердце, Vostochnick, Victor111, Широкий, ЕRPe, DimVad, Prog_man, arsik, Ager, boozin, Anton1307, Страждущий, ReaLg, 2S, calmius, JeHer, PR, Скучный бух, fred001, новичекВ1С, segn, frmdtf1
| ☑ | ||
---|---|---|---|---|
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=ДокументПриходаeqcast(guid'0d4a79cb-9843-4147-bcd9-80ac3ca2b9c7','Document_ПриходнаяНакладная') В данном примере у используемой сущности имеет реквизит составного типа ДокументПрихода. Запрос будет отбирать все записи сущности, у которой данный реквизит заполнен ссылкой на документ ПриходнаяНакладная с указанным уникальным идентификатором (0d4a79cb-9843-4147-bcd9-80ac3ca2b9c7). Если требуется выполнить отбор по реквизиту типа УникальныйИдентификатор, то это выполняется с помощью простой операции сравнения: Копировать в буфер обмена $filter=ИмяРеквизитаeqguid'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, мы же разработчики прямолинейные, видим тип, знаем как работать
И когда выходит такое что в метадате ты видишь два поля с одинаковым типом, но к одному применяются правила типа, а к другому нет, это сильно путает и никакая дока не поможет, только метод проб и ошибок |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |