Иногда при записи xml программа зависает и выдаёт ошибку "Выдано исключение типа System.OutOfMemoryException".
Это связано с данными в таблице ED_DOCS_FOLDERS - в ней содержится огромное количество дубликатов связей ДТ+Формализованный документ.
Для решения данной проблемы необходимо сделать следующее:
1. Обязательно сделать бэкап. Взять на контроль несколько произвольных ДТ с описью с формализованными документами
2. Выполнить запрос, который посчитает количество уникальных связей ND+DocId. Результат нужно сохранить как контрольное значение.
SELECT COUNT (*)
FROM
(SELECT ND, DocId
FROM ED_DOCS_FOLDERS
GROUP BY DocId, ND
HAVING COUNT(DocId) > 0) AS tbl
3. Удалить лишнее, используя "Проводник данных".
Access, одним запросом
DELETE DISTINCTROW tbl1.* FROM ED_DOCS_FOLDERS tbl1 INNER JOIN (SELECT MIN(ID) AS ID2, ND, DocId FROM ED_DOCS_FOLDERS GROUP BY DocId, ND HAVING COUNT(DocId) > 1) AS tbl2 ON tbl1.ND = tbl2.ND AND tbl1.DocId = tbl2.DocId WHERE tbl1.ID <> tbl2.ID2
Access, через временные таблицы
-- создать временную таблицу CREATE TABLE temp (ID INTEGER PRIMARY KEY)
-- вставить во временную таблицу идентификаторы связей, которые нужно сохранить
INSERT INTO temp (ID) SELECT MIN(ID) FROM ED_DOCS_FOLDERS GROUP BY DocId, ND HAVING COUNT(DocId) > 0
-- удалить дубликаты (на приложенной базе занимает очень много времени, у меня операция заняла около 10 минут - подготовка + удаление)
DELETE FROM ED_DOCS_FOLDERS WHERE ID NOT IN (SELECT * FROM temp)
-- удалить временную таблицу
DROP TABLE temp
-- сравнить оставшееся кол-во связей с контрольным значением
SELECT COUNT(*) FROM (SELECT ND FROM ED_DOCS_FOLDERS GROUP BY DocId, ND HAVING COUNT(DocId) > 0)
4. Проверить состояние описи по ДТ - все документы, прикрепленные к описи должны там остаться