Мы сталкиваемся с распространенной, но крайне сложной проблемой: в старой базе 1С:Управление торговлей 11.5 накопилось порядка 14 миллионов записей ключей аналитики номенклатуры, практически все из которых являются дубликатами. Типовые средства удаления, такие как стандартная обработка по поиску и удалению дублей, работают крайне медленно (около 1000 записей в минуту) или вовсе выдают ошибки из-за слишком большого количества данных. В такой ситуации необходимо искать нестандартные, но эффективные решения. Рассмотрим различные подходы к решению этой задачи, от прямого доступа к базе данных до программной обработки XML-дампов и многопоточного удаления.
Прежде чем углубляться в решения, давайте выясним, почему типовые механизмы 1С оказываются неэффективными в таких масштабных случаях. Проблема замедленного удаления большого количества дубликатов кроется в нескольких факторах:
Типовая обработка "Поиск и удаление дублей" обычно предназначена для объединения дубликатов и переноса всех ссылок на один "правильный" объект. После этого помеченные на удаление объекты удаляются обработкой "Удаление помеченных объектов". Однако при таких объемах данных даже этап пометки на удаление может занять недели, а само удаление — месяцы.
Наиболее быстрым, но и наиболее рискованным способом решения проблемы является прямое взаимодействие с базой данных через SQL-запросы. Автор темы подтвердил, что именно этот метод позволил ему удалить 14 миллионов записей всего за 10 секунд. Однако мы подчеркиваем: этот подход требует глубокого понимания структуры базы данных 1С и сопряжен с высоким риском нарушения целостности данных.
Рассмотрим шаги для реализации этого метода:
Создание полной резервной копии: Прежде чем приступать к любым прямым изменениям в базе данных, обязательно создайте полную резервную копию. Это критически важный шаг, который позволит восстановить базу в случае непредвиденных проблем.
Анализ ссылочной целостности: Нам необходимо определить, на какие из 14 миллионов дубликатов есть ссылки из других таблиц. Если мы просто удалим записи, на которые есть ссылки, мы получим нерабочую базу данных с нарушенной ссылочной целостностью. Для этого можно использовать следующие подходы:
dbo._Reference123
КлючиАналитикиУчетаНоменклатуры
Определение "правильных" элементов и дубликатов: Нам нужно выбрать один "правильный" ключ аналитики для каждой группы дубликатов и пометить остальные как "к удалению". Это можно сделать на уровне 1С с помощью стандартных механизмов (например, через форму справочника "Ключи аналитики учета номенклатуры", если система не падает от объема) или также запросами. Допустим, у нас есть таблица со всеми ключами и временная таблица, где для каждой группы дубликатов указан
GUID
GUID
Перенос ссылок на "правильные" элементы: Этот этап является самым ответственным. Для каждой таблицы, которая ссылается на
КлючиАналитикиУчетаНоменклатуры
UPDATE
GUID
GUID
_AccumRg123
_InfoRg123
UPDATE ИмяТаблицыСоСсылками
SET ПолеСсылкиНаКлючАналитики = ПравильныйGUID
WHERE ПолеСсылкиНаКлючАналитики IN (GUID_Дубликат1, GUID_Дубликат2, ...);
Важно провести эту операцию для всех релевантных таблиц, где хранятся ссылки. Это могут быть таблицы движений по регистрам, таблицы значений реквизитов документов, и другие. В противном случае, после удаления дубликатов, вы получите "битые" ссылки в базе данных.
Удаление дубликатов: После того как все ссылки перенесены на "правильные" элементы, мы можем безопасно удалить записи дубликатов из основной таблицы
КлючиАналитикиУчетаНоменклатуры
DELETE FROM dbo._Reference123 -- Замените на фактическое имя таблицы ключей аналитики
WHERE GUID_КлючаАналитики IN (GUID_Дубликат1, GUID_Дубликат2, ...);
Или, если вы заранее пометили их как подлежащие удалению в отдельной таблице или с помощью флага:
DELETE FROM dbo._Reference123
WHERE ПометкаНаУдаление = 1;
Переиндексация базы данных: После таких масштабных изменений рекомендуется выполнить переиндексацию таблиц и обновление статистики базы данных. Это поможет оптимизировать производительность и избежать возможных проблем с запросами.
Внимание: Работа с прямыми SQL-запросами требует от вас не только навыков написания запросов, но и глубокого понимания внутренних механизмов 1С. Одно неверное движение может привести к необратимым повреждениям базы данных. Если вы не уверены в своих навыках, настоятельно рекомендуем обратиться к опытным специалистам.
Этот "хитрый" и элегантный метод представляет собой мощный инструмент для массового манипулирования данными, если прямые SQL-запросы кажутся слишком рискованными или недоступными. Он требует навыков работы со строками и файлами, но может быть реализован на любом языке программирования (Python, C#, или даже средствами 1С).
Рассмотрим пошаговую реализацию:
Выгрузка базы данных в XML-дамп: Используем типовой функционал 1С для выгрузки информационной базы в XML-дамп. Это можно сделать через стандартную обработку "Выгрузка данных для загрузки в облако" или "Выгрузка и загрузка данных XML". В результате вы получите ZIP-архив, содержащий множество XML-файлов, каждый из которых соответствует определенному типу метаданных (справочники, документы, регистры и т.д.).
Определение и извлечение XML-файла с ключами аналитики: В ZIP-архиве нам необходимо найти XML-файл, который содержит данные справочника
КлючиАналитикиУчетаНоменклатуры
Парсинг XML-файла и идентификация дубликатов: Используя выбранный язык программирования, открываем и парсим XML-файл. Для каждого ключа аналитики мы можем извлечь его
GUID
Пример структуры XML (упрощенно):
Формирование карты замены GUID'ов: Подобно SQL-методу, нам необходимо определить "правильный"
GUID
GUID
GUID
Корректировка дампа: Это ключевой этап, где происходят все изменения:
GUID
GUID
GUID
Загрузка скорректированного дампа: После всех изменений собираем ZIP-архив обратно и загружаем его в новую или текущую базу 1С. Система воспримет его как обычный дамп для восстановления/загрузки.
Преимущества метода:
Недостатки и особенности:
Если вы решите использовать 1С для работы с XML, можно применять стандартные механизмы работы с XML, такие как объекты
ЧтениеXML
ЗаписьXML
XDTO
Если прямая работа с SQL или XML-дампами кажется слишком сложной или рискованной, можно попытаться ускорить типовые механизмы 1С за счет многопоточности. Идея заключается в разделении большого объема работы на более мелкие "пачки" и выполнении этих пачек параллельно в фоновых заданиях.
Разберем шаги по организации многопоточного удаления:
Идентификация дубликатов: Сначала нам нужно получить список всех
GUID
GUID
Разбиение на пачки: Разделите список дубликатов на небольшие пачки, например, по 5000-20000 элементов в каждой. Размер пачки нужно будет подобрать экспериментально, чтобы найти оптимальный баланс между накладными расходами на запуск фоновых заданий и их параллельным выполнением.
Создание обработчика фонового задания: Напишите отдельную обработку или процедуру, которая будет принимать в качестве параметра список
GUID
НайтиСсылки
СправочникОбъект.КлючиАналитикиУчетаНоменклатуры
Попытка
ОбъектДубликат = СсылкиНаДубликаты[Индекс].ПолучитьОбъект();
Если ОбъектДубликат <> Неопределено Тогда
ОбъектДубликат.ПометкаУдаления = Истина;
ОбъектДубликат.Записать();
КонецЕсли;
Исключение
// Обработка ошибок, если объект уже удален или недоступен
КонецПопытки;
Запуск фоновых заданий: Используя механизм
ФоновыеЗадания
Для Каждого Пачка Из СписокПачек Цикл
ФоновыеЗадания.Выполнить(
"ИмяОбщегоМодуля.ПроцедураУдаления",
Пачка,
"УдалениеДубликатовКлючейАналитики",
Истина // В монопольном режиме
);
КонецЦикла;
Для ускорения процесса, рекомендуется заблокировать работу пользователей и активировать монопольный режим, если это возможно. В этом случае фоновые задания будут работать быстрее, так как не будет конфликтов блокировок с другими пользователями.
Контролируемое удаление помеченных объектов: После того как все фоновые задания завершили пометку на удаление, запустите стандартную обработку "Удаление помеченных объектов". Этот этап также может быть запущен в несколько потоков или разделен на более мелкие операции, если необходимо. Здесь же может помочь и
Тис с удалением не найденных ссылок
Этот метод не даст такой мгновенной скорости, как прямой SQL, но позволит значительно сократить время по сравнению с однопоточным типовым удалением, используя всю мощь серверного оборудования.
Это один из самых "чистых" и безопасных, хотя и трудоемких методов решения проблемы с накопившимися дубликатами. Идея заключается в том, чтобы создать совершенно новую, пустую базу данных и перенести в нее только актуальные и корректные данные, тем самым оставляя все дубликаты и "мусор" в старой базе.
Рассмотрим этапы реализации этого подхода:
Тщательная подготовка исходной базы: Перед переносом данных рекомендуется максимально "почистить" исходную базу. Это включает в себя:
Создание новой, чистой базы данных: Разверните новую информационную базу той же конфигурации (1С:УТ 11.5), что и исходная. Эта база должна быть абсолютно пустой.
Выбор метода переноса данных: Существует несколько способов переноса данных:
УниверсальныйОбменДаннымиXML
Определение объема и типа переносимых данных: При переносе в новую базу, мы можем выборочно переносить только то, что действительно нужно:
Контроль и сверка данных: После переноса необходимо провести тщательную сверку данных в новой базе с исходной. Убедитесь, что все остатки сходятся, а ключевые справочники заполнены корректно.
Преимущества метода:
Недостатки и особенности:
Независимо от выбранного метода удаления дубликатов, важно учитывать следующие общие рекомендации и подумать о профилактике возникновения подобных проблем в будущем:
Оптимизация производительности 1С и серверного оборудования:
Причины возникновения дубликатов и их предотвращение:
Монопольный режим: Для любых масштабных операций по удалению или изменению данных, запускайте 1С в монопольном режиме. Это значительно ускорит процесс за счет отсутствия блокировок и конфликтов с другими пользователями.
Резервное копирование: Еще раз подчеркнем: перед началом любых глобальных работ с базой данных, особенно прямыми SQL-запросами или обработкой дампов, всегда делайте полную резервную копию!
В заключение, проблема 14 миллионов дубликатов ключей аналитики номенклатуры в 1С:УТ 11.5, хоть и является серьезным вызовом, имеет несколько эффективных решений. Выбор конкретного метода зависит от вашей квалификации, доступности серверных ресурсов, допустимого уровня риска и времени, которое вы готовы потратить. Автор темы успешно справился с задачей с помощью SQL-запроса, что подтверждает его высокую эффективность при правильном подходе. Другие методы, такие как работа с XML-дампами или многопоточное удаление, также предоставляют мощные альтернативы для решения подобных задач.