Обзор
Импорт в Discussions читает классический список Доска обсуждений (Discussion Board, шаблон 108 или базовый тип Discussion Board - в него входят и списки обсуждений сайтов сообщества) и записывает его содержимое в два списка сайта продукта - Темы обсуждений и Сообщения обсуждений. Эта статья - справочник к мастеру, описанному в статье KB10417. Как импортировать классическую доску обсуждений SharePoint в Discussions: какое классическое поле попадает в какой столбец Discussions, как реконструируется дерево ответов, что вычисляется, что не переносится и как импорт распознаёт свою работу при повторном запуске. Сами столбцы описаны в статье KB10426. Справочник списков и столбцов Discussions.
Как классическая доска хранит цепочку
Классическая доска обсуждений хранит каждое обсуждение как папку списка, а каждый ответ - как элемент внутри этой папки. Папка содержит тему, текст, флаг Вопрос, флаг Рекомендуемое, число лайков и идентификатор лучшего ответа; каждый ответ содержит собственный текст, число лайков и ссылку Родительский элемент (ParentItemID), указывающую либо на само обсуждение (ответ верхнего уровня), либо на другой ответ (вложенный). Импорт читает список страницами по 2 000 элементов, упорядоченными по идентификатору, и отличает папки от сообщений по типу элемента.
Discussions использует другую модель - один элемент на тему, один элемент на ответ, с подстановками на тему и на родительское сообщение, - поэтому импорт преобразует одну структуру в другую, а не копией списка.
Темы
Каждое классическое обсуждение становится одним элементом списка Темы обсуждений:
| Классическое обсуждение | Столбец Темы обсуждений | Значение |
|---|---|---|
| Тема | Название | Копируется; обрезается до 255 символов |
| Текст | Содержимое (VtxBody) | Копируется через HTML-санитайзер продукта: разрешённые теги и атрибуты остаются, скрипты, стили и небезопасные ссылки отбрасываются |
| - | Доска (VtxBoard) | Доска, выбранная в веб-части |
| Вопрос | Тип (VtxTopicType) | Question (вопрос), если флаг установлен, иначе Discussion (обсуждение) |
| - | Статус (VtxStatus) | Open (открыта); меняется на Answered (есть ответ), если найден лучший ответ (см. ниже) |
| Рекомендуемое | Рекомендуемая (VtxIsFeatured) | Копируется |
| Число лайков | Лайки (VtxLikeCount) | Копируется |
| Ответы в папке | Ответы (VtxReplyCount) | Подсчитывается импортом |
| - | Просмотры (VtxViewCount) | 0 |
| Дата создания последнего ответа или обсуждения | Последняя активность (VtxLastActivity) | Вычисляется импортом |
| Лучший ответ | Принятый ответ (VtxAcceptedPostId) | Идентификатор импортированного ответа |
| - | Статус утверждения (VtxApprovalStatus) | Approved (утверждено) |
| - | Жалобы (VtxReportCount) | 0 |
| Идентификатор списка и элемента | Прежний идентификатор (VtxLegacyId) | {source list id}:{classic item id} |
| Кем создано, Кем изменено, Создан, Изменен | Те же системные столбцы | Восстанавливаются с параметром Сохранить исходных авторов и даты |
| Вложения | Вложения элемента | Копируются с параметром Скопировать вложения |
Ответы
Каждый классический ответ становится одним элементом списка Сообщения обсуждений:
| Классический ответ | Столбец Сообщения обсуждений | Значение |
|---|---|---|
| Тема | Название | Копируется; Re:, если пусто; обрезается до 255 символов |
| Текст | Содержимое (VtxBody) | Копируется через санитайзер |
| Папка ответа | Тема (VtxTopic) | Импортированная тема этой папки |
| Родительский элемент | Родительское сообщение (VtxParentPost) | Импортированный родительский ответ; пусто для ответа верхнего уровня |
| - | Путь (VtxPath) | / для ответа верхнего уровня; путь родителя плюс идентификатор родителя и / для вложенного, например /341/356/ |
| - | Уровень (VtxDepth) | 0 для ответа верхнего уровня, иначе уровень родителя + 1 |
| Лучший ответ обсуждения | Принятый ответ (VtxIsAccepted) | Да для ответа, на который указывает обсуждение |
| Число лайков | Лайки (VtxLikeCount) | Копируется |
| - | Статус утверждения, Жалобы | Approved, 0 |
| Идентификатор списка и элемента | Прежний идентификатор (VtxLegacyId) | {source list id}:{classic item id} |
| Кем создано, Кем изменено, Создан, Изменен | Те же системные столбцы | Восстанавливаются с параметром Сохранить исходных авторов и даты |
| Вложения | Вложения элемента | Копируются с параметром Скопировать вложения |

Что не копируется
- Оценки (звёздные рейтинги) и список людей, которым понравился элемент. Число лайков копируется; столбец Кому понравилось остаётся пустым, поэтому каждый пользователь может ещё раз поставить лайк импортированному элементу.
- Категории: у классических досок их нет, и импорт оставляет столбец Категория пустым. Назначьте категории после импорта, если доска их использует.
- Число просмотров: начинается с 0.
- Последний ответ: остаётся пустым; веб-часть показывает автора последнего ответа только для ответов, написанных после импорта.
- Оповещения, классические представления и формы списка: они принадлежат классическому списку и не имеют эквивалента в Discussions. Подписки пользователи создают заново - см. KB10404. Подписка на доски и темы: подписки и частота сводок.
- Закреплённые темы: у классических досок такого флага нет; закрепите нужные темы после импорта.
Как восстанавливается дерево ответов
- Ответы сортируются по классической дате Создан, от самых старых, чтобы родитель всегда создавался раньше потомков.
- Для каждого ответа импорт находит его тему по папке, в которой лежит ответ. Ответ, папка которого не соответствует ни одной импортированной теме, пропускается с предупреждением Ответ пропущен: его тема не импортирована.
- Классический Родительский элемент ищется среди ответов, импортированных в этом запуске или ранее. Если он указывает на ответ, новое сообщение получает этот ответ как Родительское сообщение, наследует его Путь и получает Уровень + 1. Если он указывает на само обсуждение, пуст или указывает на элемент, неизвестный импорту, сообщение становится ответом верхнего уровня темы с путём
/и уровнем 0. Если родительский ответ есть в классическом списке, но создать его в этом запуске не удалось, сообщение тоже помещается на верхний уровень, а в отчёт добавляется предупреждение Родительский ответ не импортирован; ответ помещён на верхний уровень: 419 (419 - классический идентификатор перенесённого ответа). Ответы, вложенные в такой ответ, прикрепляются к нему как обычно.
Вложенность требует корректных родительских ссылок в порядке создания и ограничивается длиной пути родителей в 255 символов. При повторном импорте текущая реализация считает ранее импортированных родителей элементами уровня 0 с путём /; новые ответы на них могут получить неверный уровень или путь. После дополнительного импорта проверьте вложенные ответы.
«Сплющенные» доски и ответы-сироты
Некоторые инструменты миграции копируют элементы классической доски, но не ссылки Родительский элемент между ними; доска тогда выглядит как список обсуждений, все ответы которых лежат на одном уровне, или ссылки указывают на идентификаторы элементов, которых больше нет. Пробный прогон считает последние в строке Ответы без известного родителя (станут верхнего уровня) и показывает предупреждение Часть ответов потеряла родителя (доска была «сплющена» миграцией). Такие ответы прикрепляются непосредственно к своей теме в хронологическом порядке. Ответы с пустым полем Родительский элемент в этой строке не учитываются, но обрабатываются так же. Импорт не пытается угадать исходного родителя по времени или темам.
❗ Важно
Иерархию можно восстановить только по ссылкам, которые существуют в классическом списке на момент импорта. Если у вас ещё есть исходная доска - например, в SharePoint Server, - убедитесь, что инструмент миграции, которым вы переносите её в SharePoint Online, переносит столбец Родительский элемент.
Лучшие ответы, счётчики и последняя активность
После создания всех ответов импорт ещё раз проходит по темам (этап Обновление счётчиков и ответов) и записывает для каждой темы плана:
- Ответы - число классических ответов в папке темы;
- Последняя активность - дата Создан самого нового классического ответа или дата Создан обсуждения, если ответов нет;
- Лайки - число лайков обсуждения;
- Принятый ответ и Статус = Answered - если классический Лучший ответ указывает на импортированный ответ; сам ответ получает Принятый ответ = Да. Классический флаг Есть ответ без лучшего ответа игнорируется, и тема остаётся Open.
Эти значения записываются для каждой темы плана, включая темы, импортированные в предыдущем запуске, поэтому повторный запуск пересчитывает счётчики.
Число ответов берётся из классического источника, включая ответы, которые не удалось импортировать. Если в отчёте есть ошибки, сравните счётчик с фактически перенесёнными ответами.
Авторы и даты
Элементы, созданные через REST API, первоначально получают текущего пользователя как автора и время импорта как даты. Если включён параметр Сохранить исходных авторов и даты, импорт восстанавливает Кем создано, Кем изменено, Создан и Изменен у новых элементов через SharePoint CSOM после обновления вложений, счётчиков и ответов. Исходные автор и редактор сопоставляются с пользователями сайта; если редактор не найден, используется автор. Учётная запись должна иметь право задавать системные поля — обычно это владелец сайта с полным доступом. Ошибки записываются как Название темы: ошибка SharePoint или Не удалось восстановить автора и даты. Элемент остаётся импортированным; невосстановленные поля сохраняют текущие значения.
Логин автора должен разрешаться в учётную запись клиента. Удалённые учётные записи или локальные учётные записи, которые инструмент миграции не сопоставил, восстановить нельзя, и они дают то же предупреждение.

Вложения
Если выбран параметр Скопировать вложения, импорт получает список файлов вложений каждой классической темы и ответа, скачивает каждый файл с исходного сайта и прикрепляет его к новому элементу под исходным именем. Символы, которые SharePoint не допускает в именах файлов (\ / : * ? " < > | # % & { } ~), заменяются подчёркиванием, а имена длиннее 120 символов сокращаются. Файл, который не удалось скопировать, даёт предупреждение имя файла: сообщение SharePoint, а остальные файлы всё равно обрабатываются. Адреса встроенных изображений сохраняются в очищенном HTML. Сами файлы изображений не копируются; исходные файлы и их адреса должны оставаться доступными.
Прежний идентификатор и повторный запуск импорта
Каждая импортированная тема и каждый ответ хранят {source list id}:{classic item id} в индексированном столбце Прежний идентификатор - например 3f2a9c1e-…:418. Перед пробным прогоном и перед импортом мастер читает все прежние идентификаторы сайта, которые начинаются с идентификатора выбранного классического списка. Следствия:
- тема, у которой уже есть прежний идентификатор, пропускается и учитывается в строке Темы уже импортированы (будут пропущены); её существующая копия используется как родитель для новых ответов;
- ответ, у которого уже есть прежний идентификатор, тоже пропускается;
- новые ответы на уже импортированную тему импортируются, поэтому доску, которой ещё пользуются, можно импортировать инкрементально;
- авторы, даты и вложения восстанавливаются только для элементов, созданных в текущем запуске;
- названия и тексты существующих тем не перезаписываются, но счётчики, активность и ссылки на принятые ответы могут обновляться; импортированные элементы не удаляются.
📝 Заметка
Прежний идентификатор включает идентификатор классического списка. Если классическую доску скопировать в новый список - например, повторным проходом миграции или копированием сайта, - у нового списка будет другой идентификатор, и импорт из него создаст второй набор тем. Всегда импортируйте из одного и того же списка или удалите первый набор перед импортом из копии.