При активной разработке и поддержке конфигураций на платформе 1С:Предприятие программисты часто сталкиваются с необходимостью обновить существующий отчет или обработку. Для этого в дереве метаданных конфигуратора используется стандартная и очень удобная команда «Заменить на внешнюю обработку, отчет...».
Однако у многих разработчиков возникает закономерный вопрос: что происходит с внутренним уникальным идентификатором (UUID) объекта метаданных при такой замене? Не изменятся ли ссылки, не «отвалятся» ли назначенные роли, права доступа или настройки в пользовательском режиме? В этой статье мы подробно разберем механизм работы платформы при замене объектов, выясним поведение UUID и рассмотрим способы их анализа.
Ответим сразу и однозначно: нет, при замене отчета или обработки через команду «Заменить на внешнюю обработку, отчет...» внутренний идентификатор (UUID) объекта метаданных не меняется.
Платформа 1С:Предприятие спроектирована таким образом, чтобы максимально обеспечивать ссылочную целостность конфигурации. При выполнении этой команды система замещает лишь внутреннее содержимое объекта (модули, формы, макеты, схему компоновки данных), но оставляет неизменными ключевые метаданные самого объекта, включая его системный GUID и идентификаторы типов.
Давайте проанализируем, почему сохранение UUID критически важно для стабильной работы системы:
Если вам требуется не обновить существующий отчет, а добавить абсолютно новую сущность в дерево метаданных (даже если она основана на файле внешнего отчета), необходимо использовать команду «Вставить внешнюю обработку, отчет...». В этом случае платформа создаст новый объект конфигурации и сгенерирует для него совершенно новый, уникальный UUID.
Чтобы наглядно увидеть, какие идентификаторы сопутствуют объекту метаданных, мы можем воспользоваться механизмом выгрузки конфигурации в файлы. Проанализируем структуру XML-файла отчета, выгрузив конфигурацию через меню Конфигурация -> Выгрузить конфигурацию в файлы....
В полученной выгрузке найдем файл нужного отчета (например, Report.ДебиторскаяЗадолженность.xml). Внутри структуры XML-документа мы увидим следующее распределение UUID:
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" ... version="2.6">
<Report uuid="1ce0ffe7-2218-4d9d-88d5-d3eec204bfff">
<InternalInfo>
<xr:GeneratedType name="ReportObject.ДебиторскаяЗадолженность" category="Object">
<xr:TypeId>3311a413-fb08-45c9-be4b-b320c47c6eae</xr:TypeId>
<xr:ValueId>4f5a9265-1f7c-4f92-a8df-85144ebaffc5</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="ReportManager.ДебиторскаяЗадолженность" category="Manager">
<xr:TypeId>ecc49699-1c84-4abb-80a2-4a57d2bd7986</xr:TypeId>
<xr:ValueId>86b8975f-1fe6-4354-864b-8a398a8596c6</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
</Report>
</MetaDataObject>
Разберем эти параметры подробнее:
uuid в теге Report — это главный внутренний идентификатор самого объекта метаданных (отчета) в конфигурации.xr:TypeId в секции ReportObject — это уникальный идентификатор типа объекта отчета. Он определяет тип данных конкретного экземпляра отчета, с которым мы работаем в коде.xr:TypeId в секции ReportManager — это уникальный идентификатор типа менеджера отчета. Он отвечает за работу с пространством имен менеджера данного отчета.При выполнении операции «Заменить на внешнюю обработку, отчет...» платформа полностью игнорирует UUID, которые были записаны в файле внешнего отчета .erf или .epf (поскольку во внешних файлах при каждом сохранении генерируются новые UUID во избежание конфликтов при параллельном открытии). Вместо этого платформа берет только структуру данных внешнего файла и «натягивает» её на существующие в конфигурации UUID, перечисленные выше. Все три ключевых идентификатора остаются неизменными.
Среди разработчиков 1С распространено популярное заблуждение. Некоторые полагают, что получить уникальный идентификатор конкретного объекта метаданных можно с помощью конструкции ЗначениеВСтрокуВнутр(Метаданные.Отчеты.ИмяОтчета). Разберем, почему это не так.
Если мы попытаемся выполнить этот код, платформа вернет нам системную строку внутреннего формата 1С, содержащую GUID. Однако этот GUID будет указывать не на наш уникальный отчет, а на системный тип данных «Объект метаданных» в самой платформе 1С. Он будет одинаковым для абсолютно любых объектов метаданных одного класса.
Тем не менее, с помощью встроенного языка мы можем программно получить идентификаторы типов менеджера и создаваемого объекта. Давайте посмотрим на рабочий пример кода, который позволяет зафиксировать эти значения:
// Получаем внутреннее представление и идентификатор типа менеджера отчета
ВнутренняяСтрокаМенеджер = ЗначениеВСтрокуВнутр(Отчеты.ДебиторскаяЗадолженность);
ИдентификаторТипаМенеджер = ЗначениеВСтрокуВнутр(ТипЗнч(Отчеты.ДебиторскаяЗадолженность));
// Получаем внутреннее представление и идентификатор типа самого объекта отчета
ОтчетОбъект = Отчеты.ДебиторскаяЗадолженность.Создать();
ВнутренняяСтрокаОбъект = ЗначениеВСтрокуВнутр(ОтчетОбъект);
ИдентификаторТипаОбъект = ЗначениеВСтрокуВнутр(ТипЗнч(ОтчетОбъект));
Эти идентификаторы типов однозначно соответствуют структуре из XML-файла конфигурации и также остаются неизменными при замене отчета внешним файлом.
Поскольку встроенный язык 1С не предоставляет прямого программного метода получения UUID метаданных «из коробки» (например, метода вида Метаданные.Отчеты.ИмяОтчета.УникальныйИдентификатор() не существует), разработчикам приходится использовать альтернативные пути:
Config и Params). Опытные администраторы баз данных и разработчики могут извлечь бинарные данные конфигурации напрямую с помощью SQL-запросов и декомпрессировать их для получения точных UUID метаданных.Идентификаторы объектов метаданных. При первом запуске или обновлении системы БСП автоматически сканирует метаданные конфигурации и создает элементы в этом справочнике. Каждому элементу справочника соответствует свой UUID ссылки. Важно понимать: UUID элемента этого справочника не равен UUID самого объекта метаданных в конфигураторе, однако именно ссылки на этот справочник используются в коде для гибкой настройки прав, отчетов и интеграций.Понимание работы внутренних идентификаторов критически важно при обновлении и объединении конфигураций. Платформа 1С сопоставляет объекты в первую очередь по их уникальным UUID, а не по именам.
Если в двух разных базах были созданы два отчета с абсолютно одинаковым именем, но разными UUID, то при попытке объединить эти конфигурации платформа посчитает их разными объектами. В результате в дереве метаданных произойдет «задвоение» — появится копия отчета с суффиксом (например, ДебиторскаяЗадолженность1). Чтобы не допустить этого, разработчики используют замену объектов или вручную синхронизируют UUID в XML-файлах перед объединением.
Таким образом, использование команды «Заменить на внешнюю обработку, отчет...» является абсолютно безопасной и штатной процедурой, гарантирующей сохранение всей внутренней структуры связей и уникальных идентификаторов в вашей базе данных.