Задача разделения информационной базы (ИБ) на несколько частей — одна из самых ресурсоемких и технически сложных в администрировании 1С. Особенно остро эта проблема стоит для крупных конфигураций, таких как 1С:ERP или 1С:Комплексная автоматизация, где количество связей между объектами огромно, а объемы данных исчисляются сотнями гигабайт.
В этой статье мы подробно разберем ситуацию, когда необходимо выделить одну организацию в отдельную базу («отпочковать» её), сохранив при этом всю историю учета, но убрав данные по другим организациям. Рассмотрим три основные стратегии решения этой задачи, проанализируем риски и найдем способы ускорить процесс, который стандартными средствами может занять месяцы.
Если проанализировать опыт специалистов, сталкивавшихся с подобной задачей, можно выделить три глобальных пути:
Давайте подробно рассмотрим каждый из них, выявим подводные камни и определим, как действовать наиболее эффективно.
Это наиболее «штатный» метод, предусмотренный платформой 1С. Идея заключается в создании периферийного узла, в который мигрируют данные только по выбранной организации.
Алгоритм действий:
Администрирование - Синхронизация данных).Полный или РИБ с фильтром по подразделению/организации (в типовых ERP обычно есть план обмена «С отбором» или «По Организации»).Для отключения базы от главного узла можно использовать параметр запуска /ResetMasterNode или выполнить следующий код в новой базе:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
Проблемы и нюансы:
Автор обсуждения пошел именно по этому пути и столкнулся с катастрофической нехваткой времени. Стандартное удаление через Пометить на удаление -> Удаление помеченных объектов выполняет контроль ссылочной целостности для каждого объекта. В базе ERP с миллионами записей регистров это работает крайне медленно.
Давайте разберем, как ускорить этот процесс в десятки раз.
Самое долгое при удалении документа — это удаление его записей из регистров накопления, бухгалтерии и сведений, а также пересчет итогов. Если мы удаляем 90% базы, нет смысла пересчитывать итоги после каждого документа.
Мы должны программно очистить регистры до удаления документов. Это можно сделать, отключив итоги.
Примерный алгоритм для обработки:
// Отключаем использование итогов для ускорения
Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
РегистрыНакопления[Регистр.Имя].УстановитьИспользованиеИтогов(Ложь);
КонецЦикла;
// Далее выполняем очистку записей по "чужим" организациям
// Лучше всего использовать прямые SQL запросы (truncate) если есть квалификация,
// либо НаборыЗаписей с отбором по Регистратору, если удаляем документы целиком.
Однако, еще более быстрый способ — не чистить движения выборочно, а удалить документы непосредственно (без контроля ссылочной целостности), но с умом.
Вместо пометки на удаление используем метод Удалить(). Но делать это нужно аккуратно.
Если просто запустить Объект.Удалить(), 1С все равно будет искать ссылки. Чтобы ускорить процесс, можно использовать удаление наборов записей или прямые запросы (если база на SQL), но оставаясь в рамках 1С, тактика следующая:
Удалить().Важно: При удалении документа, платформа автоматически удалит его движения. Это будет быстрее, чем через стандартную обработку, но все равно может быть долго.
После массового удаления «без контроля» у нас останутся «битые» ссылки (например, в реквизитах документов оставшейся организации могут быть ссылки на удаленные документы-основания). Обязательно запускаем ТИИ в Конфигураторе:
Этот способ часто оказывается предпочтительнее для ERP, так как позволяет получить "чистую" базу без хвостов удаленных данных.
Мы можем использовать стандартную обработку «Выгрузка и загрузка данных XML» (с ИТС). Она позволяет выгружать данные с отбором.
Схема действий:
Независимо от выбранного метода (удаление или перенос), в ERP есть специфические механизмы, которые сломаются при разделении.
Если в базе велся учет перепродаж между организациями (например, Организация А продавала товар Организации Б), то документы связаны цепочками. В документе поступления у Организации Б в качестве партнера указана Организация А.
Проблема: Если мы оставляем только Организацию Б, а Организацию А удаляем, то в документах поступления поле «Партнер» станет битой ссылкой или пустым. Это приведет к ошибкам в закрытии месяца, расчете себестоимости и формировании книг покупок/продаж.
Решение: Перед разделением необходимо обработкой заменить ссылки.
Контрагенты и Партнеры).Данные для расчета среднего заработка хранятся в регистрах накопления, которые могут не иметь измерения Организация или иметь сложную структуру.
При использовании метода «Выгрузка XML» часто теряются записи регистров сведений и накопления, не подчиненных регистратору (документу), а также история штатного расписания. При использовании метода «Удаление» эти данные сохраняются, но их нужно тщательно проверять.
Для корректного переноса зарплатного блока рекомендуется:
Давайте подведем итог. Учитывая объем базы и сложность ERP, рекомендация следующая:
Удалить(), так как их движения уже пусты).Метод «Выгрузка XML» в чистую базу для ERP рекомендуется использовать с осторожностью из-за риска потери настроек учетной политики и сложных связей регистров себестоимости.