Общие сведения
Расширение — это вид проекта, предназначенный для изменения функциональности других проектов (приложений или библиотек) без изменения их исходных файлов. С помощью расширений можно добавлять новую функциональность, в том числе поставляемую отдельно в виде плагинов, сохраняя возможность обновлять основной проект.
Расширение может дорабатывать один или несколько конкретных проектов либо быть универсальным — добавлять новую функциональность без привязки к определенному проекту. Добавить расширение к проекту можно из среды разработки или создать отдельный проект в панели управления.
После создания расширение устанавливается в приложение через панель управления и может находиться во включенном или выключенном состоянии.
Состав проекта расширения, поддерживаемые в нем элементы и порядок применения расширений в приложении описаны в разделах ниже.
Виды расширений и расширяемые проекты
Расширять можно проекты приложений и библиотеки. Одно расширение может одновременно изменять один или несколько проектов: например, только проект приложения, только проект библиотеки, или проект приложения совместно с несколькими библиотеками.
Если в расширении не указаны расширяемые проекты, оно называется универсальным расширением. Такое расширение может только добавлять новую функциональность, не изменяя другие проекты, и содержит только собственные подсистемы.
Отличия от библиотек
Библиотеки отличаются от расширений способом подключения к приложению и возможностями по изменению проекта:
- Библиотека добавляет новые, самостоятельные элементы, которые доступны глобально или в рамках проекта. Библиотека не может изменять существующие элементы проекта, к которому она подключена.
- Расширение может не только добавлять новые элементы, но и изменять поведение расширяемого проекта. Элементы расширения имеют доступ к внутренним элементам расширяемого проекта с видимостью
ВПроектеиВПодсистеме.
Пространства имен и область видимости
При работе с расширениями важно учитывать правила формирования пространств имен и области видимости элементов. Типы, созданные по собственным элементам расширения и элементам-расширениям, находятся в пространстве имен расширения:
ПоставщикРасширения::ИмяПроектаРасширения::ИмяПодсистемы[::ИмяПакета]::ИмяТипа.
Доступность элементов и типов в расширении определяется следующим образом:
- Элементы в любых подсистемах расширения имеют доступ к элементам расширяемого проекта с видимостью
ВПроекте. - Элементы в расширении подсистемы имеют доступ к элементам расширяемой подсистемы с видимостью
ВПодсистеме. - Элементы из других подсистем самого проекта расширения доступны по обычным правилам.
Использование расширений в приложениях
Чтобы расширение стало доступно в конкретном приложении, его необходимо к нему подключить. Подключенное расширение может находиться в одном из двух состояний:
- Включено — функциональность расширения доступна в запущенном приложении. В этом состоянии доступны обновление, выключение и удаление расширения.
- Выключено — функциональность расширения недоступна (отключаются добавленные типы и изменения интерфейса), но само расширение остается в приложении. В этом состоянии доступны включение, обновление и удаление.
Администратор может выключить расширение, например, при его неправильной работе или обнаружении ошибок применения новой версии расширяемого проекта. Выключение позволяет временно отключить функциональность расширения с возможностью последующего включения. Если расширение больше не нужно, его удаляют из приложения.
Порядок расширений задается при их подключении к приложению и может быть изменен в форме обновления приложения. Этот порядок определяет последовательность запуска обработчиков обновления: внутри одного расширения сначала выполняются обработчики библиотек из его зависимостей, затем — обработчики самого расширения. Аналогично по порядку применяются изменения к модифицируемым элементам, когда их меняют несколько расширений. Если при применении новой версии расширяемого проекта в одном из расширений обнаруживаются ошибки, администратор может выключить проблемное расширение и повторить применение. Если при применении проекта приложения возникают ошибки в элементах расширений, применение не выполняется.
Добавление, обновление, включение, выключение расширений и изменение их порядка запускают процедуру обновления приложения.
Библиотеки и ресурсы в расширениях
Расширения могут взаимодействовать с библиотеками и управлять ресурсами. Важно различать механику работы с расширяемыми и используемыми библиотеками, а также понимать ограничения, накладываемые на доступ к ресурсам из кода.
Расширяемые и используемые библиотеки
При разработке расширения необходимо четко разделять библиотеки, которые оно расширяет, и библиотеки, которые оно использует в своих зависимостях.
- Расширяемые библиотеки указываются в свойстве РасширяемыеПроекты проекта расширения. Эти библиотеки не включаются в сборку расширения. Они должны присутствовать в приложении на момент применения расширения, а их версии должны соответствовать заданному диапазону.
- Используемые библиотеки указываются в свойстве Библиотеки проекта расширения. Эти библиотеки включаются в сборку расширения. Они могут как присутствовать в приложении до установки расширения, так и отсутствовать в нем.
Если используемая библиотека уже присутствует в приложении, ее версия должна строго совпадать с версией, указанной в зависимостях расширения. Если библиотека отсутствует в приложении, она добавляется при применении расширения.
Используемые библиотеки подпадают под те же ограничения, что и само расширение: они могут включать только поддерживаемые виды элементов.
Поведение библиотек при управлении расширением
Так как используемые библиотеки разделяются между проектами, управление состоянием расширения напрямую влияет на доступность функциональности библиотек, добавленных при применении расширения.
- При выключении расширения элементы и типы из используемых библиотек также становятся недоступными. Это происходит только в том случае, если библиотеку не использует расширяемый проект (транзитивно) и библиотеку больше не использует ни одно другое включенное расширение.
- При включении расширения, если хотя бы одно включаемое расширение использует ранее выключенную библиотеку, эта библиотека также включается автоматически.
- При удалении расширения библиотека будет удалена из приложения только в том случае, если удаляемое расширение было единственным, кто ее использовал.
Доступ к ресурсам из расширений
В расширении подсистемы и ее пакетах можно добавлять ресурсы — например, изображения. Область видимости ресурсов действует только на ресурсы самой подсистемы и не меняет область видимости ресурсов расширяемой подсистемы.
Доступ к ресурсам возможен двумя способами:
-
С помощью литерала
Ресурс{Путь}— по полному или относительному пути:Ресурс{БазаЗадач::Основная::Картинки/Иконка.svg}Ресурс{Картинки/Иконка.svg}Ресурс{Расширение1::Основная::Картинки/Иконка2.svg} -
С помощью типа
ПакетРесурсов— статический методТекущий()возвращает пакет текущего пространства имен, у которого доступны:-
определенный ресурс по заданному пути —
Получить(Путь: Строка); -
все ресурсы в указанной папке —
ПолучитьВсе(Путь: Строка = "", ВключитьВложенные: Булево = Истина).ПакетРесурсов.Текущий().ПолучитьВсе("Картинки", Ложь)
-
Из расширяемого проекта нет доступа к ресурсам расширения подсистемы — при попытке такого обращения выдается ошибка применения. Из расширения доступ к ресурсам расширяемой подсистемы есть.
Поддерживаемые элементы и ограничения
В расширении поддерживается определенный набор элементов проекта, при этом действуют некоторые ограничения.
В расширении можно добавлять следующие стандартные элементы:
- Общий модуль,
- Структура,
- HTTP- и SOAP-сервис,
- Клиент SOAP-сервиса,
- Событие журнала событий,
- Контракт типа и контракт сервиса,
- Ресурсы,
- Локализации.
Действуют следующие ограничения:
- HTTP- и SOAP-сервисы должны иметь разрешения
РазрешеноВсемилиРазрешеноАутентифицированнымдля сервиса в целом. Использование разрешенийРазрешенияВычисляютсяи разрешений для отдельных шаблонов не поддерживается. - Нельзя изменять свойства расширяемой подсистемы.