При активной разработке в среде 1С с использованием механизмов расширения конфигурации программисты часто сталкиваются с неприятной ситуацией. Мы добавляем в расширение новые справочники, документы или регистры, запуск базы проходит успешно, однако при попытке настройки прав доступа (создании новых ролей, добавлении их в профили групп доступа) система выдает критическую ошибку:
«Для объекта метаданных "Справочник.ХХХ" не найден идентификатор в справочнике "Идентификаторы объектов метаданных" и регистре сведений "Идентификаторы объектов версий расширений"»
Даже запуск конфигурации с ключом обновления базы данных /С ЗапуститьОбновлениеИнформационнойБазы не решает проблему, и новые объекты из расширения упорно отказываются регистрироваться в системе. В этой статье мы детально разберем причины такого поведения Библиотеки стандартных подсистем (БСП) и рассмотрим практические способы решения этой проблемы.
Вся подсистема управления доступом и регистрации метаданных в БСП завязана на справочник ИдентификаторыОбъектовМетаданных и регистр сведений ИдентификаторыОбъектовВерсийРасширений. Когда мы запускаем систему, БСП инициализирует и сопоставляет реальные метаданные конфигурации с записями в этих таблицах.
Основная логика распределения объектов по коллекциям сосредоточена в модуле менеджера справочника ИдентификаторыОбъектовМетаданных, а именно в функции СвойстваКоллекцийОбъектовМетаданных(). В старых версиях БСП (которые использовались в версиях 1С:ЗУП до 3.1.8, например, в 3.1.7) для многих типов объектов метаданных в этой функции не был установлен флаг поддержки расширений (ОбъектыРасширений = Истина).
В результате при сканировании метаданных система просто игнорировала добавленные через расширение справочники, документы или регистры, считая, что расширения не могут поставлять данные типы объектов. Из-за этого объекты не регистрировались, а попытка настроить для них права приводила к системному сбою.
Как показывает практика практикующих разработчиков, наиболее простым и надежным способом является обновление конфигурации до актуального релиза. Переход с устаревших версий (например, с ЗУП 3.1.7 на ЗУП 3.1.8 и выше) автоматически обновляет встроенную БСП до версии, где работа с метаданными расширений полностью отлажена.
При обновлении конфигурации также рекомендуется обновить и платформу «1С:Предприятие» до версии, требуемой новым релизом. После успешного обновления конфигурации при первом же запуске в режиме «Предприятие» система автоматически проведет ревизию метаданных и зарегистрирует все объекты расширения в справочнике идентификаторов.
Если по каким-то причинам оперативно обновить конфигурацию невозможно (например, база находится на нетиповой поддержке и процесс обновления требует длительного времени), мы можем воспользоваться специализированным инструментом разработчика от фирмы «1С».
В составе дистрибутива БСП поставляется внешняя обработка ОбновлениеВспомогательныхДанных.epf. Найти ее можно по следующему примерному пути на вашем диске (в зависимости от установленной версии БСП):
%AppData%\1C\1cv8\tmplts\1c\SSL\[Номер_Версии_БСП]\ExtFiles\Инструменты разработчика\ОбновлениеВспомогательныхДанных.epf
Для принудительного обновления выполним следующие шаги:
ОбновлениеВспомогательныхДанных.epf через меню «Файл» — «Открыть».В тех случаях, когда запуск через командную строку или внешнюю обработку не срабатывает из-за блокировок или особенностей сессии, мы можем вызвать процедуру обновления программно. Для этого откроем любую консоль кода (или создадим временную внешнюю обработку) и выполним следующую команду:
Справочники.ИдентификаторыОбъектовРасширений.ОбновитьДанныеСправочника(Истина, Ложь, Ложь);
Этот метод принудительно инициализирует процедуру создания и сопоставления идентификаторов метаданных непосредственно для всех подключенных в данный момент расширений конфигурации.
Если обновиться нельзя, а новые справочники в расширении жизненно необходимы, мы можем переопределить поведение БСП с помощью самого расширения. Нам потребуется программно разрешить регистрацию объектов расширения для конкретных коллекций метаданных.
Проанализируем порядок действий по шагам:
ИдентификаторыОбъектовМетаданных и его модуль менеджера.СвойстваКоллекцийОбъектовМетаданных() метод-перехватчик с аннотацией &Вместо.Истина в колонке ОбъектыРасширений для нужных нам типов (например, для справочников или документов).Пример программной реализации такого перехватчика в модуле расширения:
&Вместо("СвойстваКоллекцийОбъектовМетаданных")
Функция Расш_СвойстваКоллекцийОбъектовМетаданных()
// Получаем оригинальную таблицу свойств коллекций
ТаблицаСвойств = ПродолжитьВызов();
// Находим строку, отвечающую за Справочники, и разрешаем им быть в расширениях
СтрокаСправочники = ТаблицаСвойств.Найти("Справочники", "Имя");
Если СтрокаСправочники <> Неопределено Тогда
СтрокаСправочники.ОбъектыРасширений = Истина;
КонецЕсли;
// То же самое проделываем для Документов при необходимости
СтрокаДокументы = ТаблицаСвойств.Найти("Документы", "Имя");
If СтрокаДокументы <> Неопределено Тогда
СтрокаДокументы.ОбъектыРасширений = Истина;
КонецЕсли;
Возврат ТаблицаСвойств;
КонецФункции
После применения данного кода и перезапуска сеанса БСП корректно воспримет новые справочники и документы из расширения и создаст для них необходимые идентификаторы.
Примечательно, что даже в современных версиях БСП (использующихся в актуальных ERP 2.5, КА 2.5 и ЗУП 3.1) разработчики фирмы «1С» иногда забывают проставить флаг ОбъектыРасширений = Истина для таких коллекций метаданных, как Бизнес-процессы (БизнесПроцессы) и Задачи (Задачи). Если вы добавите их в расширение, то столкнетесь с аналогичной ошибкой отсутствия идентификаторов.
Решается это точно таким же способом переопределения функции СвойстваКоллекцийОбъектовМетаданных(), как описано в Решении 4, но уже конкретно для строк с именами "БизнесПроцессы" и "Задачи".
Рассмотрим еще одну частую проблему: роль в расширении успешно создана, права на новые справочники назначены, но нам необходимо интегрировать эту роль в существующие типовые (поставляемые) профили доступа (например, добавить созданную роль расширения в профиль «Кадровик» или «Расчетчик»).
Вручную редактировать поставляемые профили в режиме «1С:Предприятие» не рекомендуется, так как при очередном обновлении ИБ настройки могут «слететь» к первоначальному типовому виду. Правильным решением будет программная привязка роли. Для сохранения назначенных прав при обновлении можно использовать решение для защиты ролей расширений в группах доступа БСП.
Для этого выполним следующие действия:
УправлениеДоступомПереопределяемый.&После для процедуры ПриЗаполненииПоставляемыхПрофилейГруппДоступа().Посмотрим на пример реализации кода в модуле расширения:
&После("ПриЗаполненииПоставляемыхПрофилейГруппДоступа")
Процедура Расш_ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
// Добавляем созданную нами роль расширения в типовой профиль Кадровика
Если ОписаниеПрофиля.Имя = "Кадровик" Тогда
// Имя роли должно указываться с учетом имени нашего расширения
ОписаниеПрофиля.Роли.Добавить("ИмяВашегоРасширения_ИмяНовойРоли");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное предупреждение: Для того чтобы общий модуль в расширении корректно отработал при вызове из кода БСП, убедитесь, что в свойствах вашего расширения снят флажок «Безопасный режим». В противном случае платформа заблокирует работу переопределяемого модуля и роли не будут добавлены в профиль.
Мы подробно разобрали причины возникновения ошибки с идентификаторами объектов метаданных расширений в конфигурациях на базе БСП и изучили все возможные методы её локализации и устранения. Применяя эти подходы, вы сможете легко создавать гибкие и надежные расширения для любых систем семейства «1С:Предприятие 8». При необходимости быстро обновить права пользователей после изменения ролей в профилях пригодится обработка для точечного пересчета прав доступа в БСП.