Перенос данных между базами 1С часто кажется тривиальной задачей: мы привыкли использовать типовые обработки выгрузки и загрузки данных через XML. Однако, когда дело доходит до пользовательских настроек, вариантов отчетов, сохраненных фильтров и компоновок, программист сталкивается с серьезным препятствием. Оказывается, что простого копирования справочника ВариантыОтчетов недостаточно, так как настройки "отваливаются" из-за несовпадения внутренних идентификаторов. Разберем детально, почему это происходит и какими способами можно решить эту задачу.
Прежде всего, проанализируем ситуацию: почему в новой базе, имеющей идентичную конфигурацию, настройки перестают работать? Главная причина кроется в UUID (Уникальных идентификаторах). Причем речь идет не только об идентификаторах элементов справочников, но и об идентификаторах самих объектов метаданных (подсистем, отчетов, планов видов характеристик).
Если новая информационная база создавалась путем загрузки файла конфигурации (.cf) или через "Сравнение и объединение", идентификаторы метаданных в ней гарантированно будут отличаться от исходной базы. В результате, когда система пытается подгрузить настройку варианта отчета, которая ссылается на подсистему "Продажи", она ищет ее по старому UUID. Не найдя объекта, система игнорирует настройку.
Второй критический момент — привязка к пользователю. Все настройки в 1С жестко связаны с идентификатором пользователя информационной базы. Даже если вы создадите в новой базе пользователя с таким же именем, его внутренний UUID будет другим, и настройки "не подцепятся".
Рассмотрим самый безопасный способ, который позволяет избежать проблем с идентификаторами метаданных. Вместо того чтобы переносить данные в "чистую" базу, мы возьмем копию старой базы и удалим из нее все лишнее.
ПланыОбмена.УстановитьГлавныйУзел(Неопределено).Администрирование -> Сервис -> Свертка информационной базы. Удаляем документы прошлых периодов, оставляя только нужные остатки.Если вы все же решили идти путем переноса в новую пустую базу, первым делом необходимо правильно перенести пользователей. Разберем по шагам, как это реализовать программно.
Проанализируем пример кода для создания пользователя с конкретным UUID:
// Пример переноса пользователя с сохранением идентификатора
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользователь.Имя = "ИмяСтарогоПользователя";
НовыйПользователь.ПолноеИмя = "Иванов Иван Иванович";
// Установка УИД из старой базы (предположим, мы его получили ранее)
// Важно: УникальныйИдентификатор доступен только для чтения в обычном режиме,
// поэтому часто используют выгрузку/загрузку XML, которая умеет восстанавливать UUID.
Для гарантированного результата лучше всего использовать типовую обработку "Выгрузка и загрузка данных XML". При загрузке обязательно установите флаг "Загружать объекты с их уникальными идентификаторами". Это касается как справочника Пользователи, так и системных настроек.
Рассмотрим ситуацию из сообщения №2, когда пользователь столкнулся с тем, что ссылки на подсистемы в справочнике ВариантыОтчетов стали битыми. Если база уже создана и UUID метаданных отличаются, поможет программная "перепрошивка" настроек.
Алгоритм действий будет следующим:
ВариантыОтчетов в новую базу.Размещение в этом справочнике.Посмотрим, как это выглядит в логике кода:
Для Каждого Вариант Из Справочники.ВариантыОтчетов.Выбрать() Цикл
ОбъектВариант = Вариант.ПолучитьОбъект();
Для Каждого СтрокаРазмещения Из ОбъектВариант.Размещение Цикл
// Здесь выполняется поиск подсистемы по наименованию
ИмяПодсистемы = "Продажи"; // В реальности берем из структуры старых данных
НоваяПодсистема = Метаданные.Подсистемы.Найти(ИмяПодсистемы);
// Обновляем ссылку в объекте
// (Примечание: логика зависит от того, как БСП хранит ссылки на метаданные)
КонецЦикла;
ОбъектВариант.Записать();
КонецЦикла;
Важно понимать, что в 1С v8.3 настройки хранятся не только в справочниках. Существуют системные таблицы (хранилища), доступ к которым осуществляется через специальные менеджеры:
ХранилищеСистемныхНастроек — здесь хранятся настройки форм и положения окон.ХранилищеОбщихНастроек — общие параметры пользователей.ХранилищеВариантовОтчетов — именно здесь лежат пользовательские настройки компоновки данных (группировки, фильтры).Для переноса этих данных можно использовать программные методы Выбрать() и Загрузить() соответствующих менеджеров хранилищ. Проанализируем пример получения настройки:
// Получение настроек пользователя из хранилища
Настройки = ХранилищеСистемныхНастроек.Выбрать(ИмяПользователя);
Пока Настройки.Следующий() Цикл
// Чтение настройки и запись её в новую базу (или файл)
КлючОбъекта = Настройки.КлючОбъекта;
КлючНастройки = Настройки.КлючНастройки;
ЗначениеНастройки = Настройки.Значение;
КонецЦикла;
В современных конфигурациях, таких как УТ 11, ERP или КА, за работу с отчетами отвечает подсистема БСП "Варианты отчетов". Она использует кэширование данных. Поэтому после любого переноса или программного изменения справочников ВариантыОтчетов необходимо запустить процедуру обновления кэша.
Выясним причину, по которой отчеты могут не появляться в интерфейсе даже после копирования: системе нужно перестроить вспомогательные таблицы. Для этого в модуле ВариантыОтчетов существуют специальные процедуры обновления, которые следует вызвать после загрузки данных.
Проанализировав все способы, мы рекомендуем следующий порядок действий для достижения наилучшего результата:
Помните, что настройки — это не просто записи в базе, а сложная структура связей между пользователем, объектом метаданных и хранилищем значений. Правильный учет всех трех составляющих позволит вам успешно решить задачу переноса.