diff --git a/backend/Tnsu.ApprovalRoute.Infrastructure/SharePoint/SharePointClient.cs b/backend/Tnsu.ApprovalRoute.Infrastructure/SharePoint/SharePointClient.cs index ce5738f..e41187b 100644 --- a/backend/Tnsu.ApprovalRoute.Infrastructure/SharePoint/SharePointClient.cs +++ b/backend/Tnsu.ApprovalRoute.Infrastructure/SharePoint/SharePointClient.cs @@ -123,12 +123,23 @@ public sealed class SharePointClient( public async Task> GetCustomFieldsAsync( string siteUrl, string listServerRelativeUrl, CancellationToken cancellationToken) { - // FromBaseType отсеивает колонки базового типа (Title, Author, Created …) — - // они есть в любом новом списке. Hidden/ReadOnlyField — служебные, их создать - // всё равно нельзя. Фильтр в OData, а не в C#, чтобы не тащить лишнее по сети. + // Ни FromBaseType, ни CanBeDeleted не годятся как признак «колонку явно + // добавили в список»: у переиспользуемых стандартных site-колонок SharePoint + // (например, «Department» — встроенная текстовая колонка из схемы v3, + // подключаемая через DelayActivateTemplateBinding) ОБА флага стоят как у + // настоящего системного поля, хотя колонка реально добавлена в список и в + // неё пишут данные. Из-за этого такие колонки тихо выпадали из копирования — + // без ошибки, просто без предупреждения. + // + // Поэтому здесь фильтруем только Hidden/ReadOnlyField (их создать всё равно + // нельзя), а отделять настоящие базовые поля (Title, ID, ContentType …) от + // явно добавленных — задача вызывающего кода: он сравнивает с полями + // ТОЛЬКО ЧТО СОЗДАННОГО пустого списка того же шаблона (см. CloneAsync, + // alreadyThere) — то, что есть на обоих, действительно базовое; то, что + // есть только на источнике, добавлено явно, независимо от флагов SharePoint. var url = $"{siteUrl.TrimEnd('/')}/_api/web/getList('{Escape(listServerRelativeUrl)}')/fields" + - "?$select=InternalName,SchemaXml,FromBaseType,Hidden,ReadOnlyField" + - "&$filter=Hidden eq false and ReadOnlyField eq false and FromBaseType eq false"; + "?$select=InternalName,SchemaXml,Hidden,ReadOnlyField" + + "&$filter=Hidden eq false and ReadOnlyField eq false"; var json = await GetAsync(siteUrl, url, cancellationToken); var rows = json.TryGetProperty("value", out var value) && value.ValueKind == JsonValueKind.Array