Меняется ли внутренний идентификатор отчета в 1С при замене на внешнюю обработку или отчет?

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

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

Однако у многих разработчиков возникает закономерный вопрос: что происходит с внутренним уникальным идентификатором (UUID) объекта метаданных при такой замене? Не изменятся ли ссылки, не «отвалятся» ли назначенные роли, права доступа или настройки в пользовательском режиме? В этой статье мы подробно разберем механизм работы платформы при замене объектов, выясним поведение UUID и рассмотрим способы их анализа.

Влияет ли замена объекта на его внутренний UUID?

Ответим сразу и однозначно: нет, при замене отчета или обработки через команду «Заменить на внешнюю обработку, отчет...» внутренний идентификатор (UUID) объекта метаданных не меняется.

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

Давайте проанализируем, почему сохранение UUID критически важно для стабильной работы системы:

  1. Права доступа и роли: Все ограничения прав (включая RLS) жестко привязаны к уникальному идентификатору объекта метаданных. Если бы UUID менялся, объект автоматически пропадал бы из всех настроенных ролей, и пользователям пришлось бы перенастраивать права заново.
  2. Интерфейс системы: Позиционирование отчета или обработки в подсистемах, командном интерфейсе разделов и на панелях навигации привязано именно к его UUID. Сохранение идентификатора гарантирует, что объект останется на своем месте в интерфейсе.
  3. Внутренние вызовы: Все ссылки на объект внутри конфигурации (например, при жестком обращении в коде или использовании объекта в качестве типа реквизита) остаются корректными и рабочими.

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

Как устроена структура уникальных идентификаторов в XML

Чтобы наглядно увидеть, какие идентификаторы сопутствуют объекту метаданных, мы можем воспользоваться механизмом выгрузки конфигурации в файлы. Проанализируем структуру 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>

Разберем эти параметры подробнее:

  1. Атрибут uuid в теге Report — это главный внутренний идентификатор самого объекта метаданных (отчета) в конфигурации.
  2. Тег xr:TypeId в секции ReportObject — это уникальный идентификатор типа объекта отчета. Он определяет тип данных конкретного экземпляра отчета, с которым мы работаем в коде.
  3. Тег xr:TypeId в секции ReportManager — это уникальный идентификатор типа менеджера отчета. Он отвечает за работу с пространством имен менеджера данного отчета.

При выполнении операции «Заменить на внешнюю обработку, отчет...» платформа полностью игнорирует UUID, которые были записаны в файле внешнего отчета .erf или .epf (поскольку во внешних файлах при каждом сохранении генерируются новые UUID во избежание конфликтов при параллельном открытии). Вместо этого платформа берет только структуру данных внешнего файла и «натягивает» её на существующие в конфигурации UUID, перечисленные выше. Все три ключевых идентификатора остаются неизменными.

Заблуждение об использовании функции ЗначениеВСтрокуВнутр()

Среди разработчиков 1С распространено популярное заблуждение. Некоторые полагают, что получить уникальный идентификатор конкретного объекта метаданных можно с помощью конструкции ЗначениеВСтрокуВнутр(Метаданные.Отчеты.ИмяОтчета). Разберем, почему это не так.

Если мы попытаемся выполнить этот код, платформа вернет нам системную строку внутреннего формата 1С, содержащую GUID. Однако этот GUID будет указывать не на наш уникальный отчет, а на системный тип данных «Объект метаданных» в самой платформе 1С. Он будет одинаковым для абсолютно любых объектов метаданных одного класса.

Тем не менее, с помощью встроенного языка мы можем программно получить идентификаторы типов менеджера и создаваемого объекта. Давайте посмотрим на рабочий пример кода, который позволяет зафиксировать эти значения:


// Получаем внутреннее представление и идентификатор типа менеджера отчета
ВнутренняяСтрокаМенеджер = ЗначениеВСтрокуВнутр(Отчеты.ДебиторскаяЗадолженность);
ИдентификаторТипаМенеджер = ЗначениеВСтрокуВнутр(ТипЗнч(Отчеты.ДебиторскаяЗадолженность));

// Получаем внутреннее представление и идентификатор типа самого объекта отчета
ОтчетОбъект = Отчеты.ДебиторскаяЗадолженность.Создать();
ВнутренняяСтрокаОбъект = ЗначениеВСтрокуВнутр(ОтчетОбъект); 
ИдентификаторТипаОбъект = ЗначениеВСтрокуВнутр(ТипЗнч(ОтчетОбъект));

Эти идентификаторы типов однозначно соответствуют структуре из XML-файла конфигурации и также остаются неизменными при замене отчета внешним файлом.

Как узнать реальный UUID объекта метаданных?

Поскольку встроенный язык 1С не предоставляет прямого программного метода получения UUID метаданных «из коробки» (например, метода вида Метаданные.Отчеты.ИмяОтчета.УникальныйИдентификатор() не существует), разработчикам приходится использовать альтернативные пути:

  1. Выгрузка конфигурации в XML-файлы: Как было описано выше, это самый надежный, документированный и безопасный способ получить точные UUID любых объектов конфигурации.
  2. Анализ таблиц базы данных SQL: В клиент-серверном варианте работы вся конфигурация хранится в системных таблицах СУБД (таких как Config и Params). Опытные администраторы баз данных и разработчики могут извлечь бинарные данные конфигурации напрямую с помощью SQL-запросов и декомпрессировать их для получения точных UUID метаданных.
  3. Использование Библиотеки стандартных подсистем (БСП): В современных типовых решениях встроен специальный справочник Идентификаторы объектов метаданных. При первом запуске или обновлении системы БСП автоматически сканирует метаданные конфигурации и создает элементы в этом справочнике. Каждому элементу справочника соответствует свой UUID ссылки. Важно понимать: UUID элемента этого справочника не равен UUID самого объекта метаданных в конфигураторе, однако именно ссылки на этот справочник используются в коде для гибкой настройки прав, отчетов и интеграций.

Роль UUID при сравнении и объединении конфигураций

Понимание работы внутренних идентификаторов критически важно при обновлении и объединении конфигураций. Платформа 1С сопоставляет объекты в первую очередь по их уникальным UUID, а не по именам.

Если в двух разных базах были созданы два отчета с абсолютно одинаковым именем, но разными UUID, то при попытке объединить эти конфигурации платформа посчитает их разными объектами. В результате в дереве метаданных произойдет «задвоение» — появится копия отчета с суффиксом (например, ДебиторскаяЗадолженность1). Чтобы не допустить этого, разработчики используют замену объектов или вручную синхронизируют UUID в XML-файлах перед объединением.

Таким образом, использование команды «Заменить на внешнюю обработку, отчет...» является абсолютно безопасной и штатной процедурой, гарантирующей сохранение всей внутренней структуры связей и уникальных идентификаторов в вашей базе данных.

← На главную