Как создать базу 1С без документов на основе существующей и исправить ошибку дампа при сохранении пользователя

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В практике администрирования и разработки на платформе 1С:Предприятие часто возникает задача создания «чистой» базы данных на основе уже существующей рабочей системы. Это необходимо при свертке базы, начале ведения учета новой организации в аналогичной конфигурации (например, в «Управление производственным предприятием» или ERP) или при создании тестового контура. При этом критически важно сохранить справочники, настройки, роли и учетную политику, но полностью исключить документы и движения по регистрам.

В данной статье мы подробно рассмотрим два основных метода решения этой задачи, проанализируем их достоинства и недостатки, а также разберем критическую проблему — падение платформы в аварийный дамп при сохранении перенесенных пользователей на вызове метода ОбновитьИнтерфейс().

---

Метод 1. Полная очистка копии базы данных (Удаление документов и движений)

Этот способ заключается в том, что мы берем полную копию рабочей базы данных и программно (или средствами СУБД) удаляем из нее все документы. Главный плюс этого подхода — гарантированное сохранение всех настроек, учетной политики, констант, ролей, пользователей и внешних обработок. Нам не нужно думать о том, какие регистры сведений мы забыли перенести.

Однако стандартное удаление документов через интерфейс или простую обработку «пометка на удаление — удаление помеченных объектов» на базе, которая эксплуатировалась несколько лет, может занять колоссальное количество времени (вплоть до нескольких суток). Это связано с тем, что платформа при удалении каждого документа проверяет ссылочную целостность базы данных.

Оптимизированное программное удаление документов

Для того чтобы ускорить процесс в десятки раз, необходимо программно отключить проверку транзакционных правил и бизнес-логики с помощью свойства ОбменДанными.Загрузка = Истина. Также перед удалением самих документов рекомендуется сначала очистить движения по регистрам. Рассмотрим пример обработки, которая эффективно решает эту задачу:


// Процедура очистки документов и их движений
Процедура ОчиститьВсеДокументыНаСервере()
    
    // Отключаем выполнение регламентных заданий, если это необходимо
    // Пробежимся по всем метаданным документов в цикле
    Для Каждого МетаДокумент Из Метаданные.Документы Цикл
        
        ИмяДокумента = МетаДокумент.Имя;
        Выборка = Документы[ИмяДокумента].Выбрать();
        
        Пока Выборка.Следующий() Цикл
            
            ДокОбъект = Выборка.ПолучитьОбъект();
            
            // Включаем режим загрузки данных, чтобы обойти проверки в подписках и модулях
            ДокОбъект.ОбменДанными.Загрузка = Истина;
            
            // Если документ проведен, сначала отменим проведение без вызова бизнес-логики
            Если ДокОбъект.Проведен Тогда
                Попытка
                    ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
                Исключение
                    ЗаписьЖурналаРегистрации("ОчисткаБазы", УровеньЖурналаРегистрации.Ошибка, , , 
                        "Не удалось отменить проведение: " + ДокОбъект.Ссылка + " - " + ОписаниеОшибки());
                КонецПопытки;
            КонецЕсли;
            
            // Удаляем объект непосредственно из базы данных
            Попытка
                ДокОбъект.Удалить();
            Исключение
                ЗаписьЖурналаРегистрации("ОчисткаБазы", УровеньЖурналаРегистрации.Ошибка, , , 
                    "Не удалось удалить документ: " + ДокОбъект.Ссылка + " - " + ОписаниеОшибки());
            КонецПопытки;
            
        КонецЦикла;
    КонецЦикла;
    
КонецПроцедуры

После завершения работы данной обработки в базе могут остаться так называемые «битые ссылки» (например, если в справочнике «Договоры контрагентов» был реквизит, ссылающийся на документ расчетов). Чтобы привести базу в порядок, обязательно запускаем процедуру Тестирование и исправление (ТиС) со следующими настройками:

  1. Реиндексация таблиц информационной базы.
  2. Проверка ссылочной целостности базы данных.
  3. При наличии ссылок на несуществующие объекты: Очищать объекты или Удалять деструктивные ссылки.

Прямое удаление через СУБД (Для клиент-серверного варианта)

Если база данных находится на MS SQL Server или PostgreSQL, самым быстрым способом (занимающим буквально пару минут) является очистка таблиц документов напрямую. Для этого используются SQL-запросы очистки таблиц:

Важное предупреждение: Использование этого метода полностью снимает контроль ссылочной целостности со стороны платформы 1С. После выполнения SQL-запроса TRUNCATE TABLE запуск процедуры «Тестирование и исправление» в режиме очистки битых ссылок является строго обязательным, иначе база будет повреждена и не сможет нормально функционировать.

---

Метод 2. Создание новой базы и перенос справочников (XML-экспорт)

Этот метод предполагает создание абсолютно чистой информационной базы и последующий перенос в нее справочной информации и настроек из рабочей базы.

Разберем по шагам, как выполнить эту процедуру корректно, избегая типичных ошибок:

  1. Создание пустой базы правильной конфигурации: Не пытайтесь настраивать новую базу вручную. Снимите конфигурацию с рабочей базы в файл (Конфигурация -> Сохранить конфигурацию в файл .cf) и загрузите ее в новую пустую базу. Это гарантирует 100% идентичность структуры метаданных, наличие всех ролей, интерфейсов и общих модулей.
  2. Использование обработки «Выгрузка и загрузка данных XML»: Данная обработка поставляется на диске ИТС. Она позволяет переносить данные между абсолютно идентичными конфигурациями напрямую по ссылкам.
  3. Перенос учетной политики и системных настроек: Главная ошибка новичков при XML-переносе — выгрузка только справочников. В конфигурациях класса УПП учетная политика, счета учета номенклатуры, настройки параметров учета и курсы валют хранятся в независимых регистрах сведений. При выгрузке обязательно отметьте галочками все константы и независимые регистры сведений, исключив только документы и подчиненные им регистры движений.

---

Анализ и устранение ошибки дампа при вызове метода ОбновитьИнтерфейс()

Рассмотрим ситуацию, описанную в сообщениях 11 и 13: после успешного переноса справочника «Пользователи» в новую базу при попытке сохранить карточку пользователя (или войти под ним в систему) программа аварийно завершает работу с созданием дампа памяти (Access Violation). Ошибка локализована на системной процедуре ОбновитьИнтерфейс().

Выясним причину падения

Метод глобального контекста ОбновитьИнтерфейс() заставляет платформу перерисовать командный интерфейс, панели разделов и начальную страницу в соответствии с правами и персональными настройками текущего пользователя. Падение в дамп происходит из-за критического конфликта данных:

Пошаговое решение проблемы с дампом

Для устранения этой критической ошибки выполните следующие действия:

Шаг 1. Очистка хранилища системных настроек

Нам необходимо сбросить все индивидуальные настройки интерфейса, которые вызывают сбой платформы. Для этого используем следующую обработку (запустите ее под пользователем с полными правами):


Процедура ОчиститьНастройкиИнтерфейсаПользователей() Экспорт
    
    // Очищаем кэш настроек панели разделов и начальной страницы для всех пользователей
    ВыборкаПользователей = Справочники.Пользователи.Выбрать();
    Пока ВыборкаПользователей.Следующий() Цикл
        ИмяПользователяИБ = ВыборкаПользователей.Имя;
        
        Попытка
            // Удаляем настройки рабочего стола и интерфейса
            ХранилищеСистемныхНастроек.Удалить("Общее/НастройкиНачальнойСтраницы", , ИмяПользователяИБ);
            ХранилищеСистемныхНастроек.Удалить("Общее/ПанельРазделов/НастройкиПользователя", , ИмяПользователяИБ);
            ЗаписьЖурналаРегистрации("ОчисткаНастроек", УровеньЖурналаРегистрации.Информация, , , 
                "Настройки пользователя " + ИмяПользователяИБ + " успешно очищены.");
        Исключение
            Продолжить;
        КонецПопытки;
    КонецЦикла;
    
КонецПроцедуры

Шаг 2. Корректное сопоставление пользователей ИБ и справочника

Не переносите справочник «Пользователи» «в лоб» через XML, если не планируете пересоздавать учетные записи конфигуратора вручную. Правильный алгоритм сопоставления:

  1. Удалите некорректно перенесенных пользователей из справочника «Пользователи» в режиме Предприятия.
  2. Перейдите в Конфигуратор и убедитесь, что список пользователей пуст (или содержит только Администратора).
  3. В режиме Предприятия (под Администратором) зайдите в справочник «Пользователи» и создайте их заново штатными средствами. При этом платформа сама автоматически создаст пользователя информационной базы, свяжет его с элементом справочника и запишет корректные дефолтные настройки интерфейса в системные таблицы СУБД.

Шаг 3. Полная очистка кэша метаданных

Поскольку ошибка дампа связана с утечкой памяти из-за неверных указателей на структуры интерфейса, обязательно очистите локальный кэш на компьютере разработчика и пользователей:

  1. Удалите базу из списка запуска 1С и добавьте ее заново (это самый простой способ очистить локальный кэш).
  2. Или вручную удалите папки кэша, расположенные по путям:
    • %localappdata%\1C\1cv8
    • %appdata%\1C\1cv8
  3. Если база работает в клиент-серверном режиме, выполните перезапуск службы сервера 1С:Предприятия (или перезагрузите рабочий процесс rphost), чтобы очистить серверный кэш метаданных.
← На главную