В практике администрирования и разработки на платформе 1С:Предприятие 8 возникают специфические задачи, требующие кардинального вмешательства в структуру базы данных. Одной из таких сложных задач является полная смена уникальных идентификаторов (GUID / UUID). Причины для этого могут быть разными: от необходимости «развести» распределенные базы, которые были созданы некорректным копированием, до обхода жестких привязок сторонних систем лицензирования к конкретным GUID метаданных.
Прежде чем переходить к практическим вариантам решения, давайте четко разделим эти идентификаторы на два принципиально разных типа, так как на практике их часто путают:
Справочник.Номенклатура или документу Документ.РеализацияТоваровУслуг).Ниже мы подробно разберем, как решать обе эти задачи с сохранением работоспособности информационной базы и самих данных.
---
Если нам необходимо изменить внутренние GUID самих объектов метаданных, обычное изменение имени или структуры в Конфигураторе не поможет — платформа сохраняет старый идентификатор. Рассмотрим основные рабочие сценарии изменения GUID метаданных.
Этот способ упоминается на форумах как самый простой, но он требует аккуратности, так как напрямую связан с потерей ссылочной целостности данных, если выполнять его в лоб.
Разберем алгоритм по шагам:
.cf) через меню Конфигурация -> Сохранить конфигурацию в файл.....cf.F7).Важное ограничение: Полученная информационная база будет абсолютно пустой. О том, как перенести в нее данные со сменой или сохранением GUID самих элементов, мы подробно поговорим во второй части статьи.
В современной платформе 1С:Предприятие 8.3 доступен мощный механизм выгрузки всей структуры конфигурации в текстовые файлы XML/JSON. Это позволяет нам точечно изменить GUID метаданных с помощью автозамены.
Выполним следующие действия:
Этот способ незаменим, когда требуется изменить идентификаторы только у некоторых объектов метаданных, не затрагивая остальные.
Если вы ведете разработку в современной среде 1С:EDT, задача упрощается. Проект в EDT изначально хранится в виде файлов на диске. Вы можете использовать встроенные инструменты рефакторинга, глобального поиска и автозамены для выравнивания и изменения GUID метаданных. После изменений проект легко импортируется обратно в информационную базу 1С.
Если ваша конфигурация построена на БСП (а это практически все типовые конфигурации 1С: Бухгалтерия, ERP, УТ, ЗУП), то после изменения GUID метаданных вы обязательно столкнетесь с ошибками прав доступа, ролей или работы интерфейса. БСП кэширует структуру метаданных в специальном справочнике Идентификаторы объектов метаданных.
Чтобы восстановить работоспособность системы после изменения GUID метаданных, необходимо запустить обновление этого справочника. Для этого запустите сеанс 1С:Предприятие из командной строки с параметром:
1cv8.exe ENTERPRISE /F "ПутьКБазе" /C ЗапуститьОбновлениеИнформационнойБазы
Или воспользуйтесь типовой административной обработкой «Обновление справочника Идентификаторы объектов метаданных» в пользовательском режиме.
---
Теперь рассмотрим ситуацию, когда конфигурация остается неизменной, но нам нужно изменить уникальные идентификаторы (ссылки) конкретных элементов данных (контрагентов, номенклатуры, документов) непосредственно в самой информационной базе.
Этот метод основан на использовании стандартной обработки «Выгрузка и загрузка данных XML» (поставляется на ИТС под именем UploadToXML).
Алгоритм решения выглядит следующим образом:
550e8400-e29b-41d4-a716-446655440000).Плюсы: Полная независимость от СУБД, переносятся абсолютно все связи.
Минусы: Обработка больших файлов XML (объемом в несколько гигабайт) потребует колоссального объема оперативной памяти и времени.
Если нам нужно перенести данные с генерацией новых GUID более цивилизованным способом, лучшим инструментом будет «1С:Конвертация данных 2.0». Для этой задачи можно использовать обработку для автоматического отключения поиска по GUID у объектов конвертации.
Разберем, как настроить правила обмена:
V8Exman.epf (Универсальный обмен данными в формате XML) платформа не будет использовать старые GUID. Если объект с такими ключевыми полями не найден в приемнике, платформа создаст новый объект с абсолютно новым, случайно сгенерированным GUID.УстановитьСсылкуНового()Если изменять файлы выгрузки нет возможности, мы можем написать внешнюю обработку, которая перегенерирует GUID объектов прямо в работающей базе данных средствами самой платформы 1С.
Для этого используется метод УстановитьСсылкуНового(). Разберем пример кода для справочника:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
СтараяСсылка = Выборка.Ссылка;
// Создаем новый уникальный идентификатор
НовыйGUID = Новый УникальныйИдентификатор();
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID);
// Создаем дубликат объекта
НовыйОбъект = Выборка.Скопировать();
// Указываем платформе, что объект должен записаться с новой ссылкой
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Записать();
// Находим все упоминания старой ссылки в базе данных и заменяем их
ТаблицаСсылок = НайтиПоСсылкам(Новый Массив(СтараяСсылка));
Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
// Здесь пишем код замены старой ссылки на НоваяСсылка в найденных объектах
// (реквизиты документов, записи регистров сведений и накопления)
КонецЦикла;
// Удаляем старый объект
СтарыйОбъект = СтараяСсылка.ПолучитьОбъект();
Если СтарыйОбъект <> Неопределено Тогда
СтарыйОбъект.Удалить();
КонецЕсли;
КонецЦикла;
Предупреждение: Этот метод требует написания сложного кода для обхода всех движений регистров и реквизитов, иначе в базе данных останутся «битые» ссылки (объекты с пометкой <Объект не найден>).
Для клиент-серверных баз данных (MS SQL Server, PostgreSQL) существует возможность прямого обновления идентификаторов через SQL-запросы. Этот метод является самым быстрым, но и самым опасным.
В базах данных 1С ссылки хранятся в бинарном формате binary(16) (в полях с окончанием _IDRRef). Обратите внимание на важный технический нюанс: 1С хранит GUID в SQL-таблицах со смещением байтов (разница в порядке байтов — endianness). То есть строковый GUID из 1С не равен напрямую бинарному значению в SQL.
Для выполнения этой операции специалисты пишут транзакционные SQL-скрипты, которые:
_IDRRef в таблице справочника номенклатуры _Reference15).Важно: Любая ошибка в SQL-скрипте гарантированно приведет к разрушению базы данных. Выполняйте такие операции исключительно на копиях базы и только при наличии опыта работы с СУБД на низком уровне!
---
Подводя итог, можно дать следующие рекомендации по выбору инструмента: