From 1dff7c711221f38f67261462675b082b2fa16bd0 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Tue, 18 Aug 2026 16:07:11 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B6?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D1=81=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D0=B1=D1=86=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SharePoint/SharePointClient.cs | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) 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