Как исправить ошибку идентификаторов объектов метаданных для расширений в 1С:ЗУП и БСП

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

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

«Для объекта метаданных "Справочник.ХХХ" не найден идентификатор в справочнике "Идентификаторы объектов метаданных" и регистре сведений "Идентификаторы объектов версий расширений"»

Даже запуск конфигурации с ключом обновления базы данных /С ЗапуститьОбновлениеИнформационнойБазы не решает проблему, и новые объекты из расширения упорно отказываются регистрироваться в системе. В этой статье мы детально разберем причины такого поведения Библиотеки стандартных подсистем (БСП) и рассмотрим практические способы решения этой проблемы.

Выясняем глубинную причину: почему БСП «не видит» метаданные расширения

Вся подсистема управления доступом и регистрации метаданных в БСП завязана на справочник ИдентификаторыОбъектовМетаданных и регистр сведений ИдентификаторыОбъектовВерсийРасширений. Когда мы запускаем систему, БСП инициализирует и сопоставляет реальные метаданные конфигурации с записями в этих таблицах.

Основная логика распределения объектов по коллекциям сосредоточена в модуле менеджера справочника ИдентификаторыОбъектовМетаданных, а именно в функции СвойстваКоллекцийОбъектовМетаданных(). В старых версиях БСП (которые использовались в версиях 1С:ЗУП до 3.1.8, например, в 3.1.7) для многих типов объектов метаданных в этой функции не был установлен флаг поддержки расширений (ОбъектыРасширений = Истина).

В результате при сканировании метаданных система просто игнорировала добавленные через расширение справочники, документы или регистры, считая, что расширения не могут поставлять данные типы объектов. Из-за этого объекты не регистрировались, а попытка настроить для них права приводила к системному сбою.

Решение 1. Обновление конфигурации и платформы (Рекомендуемый способ)

Как показывает практика практикующих разработчиков, наиболее простым и надежным способом является обновление конфигурации до актуального релиза. Переход с устаревших версий (например, с ЗУП 3.1.7 на ЗУП 3.1.8 и выше) автоматически обновляет встроенную БСП до версии, где работа с метаданными расширений полностью отлажена.

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

Решение 2. Использование стандартной обработки обновления вспомогательных данных

Если по каким-то причинам оперативно обновить конфигурацию невозможно (например, база находится на нетиповой поддержке и процесс обновления требует длительного времени), мы можем воспользоваться специализированным инструментом разработчика от фирмы «1С».

В составе дистрибутива БСП поставляется внешняя обработка ОбновлениеВспомогательныхДанных.epf. Найти ее можно по следующему примерному пути на вашем диске (в зависимости от установленной версии БСП):

%AppData%\1C\1cv8\tmplts\1c\SSL\[Номер_Версии_БСП]\ExtFiles\Инструменты разработчика\ОбновлениеВспомогательныхДанных.epf

Для принудительного обновления выполним следующие шаги:

  1. Запустим информационную базу в режиме «1С:Предприятие» под пользователем с полными правами.
  2. Откроем внешнюю обработку ОбновлениеВспомогательныхДанных.epf через меню «Файл» — «Открыть».
  3. В открывшейся форме выберем пункт, связанный с обновлением идентификаторов объектов метаданных, и запустим процесс выполнения.
  4. Дождемся окончания работы обработки и перезапустим сеанс.

Решение 3. Программный принудительный запуск обновления через консоль кода

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


Справочники.ИдентификаторыОбъектовРасширений.ОбновитьДанныеСправочника(Истина, Ложь, Ложь);

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

Решение 4. Исправление кода БСП через расширение (для устаревших версий)

Если обновиться нельзя, а новые справочники в расширении жизненно необходимы, мы можем переопределить поведение БСП с помощью самого расширения. Нам потребуется программно разрешить регистрацию объектов расширения для конкретных коллекций метаданных.

Проанализируем порядок действий по шагам:

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

Пример программной реализации такого перехватчика в модуле расширения:


&Вместо("СвойстваКоллекцийОбъектовМетаданных")
Функция Расш_СвойстваКоллекцийОбъектовМетаданных()
    // Получаем оригинальную таблицу свойств коллекций
    ТаблицаСвойств = ПродолжитьВызов();
    
    // Находим строку, отвечающую за Справочники, и разрешаем им быть в расширениях
    СтрокаСправочники = ТаблицаСвойств.Найти("Справочники", "Имя");
    Если СтрокаСправочники <> Неопределено Тогда
        СтрокаСправочники.ОбъектыРасширений = Истина;
    КонецЕсли;
    
    // То же самое проделываем для Документов при необходимости
    СтрокаДокументы = ТаблицаСвойств.Найти("Документы", "Имя");
    If СтрокаДокументы <> Неопределено Тогда
        СтрокаДокументы.ОбъектыРасширений = Истина;
    КонецЕсли;
    
    Возврат ТаблицаСвойств;
КонецФункции

После применения данного кода и перезапуска сеанса БСП корректно воспримет новые справочники и документы из расширения и создаст для них необходимые идентификаторы.

Особый случай в современных БСП: Проблема с бизнес-процессами и задачами

Примечательно, что даже в современных версиях БСП (использующихся в актуальных ERP 2.5, КА 2.5 и ЗУП 3.1) разработчики фирмы «1С» иногда забывают проставить флаг ОбъектыРасширений = Истина для таких коллекций метаданных, как Бизнес-процессы (БизнесПроцессы) и Задачи (Задачи). Если вы добавите их в расширение, то столкнетесь с аналогичной ошибкой отсутствия идентификаторов.

Решается это точно таким же способом переопределения функции СвойстваКоллекцийОбъектовМетаданных(), как описано в Решении 4, но уже конкретно для строк с именами "БизнесПроцессы" и "Задачи".

Связываем роль расширения с поставляемым профилем доступа БСП

Рассмотрим еще одну частую проблему: роль в расширении успешно создана, права на новые справочники назначены, но нам необходимо интегрировать эту роль в существующие типовые (поставляемые) профили доступа (например, добавить созданную роль расширения в профиль «Кадровик» или «Расчетчик»).

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

Для этого выполним следующие действия:

  1. Заимствуем в расширение общий модуль УправлениеДоступомПереопределяемый.
  2. Добавим обработчик события с аннотацией &После для процедуры ПриЗаполненииПоставляемыхПрофилейГруппДоступа().
  3. Программно внесем нашу роль расширения в описание нужного нам профиля.

Посмотрим на пример реализации кода в модуле расширения:


&После("ПриЗаполненииПоставляемыхПрофилейГруппДоступа")
Процедура Расш_ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт
    
    Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
        // Добавляем созданную нами роль расширения в типовой профиль Кадровика
        Если ОписаниеПрофиля.Имя = "Кадровик" Тогда 
            // Имя роли должно указываться с учетом имени нашего расширения
            ОписаниеПрофиля.Роли.Добавить("ИмяВашегоРасширения_ИмяНовойРоли");
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

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

← На главную