В практике администрирования и разработки на платформе 1С:Предприятие часто возникает задача создания «чистой» базы данных на основе уже существующей рабочей системы. Это необходимо при свертке базы, начале ведения учета новой организации в аналогичной конфигурации (например, в «Управление производственным предприятием» или ERP) или при создании тестового контура. При этом критически важно сохранить справочники, настройки, роли и учетную политику, но полностью исключить документы и движения по регистрам.
В данной статье мы подробно рассмотрим два основных метода решения этой задачи, проанализируем их достоинства и недостатки, а также разберем критическую проблему — падение платформы в аварийный дамп при сохранении перенесенных пользователей на вызове метода ОбновитьИнтерфейс().
---
Этот способ заключается в том, что мы берем полную копию рабочей базы данных и программно (или средствами СУБД) удаляем из нее все документы. Главный плюс этого подхода — гарантированное сохранение всех настроек, учетной политики, констант, ролей, пользователей и внешних обработок. Нам не нужно думать о том, какие регистры сведений мы забыли перенести.
Однако стандартное удаление документов через интерфейс или простую обработку «пометка на удаление — удаление помеченных объектов» на базе, которая эксплуатировалась несколько лет, может занять колоссальное количество времени (вплоть до нескольких суток). Это связано с тем, что платформа при удалении каждого документа проверяет ссылочную целостность базы данных.
Для того чтобы ускорить процесс в десятки раз, необходимо программно отключить проверку транзакционных правил и бизнес-логики с помощью свойства ОбменДанными.Загрузка = Истина. Также перед удалением самих документов рекомендуется сначала очистить движения по регистрам. Рассмотрим пример обработки, которая эффективно решает эту задачу:
// Процедура очистки документов и их движений
Процедура ОчиститьВсеДокументыНаСервере()
// Отключаем выполнение регламентных заданий, если это необходимо
// Пробежимся по всем метаданным документов в цикле
Для Каждого МетаДокумент Из Метаданные.Документы Цикл
ИмяДокумента = МетаДокумент.Имя;
Выборка = Документы[ИмяДокумента].Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.ПолучитьОбъект();
// Включаем режим загрузки данных, чтобы обойти проверки в подписках и модулях
ДокОбъект.ОбменДанными.Загрузка = Истина;
// Если документ проведен, сначала отменим проведение без вызова бизнес-логики
Если ДокОбъект.Проведен Тогда
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Исключение
ЗаписьЖурналаРегистрации("ОчисткаБазы", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось отменить проведение: " + ДокОбъект.Ссылка + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
// Удаляем объект непосредственно из базы данных
Попытка
ДокОбъект.Удалить();
Исключение
ЗаписьЖурналаРегистрации("ОчисткаБазы", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось удалить документ: " + ДокОбъект.Ссылка + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
После завершения работы данной обработки в базе могут остаться так называемые «битые ссылки» (например, если в справочнике «Договоры контрагентов» был реквизит, ссылающийся на документ расчетов). Чтобы привести базу в порядок, обязательно запускаем процедуру Тестирование и исправление (ТиС) со следующими настройками:
Если база данных находится на MS SQL Server или PostgreSQL, самым быстрым способом (занимающим буквально пару минут) является очистка таблиц документов напрямую. Для этого используются SQL-запросы очистки таблиц:
_Document._AccumReg._AccReg._InfoReg.Важное предупреждение: Использование этого метода полностью снимает контроль ссылочной целостности со стороны платформы 1С. После выполнения SQL-запроса TRUNCATE TABLE запуск процедуры «Тестирование и исправление» в режиме очистки битых ссылок является строго обязательным, иначе база будет повреждена и не сможет нормально функционировать.
---
Этот метод предполагает создание абсолютно чистой информационной базы и последующий перенос в нее справочной информации и настроек из рабочей базы.
Разберем по шагам, как выполнить эту процедуру корректно, избегая типичных ошибок:
.cf) и загрузите ее в новую пустую базу. Это гарантирует 100% идентичность структуры метаданных, наличие всех ролей, интерфейсов и общих модулей.---
Рассмотрим ситуацию, описанную в сообщениях 11 и 13: после успешного переноса справочника «Пользователи» в новую базу при попытке сохранить карточку пользователя (или войти под ним в систему) программа аварийно завершает работу с созданием дампа памяти (Access Violation). Ошибка локализована на системной процедуре ОбновитьИнтерфейс().
Метод глобального контекста ОбновитьИнтерфейс() заставляет платформу перерисовать командный интерфейс, панели разделов и начальную страницу в соответствии с правами и персональными настройками текущего пользователя. Падение в дамп происходит из-за критического конфликта данных:
Для устранения этой критической ошибки выполните следующие действия:
Нам необходимо сбросить все индивидуальные настройки интерфейса, которые вызывают сбой платформы. Для этого используем следующую обработку (запустите ее под пользователем с полными правами):
Процедура ОчиститьНастройкиИнтерфейсаПользователей() Экспорт
// Очищаем кэш настроек панели разделов и начальной страницы для всех пользователей
ВыборкаПользователей = Справочники.Пользователи.Выбрать();
Пока ВыборкаПользователей.Следующий() Цикл
ИмяПользователяИБ = ВыборкаПользователей.Имя;
Попытка
// Удаляем настройки рабочего стола и интерфейса
ХранилищеСистемныхНастроек.Удалить("Общее/НастройкиНачальнойСтраницы", , ИмяПользователяИБ);
ХранилищеСистемныхНастроек.Удалить("Общее/ПанельРазделов/НастройкиПользователя", , ИмяПользователяИБ);
ЗаписьЖурналаРегистрации("ОчисткаНастроек", УровеньЖурналаРегистрации.Информация, , ,
"Настройки пользователя " + ИмяПользователяИБ + " успешно очищены.");
Исключение
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Не переносите справочник «Пользователи» «в лоб» через XML, если не планируете пересоздавать учетные записи конфигуратора вручную. Правильный алгоритм сопоставления:
Поскольку ошибка дампа связана с утечкой памяти из-за неверных указателей на структуры интерфейса, обязательно очистите локальный кэш на компьютере разработчика и пользователей:
%localappdata%\1C\1cv8%appdata%\1C\1cv8rphost), чтобы очистить серверный кэш метаданных.