Как добавить все объекты метаданных в расширение 1С и настроить права доступа без ошибок

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

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

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


Способ 1. Массовое заимствование реквизитов через Конструктор запроса

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

Рассмотрим по шагам, как это сделать:

  1. Откроем конфигуратор и перейдем в наше расширение.
  2. Создадим новый временный общий модуль в расширении или откроем модуль уже существующего объекта расширения.
  3. Внутри любой процедуры начнем писать простейший запрос. Нажмем правую кнопку мыши и вызовем Конструктор запроса.
  4. В открывшемся окне конструктора перейдем к нужной таблице основной конфигурации (например, к документу РеализацияТоваровУслуг).
  5. Перетащим символ «*» (все поля) или выберем сразу все реквизиты документа в список выбранных полей запроса. Нажмем кнопку «ОК».
  6. Платформа автоматически проанализирует структуру метаданных. Обнаружив, что выбранных реквизитов нет в расширении, система выведет диалоговое окно с предложением автоматически заимствовать все недостающие объекты и реквизиты. Нам остается лишь согласиться с этим предложением.

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


Способ 2. Массовый перенос метаданных через выгрузку в XML-файлы

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

Проанализируем этот алгоритм:

  1. Выполним выгрузку конфигурации расширения в файлы. Для этого в меню Конфигуратора выберем пункт Конфигурация -> Выгрузить конфигурацию в файлы... и укажем пустой рабочий каталог на диске.
  2. Аналогичным образом выгрузим в другой каталог файлы основной конфигурации (или только те объекты, которые нам необходимы).
  3. Структура выгрузки представляет собой набор XML-файлов, где каждый объект метаданных описан в своем файле, а связи между ними зафиксированы в общем файле Configuration.xml.
  4. Используя текстовый редактор (например, Notepad++, VS Code) или написав простой скрипт на самой 1С, скопируем описания нужных объектов из файлов основной конфигурации в файлы расширения. При этом критически важно переносить объекты вместе с их уникальными идентификаторами (UUID), чтобы платформа сопоставила заимствованные объекты с оригинальными.
  5. После внесения изменений выполним обратную операцию в конфигураторе расширения: Конфигурация -> Загрузить конфигурацию из файлов....

Этот способ требует аккуратности, но незаменим при переносе сотен объектов метаданных за один раз.


Настройка прав в БСП (Комплексная автоматизация, ERP, УТ)

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

Выясним причину, почему созданные нами новые объекты или роли в расширении могут быть «невидимы» для настройки в пользовательском режиме, и разберем правильный порядок действий.

Шаг 1. Создание роли в расширении

В конфигураторе внутри расширения создадим новую роль (например, ДобавлениеИзменениеНовогоСправочника) и укажем соответствующие права на чтение, просмотр, ввод новых данных и редактирование для нашего объекта метаданных.

Шаг 2. Обязательное условие — включение в подсистему

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

Шаг 3. Правило «одной роли» в расширении

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

Шаг 4. Настройка прав для Администраторов (Полные права)

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

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

Шаг 5. Настройка профилей и групп доступа в режиме «1С:Предприятие»

Теперь перейдем в пользовательский интерфейс программы:

  1. Откроем раздел Администрирование -> Настройки пользователей и прав -> Профили групп доступа.
  2. Создадим новый профиль (например, «Работа с новым справочником из расширения»).
  3. В списке разрешенных ролей найдем нашу роль из расширения (она отобразится в списке благодаря тому, что мы включили ее в подсистему на Шаге 2) и отметим ее галочкой. Сохраним профиль.
  4. Перейдем в справочник Группы доступа и создадим новую группу.
  5. В поле «Профиль» выберем только что созданный нами профиль. В табличную часть «Участники группы» добавим необходимых пользователей.

Решение проблемы «Нарушение прав доступа» при записи через внешние обработки

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

Давайте проанализируем причины этой проблемы и способы ее устранения.

1. Проверка безопасного режима расширения

При установке или обновлении расширения в режиме «1С:Предприятие» (через меню Администрирование -> Печатные формы, отчеты и обработки -> Расширения) платформа по умолчанию устанавливает для него признак «Безопасный режим».

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

2. Системные права на запуск внешних обработок

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

3. Особенности работы внешних обработок в платформе (версия 8.3.28 и выше)

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

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

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


Процедура ЗаписатьНовыйОбъектРасширения() Экспорт
    
    // Проверим, доступны ли права на запись объекта у текущего пользователя
    Если Не ПравоДоступа("Добавление", Метаданные.Справочники.УдаленныйСклад_НовыйСправочник) Тогда
        ВызватьИсключение "У вас нет прав на создание элементов справочника в расширении!";
    КонецЕсли;
    
    // Перейдем к безопасной транзакции записи
    НачатьТранзакцию();
    Попытка
        НовыйЭлемент = Справочники.УдаленныйСклад_НовыйСправочник.СоздатьЭлемент();
        НовыйЭлемент.Код = "000001";
        НовыйЭлемент.Наименование = "Центральный Склад (Расширение)";
        НовыйЭлемент.Записать();
        
        ЗафиксироватьТранзакцию();
        Сообщить("Объект успешно записан!");
    Исключение
        ОтменитьТранзакцию();
        ЗаписьЖурналаРегистрации("ОшибкиРасширения", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        ВызватьИсключение "Не удалось записать объект: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    
КонецПроцедуры

Используя предложенные методы массовой работы с метаданными и соблюдая стандарты настройки безопасности БСП, вы сможете создавать стабильные и легко обновляемые системы прав любой сложности внутри расширений 1С.

← На главную