| | | 1 | | namespace Services.ApiServices._1CApi.OData; |
| | | 2 | | |
| | | 3 | | /// <summary> |
| | | 4 | | /// Сборка адресов виртуальных таблиц регистров 1С (<c>/Balance</c>, <c>/Turnovers</c>, <c>/SliceLast</c>). |
| | | 5 | | /// </summary> |
| | | 6 | | public static class OneCRegisterEndpoint |
| | | 7 | | { |
| | | 8 | | /// <summary> |
| | | 9 | | /// Добавляет отбор к виртуальной таблице. 1С Fresh не разрешает <c>$filter</c> по её измерениям — |
| | | 10 | | /// отвечает HTTP 500 «Операция не разрешена в предложении "ГДЕ"», из-за чего остатки в UI |
| | | 11 | | /// приходили пустыми. Условие должно уходить параметром <c>Condition</c> самой таблицы, |
| | | 12 | | /// то есть частью URL-фрагмента, а не строкой запроса. |
| | | 13 | | /// </summary> |
| | | 14 | | /// <param name="endpoint"> |
| | | 15 | | /// Адрес виртуальной таблицы, при необходимости с уже заданными параметрами |
| | | 16 | | /// (у <c>/Turnovers</c> это <c>StartPeriod</c> и <c>EndPeriod</c>) — тогда отбор дописывается к ним. |
| | | 17 | | /// </param> |
| | | 18 | | /// <param name="condition">Условие в синтаксисе OData; пустое значение оставляет адрес как есть.</param> |
| | | 19 | | public static string WithCondition(string endpoint, string? condition) |
| | | 20 | | { |
| | 63 | 21 | | if (string.IsNullOrWhiteSpace(condition)) |
| | 3 | 22 | | return endpoint; |
| | | 23 | | |
| | | 24 | | // Кириллица в именах измерений и пробелы вокруг eq/or обязаны быть закодированы: |
| | | 25 | | // без этого 1С либо не разбирает адрес, либо молча теряет отбор. |
| | 60 | 26 | | var parameter = $"Condition={Uri.EscapeDataString(condition.Trim())}"; |
| | | 27 | | |
| | 60 | 28 | | return endpoint.EndsWith(')') |
| | 60 | 29 | | ? $"{endpoint[..^1]},{parameter})" |
| | 60 | 30 | | : $"{endpoint}({parameter})"; |
| | | 31 | | } |
| | | 32 | | } |