124 документа
← К списку

Глава 32. Расширение конфигурации

страница

Глава 32. Расширение конфигурации

32.1. Общая информация

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

При рассмотрении механизма расширения конфигурации будут использоваться следующие термины:

● Расширяемая конфигурация – основная конфигурация информационной базы, для которой применяется расширение или для которой расширение разрабатывается.

● Расширение конфигурации – набор объектов конфигурации, подключаемых к расширяемой конфигурации и содержащий набор объектов, добавляемых к расширяемой конфигурации. Расширение может включать в себя как объекты расширяемой конфигурации, так и объекты, которые отсутствуют в расширяемой конфигурации.

● Собственный объект – самодостаточный объект конфигурации, который может находиться как в расширяемой конфигурации, так и в расширении (отчет, обработка или подсистема).

● Заимствованный объект – собственный объект, добавленный в расширение конфигурации.

● Расширяемый объект – собственный объект, для которого в заимствованном объекте изменены какие-либо параметры (свойства, формы и т. д.).

● Расширяющий объект – это заимствованный объект, в который внесены изменения относительно расширяемого объекта. Наличие в заимствованном объекте только контролируемых свойств не делает заимствованный объект расширяющим.

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

● Расширяющее свойство – свойство заимствованного объекта, которое изменяет одноименное свойство расширяемого объекта.

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

● Модифицируемое свойство – свойство заимствованного объекта, значение которого в результирующем объекте будет получаться из расширения.

Свойство заимствованного объекта не может быть одновременно контролируемым и модифицируемым.

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

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

В качестве расширяемых объектов могут выступать:

● Управляемые формы;

● Роли;

● Подсистемы;

● Настройки начальной страницы (рабочего стола) прикладного решения.

В качестве собственных объектов расширения могут выступать:

● Подсистемы;

● Обработки;

● Отчеты;

● Реквизиты, табличные части и реквизиты табличных частей в заимствованных обработках и отчетах;

● XDTO-пакеты;

● Web-сервисы;

● HTTP-сервисы;

● WS-ссылки;

● Общие макеты;

● Общие команды;

● Группы команд;

● Общие картинки;

● Формы, макеты и команды заимствованных объектов:

● Планы обмена;

● Критерии отбора;

● Хранилища настроек;

● Справочники;

● Документы;

● Журналы документов;

● Перечисления;

● Отчеты;

● Обработки;

● Регистры сведений;

● Регистры накопления;

● Регистры бухгалтерии;

● Регистры расчета;

● Планы видов характеристик;

● Планы счетов;

● Планы видов расчета;

● Бизнес-процессы;

● Задачи;

● Таблицы внешних источников данных;

● Кубы внешних источников данных;

● Таблицы измерений внешних источников данных.

Среди контролируемых свойств следует особо выделить:

● Состав плана обмена;

● Предопределенные элементы для справочников, планов видов характеристик, планов счетов и планов видов расчетов.

В базовых версиях прикладных решений работа с расширениями не поддерживается.

32.2. Управление расширениями в режиме Конфигуратора

32.2.1.1. Общая информация

Для управления расширениями в конфигураторе предназначен диалог Расширения конфигурации. Доступ к этому диалогу осуществляется через меню Конфигурация – Расширения конфигурации. С помощью данного диалога можно создать новое расширение, удалить существующее, открыть конфигурацию расширения, сохранить расширение в файл, а также выполнять другие операции.

Рис. 638. Управление расширениями в конфигураторе

В общем случае получить доступ к командам работы с расширением конфигурации можно следующими способами:

1. С помощью команд командная панель панели окна Расширения конфигурации.

2. С помощью контекстного меню выбранного расширения в окне Расширения конфигурации.

3. С помощью меню Действия – Конфигурация окна с расширением конфигурации.

Команды, представленные в этих меню, по смыслу совпадают с командами, применяемыми для основной конфигурации. Подробное описание этих команд см. здесь.

32.2.1.2. Создание расширения

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

Рис. 639. Новое расширение

При создании нового расширения из расширяемой конфигурации автоматически копируются следующие свойства: Основной режим запуска, Назначение использования, Основной язык, Режим совместимости интерфейса и Режим совместимости. Эти же свойства помечаются как контролируемые.

32.2.1.3. Сохранение расширения в файл

Для установки расширения в какое-либо прикладное решение, необходим файл с расширением конфигурации. Для выполнения этого действие следует выбрать в списке расширений конфигуратора нужное расширение и использовать команду Конфигурация – Сохранить конфигурацию в файл командной панели диалога Расширения конфигурации или контекстного меню этого окна.

В результате выполнения этого действия будет сформирован файл с расширением .cfe. Этот файл будет необходимо подключить к прикладному решению. Подробности работы со стандартной функцией управления расширениями описаны в книге 1С:Предприятие 8.3. "Руководство администратора".

32.3. Управление расширениями в режиме 1С:Предприятие

Для управления расширениями в режиме 1С:Предприятия предназначена стандартная функция Управление расширениями конфигурации. Подробности работы с этой стандартной функцией описаны в книге 1С:Предприятие 8.3. "Руководство администратора".

32.4. Работа с расширением

32.4.1.1. Создание заимствованного объекта

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

Предположим, что в расширяемой конфигурации существует справочник Товары, который представлен некоторой структурой, которая представлена на рис. 640.

Рис. 640. Структура справочника Товары

Если добавить в расширение непосредственно сам справочник, то никакие подчиненные объекты добавлены не будут, что видно на рис. 641.

Рис. 641. После добавления объекта

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

Рис. 642. После добавления объекта с родителями

На рис. 642 видно, что кроме добавляемой формы ФормаЭлемента были добавлены также:

● Все реквизиты, которые присутствуют на форме;

● Все объекты, которые образуют типы реквизитов, присутствующих на форме.

При заимствовании составного типа поведение зависит от характеристик такого типа:

● Если в составной тип может входить тип Произвольный, то любой составной тип для такого реквизита будет заимствован как составной тип, состоящий из единственного типа Произвольный.

● Если в составной тип не может входить тип Произвольный, то такой составной тип будет заимствован по следующим правилам:

● Примитивные типы (Строка, Число и т. д.), входящие в состав такого типа, будут заимствованы полностью.

● Если в составной тип входит хотя бы один ссылочный тип (СправочникСсылка, ДокументСсылка и т. д.), то все такие типы будут заимствованы как тип ЛюбаяСсылка. При этом примитивные типы, которые могут входить в составно тип, также будут заимствованы в расширение.

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

32.4.1.2. Работа с заимствованным объектом

Работа с заимствованным объектом имеет некоторые особенности.

Рис. 643. Свойства заимствованного объекта

Во-первых, у заимствованного объекта присутствуют только те свойства, которые могут быть установлены контролируемыми или модифицируемыми. Эта возможность (установка контролируемых или модифицируемых свойств, подробнее см. здесь) является второй особенностью панели свойств заимствованного объекта. Для указания контролируемого свойства, следует установить флажок перед именем свойства. На рис. 643 видно, что для справочника Товары указаны следующие контролируемые свойства: Иерархический, Длина наименования, Тип кода и Допустимая длина кода. Модифицируемое свойство отмечается флажком другого вида в панели свойств. На рис. 643 видно, что свойство Основная форма отмечено как модифицируемое.

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

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

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

32.4.1.3. Создание собственного объекта

В расширении можно не только создавать заимствованные объекты, но и собственные. Собственными могут быть следующие объекты:

● отчет,

● обработка,

● подсистема,

● общий макет,

● общая команда,

● группа команд,

● общая картинка.

Также имеется возможность создания собственных форм, макетов и команд в следующих заимствованных объектах конфигурации:

● Планы обмена;

● Критерии отбора;

● Хранилища настроек;

● Справочники;

● Документы;

● Журналы документов;

● Перечисления;

● Отчеты;

● Обработки;

● Регистры бухгалтерии;

● Регистры накопления;

● Регистры расчета;

● Регистры сведений;

● Планы видов характеристик;

● Планы счетов;

● Планы видов расчетов;

● Бизнес-процессы;

● Задачи;

● Внешние источники данных:

● Таблицы;

● Кубы;

● Таблицы измерений.

Создание и редактирование этих объектов ничем не отличается от аналогичных действий в расширяемой конфигурации. Контроль уникальности имен собственных объектов выполняется:

● При подключении расширения – среди имен расширяемой конфигурации и всех расширений;

● При разработке расширения – среди имен расширяемой конфигурации и того расширения, в котором создается собственный объект.

Если в расширяемой конфигурации, например, существует обработка ПоискВДанных, то ни в одном расширении не может существовать одноименной обработки.

При создании собственного объекта, этот объект получает префикс, который задается при создании расширения.

32.4.1.4. Блокировка расширений

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

32.5. Объекты расширения

32.5.1. Свойства расширения

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

32.5.2. Управляемая форма

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

Рис. 644. Команды редактора формы

Если требуется посмотреть, как выглядит сохраненная форма – следует использовать команду Расширения – Показать сохраненную форму в редакторе заимствованной управляемой формы.

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

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

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

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

1. Если изменений нет – компонента берется из расширяемого объекта;

2. Если изменение есть только в расширяемой форме – компонента берется из расширяемой формы;

3. Если изменение есть только в расширяющей форме – компонента берется из расширяющей формы;

4. Если изменение есть и в расширяемой форме и в расширяющих формах – компонента берется из расширяющей формы.

Сопоставление компонентов управляемой формы выполняется по имени соответствующего элемента.

Вышеописанный режим не действует:

1. Для условного оформления. В этом случае происходит объединение элементов условного оформления из расширяемой формы и всех расширяющих форм аналогично тому, как это происходит при объединении конфигураций.

2. Командный интерфейс результирующий формы формируется путем добавления элементов командного интерфейса из расширяющей формы к командному интерфейсу расширяемой формы. При этом возможна ситуация, когда на форме будут несколько команд с одинаковым представлением, т. к. они образованы командами из разных расширений, но с одинаковым представлением.

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

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

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

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

Если без конфликтов порядок определить нельзя, используется следующий алгоритм:

● Исходным выступает список элементов расширения в порядке, который установлен в расширении.

● Для определения положения элемента, добавленного в основной конфигурации, находится элемент, существующий в сохраненной конфигурации и расположенный перед добавленным элементом (в порядке основной конфигурации):

● В соответствии с порядком элементов в расширении, определяется, какой элемент является следующим – существовавший или добавленный в расширении:

● Если существовавший, то элемент основной конфигурации добавляется после найденного элемента.

● Если элемент или элементы, добавленные в расширении, то элемент основной конфигурации добавляется после них.

● Если в основной конфигурации было добавлено несколько элементов, то последующие элементы добавляются после предшествующих добавленных, даже если предшествующие уже были добавлены расширением.

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

● Новые элементы основной конфигурации, добавленные в начало списка, добавляются сразу после новых элементов расширения, добавленных в начало списка.

● Новые элементы основной конфигурации, добавленные в конец списка, добавляются перед новыми элементами расширения, добавленными в конец списка.

● Если при добавлении оказывается, что элемент уже был добавлен расширением, то такой элемент пропускается.

● Удаляются элементы, которые были удалены в основной конфигурации по сравнению с сохраненной версией.

Как уже было сказано выше, модуль расширяемой формы изначально пустой. Результирующий модуль формы получается «добавлением» текстов всех модулей форм из расширений в модуль расширяемой формы. Фактической модификации текстов не выполняется, но с точки зрения понимания такое упрощение вполне допустимо. В результате такого «добавления» могут возникать конфликты имен. В качестве примера можно упомянуть обработчики событий элементов формы или методы модуля формы, реализующие какую-либо функциональность. Такая ситуация может возникнуть, когда обновление расширяемой конфигурации привносит в расширяемую форму метод, одноименный аналог которого уже создан разработчиков расширения. Чтобы этого избежать, система при создании обработчиков событий использует при формировании имени обработчика значение свойства Префикс имен того расширения, в котором редактируется форма. Прикладному разработчику также рекомендуется использовать префикс для имен методов, добавляемых в расширяющем объекте. Если в результате образования результирующий формы все-таки образуется конфликт имен – возникает стандартная ошибка времени исполнения и результирующая форма оказывается полностью не работоспособной.

Если для какого-то события имеются обработчики в расширяемой форме, а также в расширяющих формах, то при выполнении обработчиков действуют следующие правила:

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

● Если в любом из обработчиков для параметра Отказ (при его наличии среди параметров обработчика) устанавливается значение Ложь – дальнейшее выполнение обработчиков прекращается.

Расширение может влиять на исполнение программного кода после окончания работы обработчика. Для этого следует использовать специальные методы управляемой формы. С помощью метода УстановитьВыполнениеОбработчиковСобытия() можно прекратить дальнейшее выполнение обработчиков в цепочке. Например, если расширение «не хочет», чтобы срабатывал обработчик расширяемой формы, то в расширяющей форме, в коде обработчика должен стоять вызов УстановитьВыполнениеОбработчиковСобытий(Ложь);. Следует пользоваться этой возможностью с осторожностью, т. к. использование данного метода может существенно исказить функционирование дорабатываемого механизма после обновления расширяемой конфигурации или при подключении дополнительных расширений.

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

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

Рассмотрим более подробно порядок срабатывания обработчиков и способы управления этим порядком.

В примере будут рассматриваться:

● Расширяемая конфигурация, в которой существует справочник Товары, для которого создана форма элемента.

● Расширение конфигурации 1 (с префиксом РК1), в которой расширяется форма элемента справочника Товары.

● Расширение конфигурации 2 (с префиксом РК2), в которой также расширяется форма элемента справочника Товары.

● В каждой форме задан обработчик для события ПриИзменении элемента формы, связанного с реквизитом справочника Наименование.

● Расширения зарегистрированы в следующем порядке:

● Расширение конфигурации 1;

● Расширение конфигурации 2.

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

Вначале существуют только обработчики событий:

Копировать в буфер обмена

// Расширяемая форма &НаКлиенте Процедура НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширяемого объекта"); КонецПроцедуры // Расширение конфигурации 1 &НаКлиенте Процедура РК1_НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширения РК1"); КонецПроцедуры // Расширение конфигурации 2 &НаКлиенте Процедура РК2_НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширения РК2"); КонецПроцедуры

В результате изменения поля управляемой формы, связанного с реквизитом Наименование, события будут вызваны в следующем порядке:

Копировать в буфер обмена

ПриИзменении расширения РК2 ПриИзменении расширения РК1 ПриИзменении расширяемого объекта

Добавим в Расширение конфигурации 2, в обработчик РК2_НаименованиеПриИзменении(), запрет дальнейшего исполнения обработчиков:

Копировать в буфер обмена

// Расширение конфигурации 2 &НаКлиенте Процедура РК2_НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширения РК2"); УстановитьВыполнениеОбработчиковСобытия(Ложь); КонецПроцедуры

В этом случае события будут вызваны в следующем порядке:

Копировать в буфер обмена

ПриИзменении расширения РК2

Видно, что обработчики из Расширения конфигурации 1 и расширяемой конфигурации вызваны не были.

Если порядок регистрации расширений будет другим (Расширение конфигурации 2, Расширение конфигурации 1), то последовательность вызова обработчиков станет такой:

Копировать в буфер обмена

ПриИзменении расширения РК1 ПриИзменении расширения РК2

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

Рассмотрим более подробно поведение системы при регистрации методов обратного вызова. Для этого установим прежний порядок регистрации расширений:

● Расширение конфигурации 1;

● Расширение конфигурации 2.

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

Копировать в буфер обмена

// Расширяемая форма &НаКлиенте Процедура НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширяемого объекта"); КонецПроцедуры // Расширение конфигурации 1 &НаКлиенте Процедура РК1_НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширения РК1"); УстановитьВыполнениеПослеОбработчиковСобытия("РК1_НаименованиеПриИзмененииПосле", Неопределено); КонецПроцедуры &НаКлиенте Процедура РК1_НаименованиеПриИзмененииПосле(Элемент, ДополнительныйПараметр) Сообщить("ПриИзменении после расширения РК1"); КонецПроцедуры // Расширение конфигурации 2 &НаКлиенте Процедура РК2_НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширения РК2"); УстановитьВыполнениеПослеОбработчиковСобытия("РК2_НаименованиеПриИзмененииПосле", Неопределено); КонецПроцедуры &НаКлиенте Процедура РК2_НаименованиеПриИзмененииПосле(Элемент, ДополнительныйПараметр) Сообщить("ПриИзменении после расширения РК2"); КонецПроцедуры

В этом случае порядок вызова событий и методов будет следующим:

Копировать в буфер обмена

ПриИзменении расширения РК2 ПриИзменении расширения РК1 ПриИзменении расширяемого объекта ПриИзменении после расширения РК1 ПриИзменении после расширения РК2

Видно, что обработчики вызываются в порядке, обратном порядку регистрации расширений, а методы обратного вызова – в прямом порядке.

Добавим в Расширение конфигурации 2, в обработчик РК2_НаименованиеПриИзменении(), запрет дальнейшего исполнения обработчиков:

Копировать в буфер обмена

&НаКлиенте Процедура РК2_НаименованиеПриИзменении(Элемент) Сообщить("ПриИзменении расширения РК2"); УстановитьВыполнениеПослеОбработчиковСобытия("РК2_НаименованиеПриИзмененииПосле", Неопределено); УстановитьВыполнениеОбработчиковСобытия(Ложь); КонецПроцедуры

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

Копировать в буфер обмена

ПриИзменении расширения РК2 ПриИзменении после расширения РК2

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

32.5.3. Командный интерфейс формы

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

Удалить команду расширяемой конфигурации невозможно.

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

32.5.4. Формы объектов

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

32.5.5. Подсистемы

Подсистема может быть как заимствованным, так и собственным объектом расширения.

Из состава заимствованной подсистемы нельзя удалить объекты конфигурации, которые добавлены туда в расширяемой конфигурации. Но в состав заимствованной подсистемы можно добавить другие объекты: как собственные, так и заимствованные (относительно расширения).

Собственная подсистема расширения может включать как собственные объекты расширения, так и заимствованные объекты.

Для заимствованных объектов имеется возможность изменить картинку подсистемы, с помощью изменения модифицируемого реквизита Картинка.

32.5.6. Права доступа

Доступ к собственным объектам расширения зависит от того, есть в расширении заимствованные роли или нет:

● В расширении нет заимствованных ролей – в этом случае все собственные объекты расширения доступны для всех пользователей прикладного решения с установленным расширением. Права доступа расширяемой конфигурации не влияют на доступ к собственным объектам расширения.

● В расширении есть заимствованные роли – в этом случае доступ к собственным объектам расширения устанавливается для заимствованных ролей. Для остальных ролей доступ к собственным объектам отсутствует. Таким образом, в расширение имеет смысл добавлять те роли, для которых необходимо установить возможность использования собственных объектов расширения.

Также следует помнить о следующих особенностях работы с правами доступа в расширении:

● В расширении не поддерживается изменение общих прав доступа (доступность клиентских приложений, право на доступ к Все функции и т. д.).

● В заимствованных ролях не поддерживается изменение доступа к собственным объектам расширяемой конфигурации.

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

● В расширении не поддерживается создание новых ролей.

32.5.7. Отчеты и обработки

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

Для заимствованного объекта имеется возможность создавать реквизиты объектов, табличные части и реквизиты табличных частей. Работа с этими объектами не отличается от таковой в конфигурации, не содержащей расширений.

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

32.5.8. XDTO-пакет

XDTO-пакет может быть как заимствованным, так и собственным объектом расширения.

Заимствовать можно не только целиком пакет, но и какую-то часть этого пакета, если для нормального функционирования расширения не требуется весь XDTO-пакет. Если заимствуемый элемент уже существует в расширении, пользователю задаётся запрос на его обновление.

При заимствовании переносится:

● Все установленные свойства элемента, включая списочные и агрегатные;

● Все установленные свойства создающихся родительских элементов, кроме списочных и агрегатных.

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

32.5.9. Web-сервис

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

1. Безусловным разрешением использовать любой Web-сервис из любого подключенного расширения. Для этого при публикации следует воспользоваться флажком диалога публикации Публиковать Web-сервисы расширений по умолчанию (подробнее см. здесь) или аналогичным по смыслу атрибутом publishExtensionsByDefault элемента ws файла default.vrd (подробнее см. здесь).

2. Вручную указав Web-сервисы расширений, которые могут быть использованы, в файле default.vrd, в элементе point (подробнее см. здесь).

Использование Web-сервисов из расширений доступно по значению свойства Web-сервиса Имя, так и значению свойства Web-сервиса Имя файла публикации. Если в расширениях существует несколько Web-сервисов с одинаковыми значениями свойства Имя файла публикации, то при обращении к Web-сервису с использованием значения этого свойства, будет использоваться первый найденный Web-сервис.

32.5.10. HTTP-сервис

При подключении расширения к информационной базе, выполняется контроль уникальности значения свойства Корневой URL собственных HTTP-сервисов расширения. Расширения, в которых существуют HTTP-сервисы, у которых значение свойства Корневой URL нарушает уникальность, не подключаются.

32.5.11. Профили безопасности

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

1. Явным указанием флажка Безопасный режим. В этом случае расширение будет выполняться в безопасном режиме (см. здесь) или небезопасном режиме (в зависимости от состояния флажка).

2. Указанием имени профиля безопасности, в рамках которого будет выполняться расширение. Данная возможность доступна только в том случае, если прикладное решение используется в клиент-серверном варианте. Подробнее о профилях безопасности см. здесь.

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

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

При подключении расширения проверяется возможность включения небезопасного режима (если требуется) и если текущее расширение не соответствует требованиям указанного профиля безопасности – подключение расширения не происходит и выдается ошибка.

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

32.5.12. Предопределенные элементы и состав плана обмена

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

Также имеется возможность заимствовать в расширение конкретный элемент состава плана обмен или конкретный предопределенный элемент. При этом в расширение переносятся:

● Для элемента состава плана обмена:

● Признак участия объекта конфигурации в плане обмена;

● Состояние авторегистрации изменений.

● Для предопределенного элемента:

● Имя, код и наименование предопределенного элемента;

● Иерархия подчинения в том случае, если подчиненный элемент создан в иерархическом объекте (справочнике и т. д.);

● Тип предопределенного элемента (для плана видов характеристик). Типы, которые отсутствуют в типе плана видов характеристик заимствованного объекта при переносе удаляются из типа элемента.

● Вид и признак забалансовости (для плана счетов).

При подключении расширения проверяется:

● Для состава плана обмена:

● Совпадение признака участия объекта конфигурации в плане обмена;

● Совпадение состояния авторегистрации изменений.

● Для предопределенных элементов, заимствованных в расширение:

● Совпадение имени, кода и наименования элемента;

● Совпадение родителя предопределенного элемента (для иерархического объекта конфигурации);

● Тип элемента (для плана видов характеристик);

● Вид счета (для плана счетов);

● Признак забалансовости счета (для плана счетов);

● Состав признаков счета (для плана счетов);

● Точное совпадение состава настроек субконто счета (для плана счетов).

32.6. Подключение расширений и время их работы

Подключение расширения к сеансу пользователя выполняется перед вызовом обработчика события УстановкаПараметровСеанса и остается подключенным до завершения сеанса. Обновление расширения (с помощью инструментов администрирования) не приводит к обновлению расширения в существующих сеансах. Существующие сеансы продолжат работу с той «версией» расширения, которое было доступно в момент старта сеанса. Для того чтобы пользовательский сеанс начал работать с новой «версией» расширения – необходимо выполнить перезапуск сеанса.

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

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

32.7. Программное управление расширениями

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

Программный интерфейс предоставляется посредством специального менеджера расширений конфигурации, который представлен свойством глобального контекста РасширенияКонфигурации. Подробное описание методов приведено в синтакс-помощнике.