| | | 1 | | namespace Services.ApiServices._1CApi.OData; |
| | | 2 | | |
| | | 3 | | /// <summary> |
| | | 4 | | /// 1С отказалась провести документ (ответ на /Post — не 2xx). |
| | | 5 | | /// |
| | | 6 | | /// Это ожидаемый бизнес-исход, а не сбой интеграции: чаще всего не хватает остатка на |
| | | 7 | | /// складе-отправителе. Документ остаётся созданным, но непроведённым, а причина уходит |
| | | 8 | | /// пользователю в <c>PostingError</c> и показывается в алерте транзакции. |
| | | 9 | | /// Поэтому вызывающая сторона пишет такой отказ в лог как Information: Warning/Error попадают |
| | | 10 | | /// в файл errors-*.log и заводят автоматический issue на штатную ситуацию. |
| | | 11 | | /// Error остаётся для настоящих сбоев обмена (сеть, таймаут, авторизация). |
| | | 12 | | /// |
| | | 13 | | /// <see cref="Message"/> уже человекочитаем (<see cref="OneCDocumentPostingMessage"/>) и годится |
| | | 14 | | /// для показа пользователю; технические подробности — в <see cref="Endpoint"/> и <see cref="Detail"/>. |
| | | 15 | | /// <see cref="Detail"/> укорочен до 500 символов для показа; текст ответа 1С целиком — в |
| | | 16 | | /// <see cref="OneCODataException.Error"/> (<see cref="FullDetail"/>). |
| | | 17 | | /// |
| | | 18 | | /// Наследуется от <see cref="InvalidOperationException"/> (через <see cref="OneCODataException"/>), чтобы |
| | | 19 | | /// не ломать код, который уже ловит проведение документа по базовому типу. |
| | | 20 | | /// </summary> |
| | | 21 | | public sealed class OneCDocumentPostingException(string message, string endpoint, string detail, OneCODataError? error = |
| | 11 | 22 | | : OneCODataException(message, error) |
| | | 23 | | { |
| | | 24 | | /// <summary>OData-эндпоинт документа, например <c>Document_ПеремещениеЗапасов</c>.</summary> |
| | 12 | 25 | | public string Endpoint { get; } = endpoint; |
| | | 26 | | |
| | | 27 | | /// <summary>Причина отказа в том виде, в каком её вернула 1С (для показа, может быть укорочена).</summary> |
| | 16 | 28 | | public string Detail { get; } = detail; |
| | | 29 | | |
| | | 30 | | /// <summary>Полный текст отказа 1С: статус, код и причина без усечения.</summary> |
| | 5 | 31 | | public string FullDetail => Error?.ToDetailText() ?? Detail; |
| | | 32 | | } |