Обзор
Импорт в Discussions читает классический список Доска обсуждений (Discussion Board, шаблон 108 или базовый тип Discussion Board — в него входят и списки обсуждений сайтов сообщества) и записывает его содержимое в два списка сайта продукта — Discussions Topics и Discussions Posts. Эта статья — справочник к мастеру, описанному в статье KB10417. Как импортировать классическую доску обсуждений SharePoint в Discussions: какое классическое поле попадает в какой столбец Discussions, как реконструируется дерево ответов, что вычисляется, что остаётся позади и как импорт распознаёт свою работу при повторном запуске. Сами столбцы описаны в статье KB10426. Справочник списков и столбцов Discussions.
Как классическая доска хранит цепочку
Классическая доска обсуждений хранит каждое обсуждение как папку списка, а каждый ответ — как элемент внутри этой папки. Папка содержит тему, текст, флаг Вопрос, флаг Рекомендуемое, число лайков и идентификатор лучшего ответа; каждый ответ содержит собственный текст, число лайков и ссылку Родительский элемент (ParentItemID), указывающую либо на само обсуждение (ответ верхнего уровня), либо на другой ответ (вложенный). Импорт читает список страницами по 2 000 элементов, упорядоченными по идентификатору, и отличает папки от сообщений по типу элемента.
Discussions использует другую модель — один элемент на тему, один элемент на ответ, с подстановками на тему и на родительское сообщение, — поэтому импорт является переводом между двумя структурами, а не копией списка.
Темы
Каждое классическое обсуждение становится одним элементом списка Discussions Topics:
| Классическое обсуждение | Столбец Discussions Topics | Значение |
|---|---|---|
| Тема | Название | Копируется; обрезается до 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} |
| Кем создано, Кем изменено, Создан, Изменен | Те же системные столбцы | Восстанавливаются с параметром Сохранить исходных авторов и даты |
| Вложения | Вложения элемента | Копируются с параметром Скопировать вложения |
Ответы
Каждый классический ответ становится одним элементом списка Discussions Posts:
| Классический ответ | Столбец Discussions Posts | Значение |
|---|---|---|
| Тема | Название | Копируется; 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 — классический идентификатор перенесённого ответа). Ответы, вложенные в такой ответ, прикрепляются к нему как обычно.
Вложенность не ограничена: классический ответ пятого уровня попадает на пятый уровень.
«Сплющенные» доски и ответы-сироты
Некоторые инструменты миграции копируют элементы классической доски, но не ссылки Родительский элемент между ними; доска тогда выглядит как список обсуждений, все ответы которых лежат на одном уровне, или ссылки указывают на идентификаторы элементов, которых больше нет. Пробный прогон считает последние в строке Ответы без известного родителя (станут верхнего уровня) и показывает предупреждение Часть ответов потеряла родителя (доска была «сплющена» миграцией). Такие ответы прикрепляются непосредственно к своей теме в хронологическом порядке. Ответы с пустым полем Родительский элемент в этой строке не учитываются, но обрабатываются так же. Импорт не пытается угадать исходного родителя по времени или темам.
❗ Важно
Иерархию можно восстановить только по ссылкам, которые существуют в классическом списке на момент импорта. Если у вас ещё есть исходная доска — например, в SharePoint Server, — убедитесь, что инструмент миграции, которым вы переносите её в SharePoint Online, переносит столбец Родительский элемент; см. KB10419. Перенос досок обсуждений из SharePoint Server в SharePoint Online с помощью Discussions.
Лучшие ответы, счётчики и последняя активность
После создания всех ответов импорт ещё раз проходит по темам (этап Обновление счётчиков и ответов) и записывает для каждой темы плана:
- Ответы — число классических ответов в папке темы;
- Последняя активность — дата Создан самого нового классического ответа или дата Создан обсуждения, если ответов нет;
- Лайки — число лайков обсуждения;
- Принятый ответ и Статус = Answered — если классический Лучший ответ указывает на импортированный ответ; сам ответ получает Принятый ответ = Да. Классический флаг Есть ответ без лучшего ответа игнорируется, и тема остаётся Open.
Эти значения записываются для каждой темы плана, включая темы, импортированные в предыдущем запуске, поэтому повторный запуск пересчитывает счётчики.
Авторы и даты
Элементы списка, созданные через REST API, всегда имеют автором пользователя, который их создаёт. Если выбран параметр Сохранить исходных авторов и даты, импорт делает второй вызов на элемент, который записывает Кем создано (логин классического автора), Кем изменено (классический редактор или автор, если редактора нет), Создан и Изменен. SharePoint принимает эти значения только от учётных записей, которым разрешено задавать системные поля, — на практике от владельцев сайта с полным доступом. Если поле отклонено, отчёт содержит строку Название темы: Поле — сообщение SharePoint; если отклонён весь вызов — Не удалось восстановить автора и даты. Элемент всё равно импортируется с вами в качестве автора и временем импорта в качестве даты.
Логин автора должен разрешаться в учётную запись клиента. Удалённые учётные записи или локальные учётные записи, которые инструмент миграции не сопоставил, восстановить нельзя, и они дают то же предупреждение.

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