Как добавить модуль объекта в расширение 1с
Проверяем возможность применения расширений конфигурации
Открываем конфигуратор и переходим к списку расширений конфигурации: Конфигурация => Расширения конфигурации. В списке расширений проверяем возможность применения всех расширений конфигурации: Действия => Проверка возможности применения расширений конфигурации.
Если в процессе проверки расширений конфигурации обнаружены ошибки — их обязательно необходимо устранить. Иначе расширения, в которых обнаружены ошибки, при запуске 1С:Предприятие не будут использоваться.
Обновляем режим совместимости расширения конфигурации
Если после обновления конфигурации расширение выдает ошибку «Значение контролируемого свойства РежимСовместимости у объекта не совпадает со значением в расширяемой конфигурации» — надо актуализировать режим совместимости. Для начала, посмотрите новый режим совместимости в Вашей конфигурации . Теперь необходимо установить аналогичный режим совместимости для расширения конфигурации:
Еще лучшим решением будет снятие контроля за режимом совместимости (система перестанет контролировать это свойство):
Исправляем ошибки изменения свойств объектов и их реквизитов
Когда разработчик расширения конфигурации готовит свое решение, он использует объекты типовой конфигурации. При добавлении объектов в расширение система начинает контролировать его свойства. К примеру, разработчик добавил в расширение реквизит и включил для него контроль типа:
Если в исходной конфигурации тип этого реквизита изменится — расширение не будет применено и возникнет ошибка «Значение контролируемого свойства Тип у объекта не совпадает со значением в расширяемой конфигурации». Для исправления этой ошибки можно снять галочку контроля типа реквизита или установить верный тип для реквизита. Для этого в основной конфигурации находим объект, которому принадлежит реквизит и запоминаем его тип. Далее переходим в расширение и устанавливаем верный тип для реквизита.
Аналогичный подход можно применять для всех свойств объектов и их реквизитов.
Обновляем формы в расширении конфигурации
При переходе на новую версию типовой конфигурации могут измениться формы, которые используются в расширении конфигурации. В платформе предусмотрен механизм быстрого обновления добавленных в расширение форм. Для начала, отобразим в дереве конфигурации расширения только измененные объекты — Действия => Измененные и добавленные в расширении:
Далее открываем нужную форму и нажимаем на кнопку «Обновить расширение формы»:
Переход на платформу 8.3.14 (и выше) и пересоздание расширения конфигурации
Фирма 1С с каждым релизом платформы развивает механизм расширений. Поэтому все расширения можно условно разделять на актуальные и устаревшие. Термин «устаревшие» означает устаревание внутренней структуры расширения относительно последних версий платформ. Первые расширения требовали включения в состав расширения большого количества объектов типовой конфигурации. Это означало, что очень часто такие расширения надо обновлять при обновлении типовой конфигурации. В версиях платформы 8.3.14 и выше добавлены механизмы, благодаря которым в расширение не нужно добавлять все объекты — фактически описываются и захватываются только нужные для доработки объекты типовой конфигурации. Поэтому если у Вас было разработано расширение на платформе 8.3.10 — 8.3.13 — его желательно переработать под актуальные версии платформы.
Бывают случаи, когда для возобновления работы расширения конфигурации требуется анализ логики расширения и его кода. Назовем это сложным случаем адаптации расширения конфигурации. Возможен вариант, когда необходимо полностью переделать расширение и адаптировать его под новую конфигурацию и платформу. Мы можем предложить Вам свою помощь в адаптации расширения конфигурации — за несколько лет с момента создания этого механизма у нас был наработан большой опыт в создании и адаптации расширений конфигурации. Напишите нам и мы быстро согласуем вариант адаптации Вашего расширения конфигурации.
Если говорить коротко, то теперь с помощью расширений вы можете изменять модули типовой конфигурации и добавлять собственные модули.
А если подробнее, то изменять вы можете любые модули, кроме модулей обычных форм:
- Общие модули;
- Модули объектов (модуль объекта, модуль менеджера и т.п.) для всех типов объектов;
- Модуль сеанса;
- Модуль управляемого приложения;
- Модуль внешнего соединения;
- Модули команд;
- Модули форм;
- и т.д.
Надо оговориться, что модули управляемых форм вы могли изменять и раньше, но сейчас мы внесли в этот процесс некоторые изменения.
Здесь и дальше, чтобы вам было проще читать, вместо словосочетания «процедура/функция» мы будем использовать слово «метод». Итак, все изменения, которые вы можете выполнять в модулях, можно разделить на 4 группы:
Перехват
Вы можете перехватывать любые методы типовой конфигурации, обрамляя их собственными, или даже заменяя целиком.Собственные обработчики
Вы можете добавлять собственные обработчики событий типовой конфигурации. Если, например, в типовой конфигурации они не назначены.Собственные модули
Вы можете создавать в расширении собственные общие модули.Вызов
И, наконец, вы можете вызывать в своём расширении любые методы типовой конфигурации.
Когда вы заимствуете и расширяете какой-нибудь модуль типовой конфигурации, то ваш расширяющий модуль будет находиться в одном пространстве имён с типовым модулем. Поэтому, находясь в расширяющем модуле, вы можете обращаться к любым переменным и методам типового модуля напрямую.
Если же вы находитесь в другом модуле, существующем в расширении, то вам будут доступны ваши же экспортируемые переменные и методы расширяющего модуля. Потому что они добавляются в результирующий публичный контекст типового модуля.
Перехват вызовов методов
Задача перехвата вызовов, в подавляющем большинстве случаев, заключается в том, чтобы окружить вызов типового метода некоторыми перед- и/или последействиями. При этом мы не исключили и вариант полного перекрытия вызова типового метода, и реализовали такую возможность.
Необходимость перехвата того или иного типового метода вы полностью описываете в расширяющем модуле. Для этого мы ввели во встроенный язык новый структурный элемент – аннотацию. С помощью аннотации, расположенной перед определением метода, вы указываете, какой именно типовой метод перехватывает процедура/функция, и каким именно образом. Например:
Аннотация &Перед("Процедура1") означает, что перехватывается типовая процедура с именем Процедура1. Имя аннотации Перед означает, что сначала будет выполнена ваша процедура-перехватчик Расш_Проц1(), а затем - типовая Процедура1().
В настоящий момент мы добавили в платформу три возможных имени аннотаций.
Аннотация &Перед
Аннотация с таким именем означает, что ваш перехватчик будет выполнен до того, как начнётся выполнение типового метода.
На схеме типовой и расширяющий модули показаны прямоугольниками, а стрелка показывает последовательность исполнения встроенного языка.
Аннотация &После
Эта аннотация означает, что ваш перехватчик будет выполнен после того, как выполнится типовой метод.
Аннотация &Вместо
Эта аннотация как раз и реализует возможность полного перекрытия типового метода. То есть типовой метод вообще не будет выполнен. Вместо него выполнится только ваш перехватчик.
На одну и ту же типовую процедуру вы можете установить в своём расширении одну из следующих комбинаций перехватчиков:
Последняя комбинация перехватчиков (&Перед и &После) будет исполняться следующим образом:
Если же вы перехватываете типовую функцию, а не процедуру, то вы можете использовать только перехватчик &Вместо.
Вызов метода, перекрытого аннотацией &Вместо
Получается некоторая несправедливость. Процедуру вы можете перекрыть или обрамить. А функцию – только полностью перекрыть.
Чтобы избавиться от этой несправедливости, мы реализовали во встроенном языке новый метод – ПродолжитьВызов(). Если вы вызовете этот метод внутри своей функции-перехватчика, то исполнится та функция, которую вы перекрыли, после чего исполнение кода вернётся в ваш перехватчик:
На встроенном языке такая функция-перехватчик может выглядеть следующим образом:
Таким образом, ваша функция-перехватчик разбивается на две части. Ту часть, которая исполняется перед исполнением типовой функции, и ту, которая исполняется после типовой.
Метод ПродолжитьВызов() вы можете использовать не только при перекрытии функций, но и при перекрытии процедур. В этом случае результат его применения будет по смыслу такой же, как при использовании пары перехватчиков &Перед и &После. Разница будет лишь в том, что в этом случае ваша часть «до» и ваша часть «после» будут существовать внутри одного контекста. В некоторых ситуациях это может быть удобно. На встроенном языке такая процедура-перехватчик может выглядеть следующим образом:
Что лучше, &Перед, &После или &Вместо?
Когда вы перехватываете методы типовой конфигурации, всегда полезно помнить о двух вещах:
- После того, как вы написали своё расширение, типовая конфигурация будет изменяться;
- Ваша цель – добавить свою функциональность, а не навсегда отказаться от того, что есть, и что будет в типовой конфигурации.
С этой точки зрения наиболее предпочтительным является использование перехватчиков &Перед и &После. Потому что с ними перехватываемый типовой метод будет выполнен всегда, без каких либо условий. И если разработчики типовой конфигурации позже внесут в этот метод изменения, эти изменения обязательно отработают и при использовании вашего расширения.
Также вполне приемлемым является использование перехватчика &Вместо и метода ПродолжитьВызов(). Однако тут у вас появляется возможность и соблазн вызывать типовой метод не всегда, а в зависимости от каких-то своих собственных условий. К этому нужно подходить осторожно и помнить, что в тот момент, когда вы отказываетесь от вызова типового метода, вы отказываетесь от вызова не только того метода, который есть в конфигурации сейчас, но и от всех его вариантов, которые появятся в будущем. А в будущем, например, в нём могут появиться важные и полезные изменения.
И, наконец, самый «нехороший» вариант – это полное перекрытие типового метода перехватчиком &Вместо. В этом случае типовой обработчик безусловно не будет выполняться ни сейчас, ни в будущих версиях. То есть всю ответственность за работу будущих версий конфигурации вы берёте на себя, на своё расширение. Наверняка есть ситуации, когда такое полное перекрытие необходимо, но мы призываем вас подходить к его использованию очень взвешенно и осторожно.
Последовательность вызовов при перехвате методов
Здесь, прежде чем рассказывать, необходимо сделать небольшое пояснение. Важной, можно сказать, «идеологической» характеристикой расширений является их автономность. То есть расширения должны проектироваться так, чтобы не зависеть друг от друга.
Но при работе приложения, естественно и очевидно, существует некоторая последовательность вызова подключенных расширений. Эта последовательность известна и сейчас мы о ней расскажем. Но расскажем мы не для того, чтобы на её основе вы создавали взаимозависимые расширения, или расширения, подразумевающие единственную жёстко определённую последовательность подключения. А для того, чтобы вы могли разбирать возникающие проблемы и отлаживать программный код.
Когда вы подключаете расширения к типовой конфигурации, образуется «многослойный пирог». В основании этого пирога находится типовая конфигурация, а на его вершине – последнее подключенное расширение.
Что в конфигураторе, что в режиме 1С:Предприятие, последнее подключенное расширение находится в списке последним.
Таким образом, в этом примере внизу находится типовая, наверху находится Расширение2, а между ними – Расширение1. Каждое следующее расширение перехватывает (расширяет) то, что находится под ним.
Когда платформа сталкивается с перехватчиками, определёнными в расширениях, процесс исполнения встроенного языка идёт сверху вниз этого пирога, в соответствии с аннотациями, которые есть у перехватчиков. До того уровня, до которого он может дойти. После этого он возвращается наверх, если есть перехватчики, и уходит снова в типовую конфигурацию.
Пример 1
Например, если в двух расширениях перехвачен (обрамлён) один и тот же типовой метод, то последовательность вызова обработчиков будет следующая:
- Сначала будет вызван перехватчик из Расширения2, потому что оно сверху. Это будет перехватчик &Перед, потому что у него такая аннотация;
- Затем будет вызван перехватчик из Расширения1, потому что оно следующее в пироге. Это будет снова &Перед, потому что у него такая аннотация;
- После этого будет вызван типовой метод, потому что больше нет перехватчиков, препятствующих его исполнению;
- Затем, в обратной последовательности «пирога», будут вызваны перехватчик &После из Расширения1 и перехватчик &После из Расширения2.
На этом примере можно хорошо понять следующую особенность: если в одном из перехватчиков возникает необработанное исключение, то вся цепочка прерывается, и исключение продолжает распространяться.
Пример 2
Если в перехватчиках используется метод ПродолжитьВызов(), то действует тот же самый принцип «пирога».
- Сначала будет вызван перехватчик из Расширения3, потому что оно сверху. Это будет перехватчик &Вместо, потому что у него такая аннотация;
- При попытке вызвать типовой метод, будет анализироваться оставшийся «пирог». Анализироваться он будет точно таким же образом, как было описано в предыдущем примере;
- В результате исполнение кода вернётся в перехватчик &Вместо, а по его завершении – в типовую конфигурацию.
Пример 3
Важным для понимания моментом является тот факт, что при перекрытии с помощью аннотации &Вместо, по факту перекрывается не только вызов основного метода, но также и перехватчиков, находящихся ниже в «пироге».
В этом примере будет выполнен только перехватчик &Вместо из Расширения2. Потому что он перекрывает собой типовой метод, то есть весь «пирог», который находится под ним.
Пример 4
Это, по сути, вариация на тему второго примера, но когда под верхним расширением находится расширение, также «прокидывающее» вниз вызов типовой процедуры.
По сути, он просто лишний раз визуализирует тот факт, что вызов типового метода относится ко всему «пирогу», находящемуся под расширением. Именно поэтому после вызова перехватчика из Расширения2, будет вызван перехватчик из Расширения1. Потому что в оставшемся «пироге» именно он перекрывает вызов типового метода, до которого хочется «дотянуться» Расширение2.
Перехват обработчиков событий и собственные обработчики в модулях объектов, менеджеров и т.п.
Перехват любых методов в этих модулях выполняется точно так же, как было описано в начале. Однако если перехватываемая процедура является обработчиком события, существуют некоторые особенности. Эти особенности связаны с тем, что в этих модулях все обработчики событий имеют фиксированные имена.
Во-первых, в качестве имени перехватываемого метода указывается имя события. Например, ПередЗаписью:
Во-вторых, наличие типового обработчика этого события не является обязательным. Если типовой обработчик отсутствует, то будет вызван ваш перехватчик. Благодаря этой особенности вы можете назначать собственные обработчики тем событиям, которые не обрабатываются в типовой конфигурации.
Поскольку в модулях объектов обработчики событий имеют фиксированные имена, а перечень аннотаций известен, мы реализовали для вас небольшой «сервис». При создании в расширении обработчика открывается диалог, в котором вы можете выбрать тип вызова. После чего в модуле создаётся заготовка процедуры-перехватчика.
Перехват обработчиков событий и собственные обработчики в модулях форм
Перехват любых методов в этих модулях тоже выполняется точно так же, как было описано в начале. Однако и тут есть особенности, связанные с перехватом обработчиков событий. Эти особенности связаны с тем, что в этих модулях все обработчики событий назначаемые, и не имеют фиксированных имён. Как вы наверняка знаете, чтобы платформа понимала, чем нужно обрабатывать то или иное событие, в конфигураторе, в панели свойств, должна существовать привязка конкретной процедуры к конкретному событию.
Именно по этой причине и только при перехвате обработчиков событий в форме, вам нужно использовать не аннотации, а палитру свойств. Хотя любые другие методы модуля, не являющиеся обработчиками событий, вы можете перехватывать с помощью аннотаций.
Внешне перехватчик события в модуле формы выглядит следующим образом:
То есть аннотация не используется, а тип перехватчика указывается в палитре свойств. Делается это довольно просто. При создании в расширении обработчика по кнопке «лупа» открывается диалог. Он позволяет вам, помимо контекста, указать тип перехватчика (Перед, После или Вместо).
После создания заготовки процедуры в палитре свойств, рядом с именем перехватчика, появляется иконка, отображающая тип перехвата.
Если вы перекрываете типовой обработчик (Вместо), то это будет просто точка.
Если вы создаёте перехватчик Перед или После, то это будет точка рядом с вертикальной чертой. Местонахождение точки, перед или после черты, обозначает тип перехватчика. А кроме этого в палитре свойств появляется второе (пустое) поле рядом с этим событием. С его помощью вы можете задать парный перехватчик, если есть необходимость обрамить типовой обработчик парой Перед - После.
Перехватчики событий, заданные таким образом, будут работать и в том случае, если типовой обработчик этого события отсутствует. Именно таким образом вы можете назначать собственные обработчики тем событиям формы, которые не обрабатываются в типовой конфигурации.
Говоря о модулях форм нужно сделать ещё одно небольшое замечание. Мы немного изменили поведение модулей, расширяющих модули форм, которое существовало ранее. Для того чтобы оно соответствовало поведению остальных модулей, и обеспечивало стабильность программного кода.
Прежде все модули, расширяющие модуль формы, и сам модуль формы, находились в одном пространстве имён. Таким образом, существовала возможность из верхнего расширения вызывать не только методы типовой конфигурации, но и методы лежащих ниже расширений. Теперь мы эту «лазейку» закрыли, и методы лежащих ниже расширений больше недоступны. Теперь вы можете обращаться только к методам, содержащимся в том типовом модуле, который вы расширяете.
Общие модули
В расширении вы можете создавать любые собственные общие модули. Существует только два ограничения:
- Они не должны быть глобальными серверными;
- Они не должны быть привилегированными.
Когда вы расширяете общий модуль типовой конфигурации, тоже есть аналогичные ограничения:
- Нельзя заимствовать глобальные серверные модули;
- Код из вашего расширения будет исполняться только в непривилегированном режиме (если иное не разрешено в профиле безопасности).
Сама операция заимствования глобального серверного модуля не запрещена в дереве конфигурации, но на этапе обновления конфигурации базы данных вы получите ошибку, и обновление выполнено не будет.
Серверные методы расширяются не всегда
Факт того, что ваше расширение успешно подключено к типовой конфигурации, ещё не означает, что все перехватчики, которые есть в вашем расширении, будут применены и начнут выполняться. Тут есть некоторые особенности, связанные с безопасностью.
Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении вашего расширения:
- В обычном режиме исполнения встроенного языка - будут расширяться все методы типового решения, и клиентские, и серверные;
- В безопасном режиме исполнения встроенного языка - будут расширяться только клиентские методы и серверные обработчики форм. К остальным серверным процедурам / функциями расширение применяться не будет.
Когда прикладное решение работает в клиент-серверном варианте и при подключении расширения указан конкретный профиль безопасности, либо информационной базе назначены профили обычного и безопасного режима, то «серверная» часть расширения будет применяться так, как указано в соответствующем профиле.
Для этого в профиль безопасности мы добавили несколько новых свойств.
Самое простое из них – это флажок к расширению всех модулей в группе Разрешен полный доступ. Он «одним махом» разрешает расширение серверного контекста.
Есть и более точная настройка с помощью полей Доступные для расширения модули и Недоступные для расширения модули. Мы предполагаем, что вы будет использовать их следующим образом:
Механизм расширения конфигурации 1C
Приветствую уважаемый читатель, в данной статье предлагаю ознакомиться с Механизмом расширения конфигурации 1С 8.3, в частности мы познакомимся с его работой в режиме Адаптация, а также рассмотрим пример программного изменения Формы объекта при помощи расширения. Ну, а сейчас немного теории…
Как указано в описании: «Механизм расширения конфигурации – это специальный механизм, предназначенный для доработки расширяемой конфигурации без изменения этой конфигурации (в том числе без снятия с поддержки).»
Основным назначением расширения конфигурации является доработка прикладных решений (конфигураций) под нужды клиента. При этом нет необходимости в снятии дорабатываемой конфигурации с поддержки. В результате сохраняется простота сопровождения и обновления типового прикладного решения, стоящего на поддержке.
При разработке расширений следует учитывать следующие факты:
— в системе могут функционировать более одного расширения.
— расширяемая конфигурация в любой момент может быть изменена, например, в результате обновления и разработчик расширения никак не может повлиять на возможность или невозможность обновления
Расширение может иметь одно из следующих назначений:
Исправление — предназначено для оперативного исправления ошибок в прикладном решении. В таких расширениях часто применяется метод с помощью аннотации Вместо. Как правило это назначение предназначено для определенной версии прикладного решения. При выходе следующей версии этого решения автор расширения должен проводить анализ применимости созданных расширений в новой версии.
Адаптация — предназначено для адаптации прикладного решения под условия конкретного заказчика. Предполагается, что в каждый момент времени в информационной базе существует минимальное количество таких расширений. Если в одно расширение невозможно включить весь набор изменений, то рекомендуется расширения с назначением Адаптация разбивать по максимально крупным блокам расширяемого прикладного решения.
Дополнение — предназначено для реализации новых возможностей прикладных решений, которые минимально привязаны к конкретной версии прикладного решения. В качестве примера можно привести создание нового набора отчетов, который отсутствует в прикладном решении. Предполагается, что таких расширений может быть произвольное количество.
Расширение создается в конфигураторе, хранится в информационной базе и может быть выгружено в файл. Для подключения расширения, сохраненного в файл, в прикладное решение нет необходимости использовать конфигуратор. Подключить расширение можно с помощью стандартного функционала (Все функции Стандартные Управление расширениями конфигурации). Подключить расширение также используя программный интерфейс, предоставляемый платформой.
Ограничения использования расширений:
Расширения конфигурации не поддерживают создание следующих собственных объектов:
— Подписки на события.
— Функциональные опции и параметры функциональных опций.
— Бизнес-процессы и задачи.
— Внешние источники данных.
Не поддерживается расширение следующих объектов:
— Нельзя создавать подчиненные подсистемы.
— Если объект не может быть собственным объектом расширения его расширение также не поддерживается.
— Состав значений перечислений;
Не поддерживается добавление реквизитов и табличных частей для:
— План видов характеристик;
— План видов расчетов.
Не поддерживается изменение структуры регистров всех видов. Поддерживается только расширение состава регистраторов.
В базовых версиях прикладных решений работа с расширениями не поддерживается.
Стоит помнить, что Механизм расширения конфигурации – это перспективный постоянно развивающийся механизм и с выходом новых версий платформ их функционал только расширяется и лишается текущих недочетов.
Как добавить расширение конфигурации 1С 8.3
Предлагаю рассмотреть задачу добавления нового Справочника «Категория должности по Классификатору Предприятия» с выводом его значения на Форму Справочника Должности, на базе Конфигурации ЗУП 3.1
Для создания расширения необходимо запустить 1С в режиме конфигуратора.
В конфигураторе необходимо зайти в меню «Конфигурация» и выбрать пункт «Расширения конфигурации». Откроется окно со списком расширений (если они есть). Далее нажмем кнопку «Добавить». Мы увидим диалоговое окно создания расширения:
Стоит отдельно выделить поле Назначение – необходимо выбрать его значение в зависимости от решаемой задачи – т.к. мы выполняем добавление объектов по требованиям конкретного заказчика – нам подойдет вариант «Адаптация».
После нажатия на кнопку «ОК» — двойным кликом по появившейся строке откроем Конфигурацию расширения. Мы увидим практически пустое дерево конфигурации.
Добавим в расширение справочник Категория должности по Классификатору Предприятия. Стоит обратить внимание, что в название всех объектов процедур и функций созданных в расширении, добавляется его префикс (в нашем случае Расш1_);
Разместим наш новый Справочник в Подсистеме «ШтатноеРасписание» для этого необходимо добавить эту подсистему в Расширение – Перейдем в дерево основной Конфигурации и нажмем правой кнопкой мыши на строке с нужной подсистемой и выберем пункт «Добавить в расширение».
Теперь мы можем управлять ее составом, добавим наш новый объект в подсистему.
Далее добавим в расширение Справочник Должности и добавим для него новый реквизит КатегорияДолжности с типом СправочникСсылка.Расш1_КатегорияДолжностиПоКлассификаторуПредприятия
Далее необходимо решить задачу с выводом реквизита КатегорияДолжности на форму Справочника Должности, реализовать это можно двумя способами:
— Интерактивно, добавив Форму «ФормаЭлемента» в расширение
— Программно, не добавляя Форму Справочника в расширении, а добавив подходящую процедуру, вызываемую в обработчике Формы «ПриСозданииНаСервере» в расширение.
Останавливаться на плюсах и минусах каждого решения не будем, а ниже рассмотрим оба варианта.
Интерактивное изменение Формы в расширении.
Для того чтобы вывести Реквизит на форму интерактивно: необходимо добавить саму Форму «ФормаЭлемента» в расширение. Обращу ваше внимание на следующий момент – для того чтобы появилась возможность Интерактивного добавления Реквизита объекта на форму необходимо сам Объект тоже добавить в расширение.
Далее добавим новый Реквизит в подходящую Группу на форме.
Запустив 1С в режиме Предприятия убедимся, что новый Справочник появился в интерфейсе
А открыв элемент справочника Должности, увидим, что добавляемый реквизит Категория должности также в нужном месте.
Программное изменение Формы в расширении.
Для того чтобы программно добавить элемент на форму нам необходимо определится в каком месте это сделать оптимально с точки зрения простоты дальнейшей поддержки и обновления конфигурации.
Предлагаю воспользоваться одной из процедур вызываемых в обработчике Формы «ПриСозданииНаСервере», в которую передается наша Форма в качестве параметра например УправлениеСвойствами.ПриСозданииНаСервере.
Перейдем в Общий модуль УправлениеСвойствами где находится данная процедура, и кликнем правой кнопкой мыши по процедуре ПриСозданииНаСервере. В выпадающем меню выберем пункт «Добавить в расширение»
Система предложит нам выбрать одну из аннотаций, подробнее о каждой из них рассмотрим в следующих публикациях, а сейчас выберем «Вызывать после»
После проделанных процедур увидим что в Расширение был добавлен общий модуль УправлениеСвойствами и процедура Расш1_ПриСозданииНаСервере с аннотацией &После(«ПриСозданииНаСервере»)
Далее в добавленную процедуру поместим следующий код:
Запустим 1С в режиме предприятия и убедимся, что на форме также появился добавленный реквизит «КатегорияДолжности (пр.)»
Готовое расширение можно выгрузить в файл перейдя в конфигураторе в меню «Конфигурация» и выбрать пункт «Расширения конфигурации». В открывшемся списке расширений по правой кнопкой мыши можно вызвать выпадающее меню, либо выбрать пункт командной панели «Конфигурация» и выбрать пункт «Сохранить конфигурацию в файл…». На выходе мы получим Файл типа *.cfe который можно передать заказчику.
Таким образом, мы научились создавать собственные расширения на примере конкретного кейса.
Начиная с версии платформы 1С 8.3.9.1818 появилась прекрасная возможность доработки практически любых модулей конфигурации используя механизм расширений. В статье мы рассмотрим примеры использования аннотаций: Перед, После, Вместо, а также замечательного метода ПродолжитьВызов() и их комбинаций.
В качестве ограничений расширения методов можно выделить:
— запрет на заимствование в расширение глобальных серверных модулей;
— по умолчанию расширенные методы привилегированного общего модуля выполняются в непривилегированном режиме (но это можно настроить в профиле безопасности).
— запрет на создание в расширении привилегированных и глобальных серверных общих модулей;
При расширении модуля объединяется пространство имен расширяемого и расширяющего модуля. Так из расширяющего модуля можно обращаться к переменным и методам расширяемого модуля. А экспортные методы и переменные, созданные в расширяющем модуле, также доступны из других модулей конфигурации и расширения.
В заимствованном в расширение модуле можно:
— создавать собственные переменные, процедуры и функции;
— назначать собственные обработчики на события, которые не обрабатываются в конфигурации;
— перехватывать любой метод расширяемого модуля и вызывать до и/или после него собственные методы.
Механизм аннотаций.
Для перехвата методов основной конфигурации используется механизм аннотаций при помощи элементов встроенного языка – &Перед, &После, &Вместо, — они определяют последовательность исполнения расширяемого и расширяющего методов.
Ниже на примерах рассмотрим каждую аннотацию, а также возможность их комбинаций.
Аннотация &Перед
Исходя из названия, очевидно, что метод, обрамленный данной аннотацией, будет выполняться до того, как будет происходить выполнение расширяемого метода.
Наглядно это можно отразить на приведенной ниже схеме
В качестве примера решим задачу вывода Фото Физического лица на Форму элемента Справочника Сотрудники в конфигурации ЗУП 3.1. Для этого добавим в расширение метод СотрудникиФормы.СотрудникиПриСозданииНаСервере вызываемый в обработчике Формы ПриСозданииНаСервере.
Запустим 1С Предприятие в режиме конфигуратора и перейдем в общий модуль СотрудникиФормы, далее щелкнув правой кнопкой мыши по заголовку процедуры СотрудникиПриСозданииНаСервере откроем выпадающий список – в нем выберем строчку «Добавить в расширение», система спросит тип аннотации – выберем «Вызывать перед»
Далее мы увидим следующее – в расширение добавился общий модуль СотрудникиФормы и создалась процедура Расш1_СотрудникиПриСозданииНаСервере с аннотацией &Перед(«СотрудникиПриСозданииНаСервере»)
Добавим в процедуру код программного вывода изображения на форму:
Запустим 1С в режиме предприятия и убедимся что фото Физлица выведено на Форме Сотрудника
Аннотация &После
Исходя из названия, очевидно, что метод, обрамленный данной аннотацией, будет выполняться после выполнения расширяемого метода.
Для примера рассмотрим задачу изменения цвета текста в поле ФОТ на Форме элемента Справочника Сотрудники в конфигурации ЗУП 3.1. в зависимости от выведенного значения. Если ФОТ < 30 000 сделаем желтый, если значение в диапазоне от 30 000 до 50 000 зеленый, если больше 50 000 – красный.
Вернемся в режим конфигуратора 1С Предприятия, данные ФОТ заполняются в обработчике Формы элемента Справочника Сотрудники ПриЧтенииНаСервере процедурой общего модуля СотрудникиФормы.СотрудникиПриЧтенииНаСервере. Для того чтобы анализировать уже заполненное значение ФОТ добавим метод СотрудникиФормы.СотрудникиПриЧтенииНаСервере в расширение с аннотацией &После
Так как общий модуль СотрудникиФормы уже был в нашем расширении в него просто добавилась процедура Расш1_ Расш1_СотрудникиПриЧтенииНаСервере с аннотацией &После(«СотрудникиПриЧтенииНаСервере»)
Далее добавим в процедуру код изменяющий цвет текста
Запустим 1С в режиме предприятия и убедимся что цвет текста в поле ФОТ стал зеленым
Аннотация &Вместо
Данная аннотация полностью отключает выполнение расширяемого метода и выполняется только метод расширенный
Стоит отметить, что если для процедур основной конфигурации доступны все три аннотации то при добавлении в расширение функции из основной конфигурации доступна только одна аннотация &Вместо
Для примера запустим 1С Предприятие в режиме конфигуратора и добавим используемую выше функцию получения изображения физлица КадровыйУчетРасширенный.АдресФотографииФизическогоЛица в расширение. Платформа 1С создала функцию Расш1_АдресФотографииФизическогоЛица в расширении со следующим содержимым:
Метод ПродолжитьВызов() рассмотрим ниже, а сейчас заменим содержимое функции слегка доработанным типовым кодом, добавив в него условие, что если пользователю не доступна Роль «Расш1_ПросмотрФото» то адрес изображения возвращаться не будет:
Запустим 1С в режиме предприятия и убедимся, что изображение скрыто даже для пользователя с полными правами
Метод ПродолжитьВызов()
Теперь остановимся на методе платформы 1С ПродолжитьВызов(), если добавить его в расширяемую функцию, то можно обрабатывать его результат как бы было в случае использования аннотации &После для процедуры.
Решим сейчас такую задачу – выведем вместо надписи «Картинка не установлена» собственную картинку для тех Сотрудников у которых в базе нет фото. Для этого добавим также в расширении картинку в ветку метаданных Общие картинки новый элемент Расш1_ПустоеФото с подходящим изображением
Изменим код расширяемой процедуры, чтобы он выглядел следующим образом:
Запустим 1С в режиме предприятия и убедимся, что вместо надписи «Картинка не установлена» мы видим добавленную в расширение картинку-заглушку
Если вернуться к предыдущей задаче, где мы возвращали пустое значение картинки, в случае если у пользователя нет нужной роли, код функции можно переписать, также используя метод ПродолжитьВызов()
Метод ПродолжитьВызов() можно также использовать для процедур с аннотацией &Вместо он будет равнозначен совместному использованию &Перед и &После с той лишь разницей что в случае использования метода ПродолжитьВызов() часть процедуры до его вызова и часть после будут существовать внутри одного контекста, что требуется для решения некоторых задач. Схематически отобразить это можно следующим образом:
Совместное использование &Перед и &После
Использование метода ПродолжитьВызов()
Последовательность выполнения расширенных методов
Несмотря на то что разработка расширений должна вестись по идеологии одно расширение – одни методы, платформа определяет порядок обхода по принципу пирога т.е. сначала отрабатывают внешние слои, а затем внутренние: в первую очередь отрабатывает код последнего добавленного расширения, а последним отрабатывает код основной конфигурации, наглядно это можно увидеть на схемах ниже.
Порядок следования расширений в конфигурации
Порядок обхода аннотаций &Перед и &После
Порядок обхода аннотации &Вместо совместно с методом ПродолжитьВызов() и аннотациями &Перед и &После
Порядок обхода аннотации &Вместо без метода ПродолжитьВызов()
Важно отметить что в данном случае будет выполнятся только код из Расширения 2
В данной статье мы на примерах разобрали, как работает механизм аннотаций при расширении методов начиная с версии платформы 1С 8.3.9.1818. Удачи в программировании. Спасибо.
Привет! Кто может помочь?
Я программист 1С8 (опыт работы с 2014, с лета 2016 работаю в 1С Франчайзи). Но с Расширениями имею дело впервые.
Инфы нашел достаточно:
http://v8.1c.ru/o7/201410ext/
http://catalog.mista.ru/public/369451/
но это - как на стандартную задачу наложить Расширение.
И все вроде понятно.
А у меня задача ОБРАТНАЯ. Имеется у клиента несколько доработанных баз (оттого, проблемы со стандартными обновлениями). Требуется - доработки по максимуму вынести в Расширения, оставив БД максимально приближенные к Стандартным.
И я совершенно не понимаю как это сделать! Не нашел - какой там механизм?
Кто может "на пальцах" объяснить?
Сначала определяю все интересующие меня объекты - сравнить конфигурацию с конфой поставщика, эт просто.
Создать в исходной нестанд. конфе новое расширение - создал.
А дальше?
Перенести все измененные объекты в Расширение?
Так переносятся ТОЛЬКО формы. А мне ж надо и модуль, и все команды - мне их вручную заполнять?
(Например, Отчет1, совсем новый. Ладно, делаю его внешним и Расширение - вставить. А "прототип" из исходной конфы убираю.
Ругается - требует "не обнаружен в конфе". Какое . если я ясно прочел что в Расширении ДОЗВОЛЕНЫ НОВЫЕ отчеты и обработки - отсутствующие в конфе? Или я не так понял??)
Еще вопрос - вот в Док или Спр изменена Форма. Еще появился / был изменен реквизит - но тут сказано, реквизиты можно оставить, их будем по-прежнему вручную обновлять, раз их расширение не берет.
Переношу Форму (заодно перелетает весь Объект в дерево, Ок!). А поле модуля чистое. Понимаю, что это значит - использовать модули конфы. А как мне изменения перенести - вручную копировать все процедуры где измененный текст - с префиксом расширения перед именем? Ладно, делаю так - а что делать, если внутри еще обращения к процедурам (другим в модуле формы, или в модуле Менеджера, или среди Общих модулей?).
Перенес, ругается.
Мне тогда "охватом" все их тоже переносить? Общие - ладно. А прочие модули той же формы (к которым ссылки) - их куда? И ставить ли перед ними префикс расширения?
В общем, крутился, не получается.
ЧТО делаю не так?
Не понятно конкретно:
1) если объект новый. Как его ПОЛНОСТЬЮ перенести?
1а - добавить - модули не переносятся.
1б при удалении "прототипа", ругается.
2) если объект лишь изменен. ЧТО переносить? ФОрму измененную перенести, ладно. А модули как - я ж написал?
Если команда и "стерильно" чистая - ладно, прописано по ссылке.
А если она ссылается на другую процедуру, ее тоже переносить? С префиксом РАсш - или это лишь для команд?
3) Я главного не понимаю. Какие Объекты конфы видны из Расширения? Или их все (к которым ссылки) надо переносить?
4) насколько обязательно для Расширения наличие "прототипа"? Вот если новая форма, или макет. Переношу, а из конфы удаляю. Ругается!
5) совместимость! Даже в гугле в одних пишут - ставить "не использовать совместимость", в других - "ставить 8.3.9" (чтоб можно было расширять и модули объекта, и модули менеджера). Так что писать??
6) и общие модули - даже в гугле встретил что "не все". А какие.
7) наконец, а что со Свойствами делать? Вот в различии/ сравнении конф, выдало что например в Свойствах формы стоит что-то иное. А в Расширении это поле на форма/свойства вообще отсутствует, что с этим делать?
(0) рашсирения это только обработки и отчеты. максимум формы.
больше НИЧЕГО
никаких реквизитов или обьектов
Повторяю, когда я перенес Отчет (сначала, сделал как обычно, Добавить в Расширение - модуль и команды пустые!) - тогда я исходный сохранил как Внешний, и в Расширении на него заменил. Модуль и команды перенеслись.
Ругается, не работает.
Аналогично - при переносе отдельной Формы. Удаление "прототипа" - и ругань. В чем дело?
3) и вопрос - ЧТО ВИДНО из Расширения? Или мне тупо вручную, по перенесенным модулям отслеживать ВСЕ ссылки и соответствующее переносить?
Я так понимаю, что перенос есть ДВУХ типов.
а)) - переносим то что меняем. Объекты не любые а строго из списка (формы, обработки, отчеты, с 8.9 - еще что-то).
б)) - то что НЕ меняем - но там есть ссылки, по которым обращается из а)).
Верно?
И что НЕ перенесено по группе б) - Расширение просто не видит?
Или я ошибаюсь?
Тогда отчего ругается?
Спасибо.Читаю.
Но если что - вернусь с вопросами.
(просто я не на работе счас - и до баз данных и практики доберусь лишь вечером, а то и в понедельник)
(5) Вы уже утомили по десять раз в каждом посте повторять про чью-то там ругань.
Либо позовите специалиста, либо, если хотите, чтобы тут помогли, задайте конкретный вопрос с описанием того в каком месте что не работает, и как выглядит эта ваша ругань.
Отчеты и обработки абсолютно нормально выносятся в расширение.
Предположу, что если Вы делали через выгрузку во внешний отчет (обработку), то потеряли по дороге модуль менеджера (у внешних отчетов/обработок модуля менеджера нет, т.к. нет самого менеджера). Если я прав, то достаточно просто перенести модуль менеджера из исходного объекта основной конфигурации в объект, который у вас теперь в расширении.
Спасибо.
Но все же вопрос (вот прочел по ИТС ссылке - не нашел).
Верно ли я понял, что Расширение - НЕ ВИДИТ объектов основной конфы, если я их не перенес?
(например, если в измененной конфе есть Константа, или Регистр - и к нему идет обращение. Обязательно надо перенести и этот объект тоже?)
(9) Смотря что понимать под "видит". Если есть например константа в основной конфе и ты в раширении в обработке устанавливаешь значение этой константы то все будет ок, за исключением нескольких моментов. В расширении константа не видна при автодополнении кода, т.е. ты пишешь Константы. и имя константы из основной конфы показано не будет, при этом синтаксический контроль ругаться не будет. Константа также не будет видна в конструкторе запроса.
Рекомендую создать пустую базу и экспериментировать - это самый быстрый путь.
Единственным ограничением расширений являеится невозможность добавления некоторых объектов метаданных и их реквизитов. Для себя делаю так. Надо добавить новый док - добавляем в основную конфу, но форму, модуль менеджера, модуль объекта - все это описываем уже в расширении. В общем в расширении все кроме самих скелетов объектов метаданных.
И последнее, надо учесть что из основной конфы модули расширения не видны. При этом из одного расширения видно другое без проблем, независимо от порядка их подключения
Так надо чтоб режим совместимости основной конфигурации (равно как и расширения) был не ниже 8.3.10, чтобы новые объекты и реквизиты можно было добавлять
Резюмирую: Заимствовать надо объекты конфигурации поставщика, а все изменения и интерфейсного и модульного порядка делать в расширении. Отлично работает. У меня куча, БОЛЬШАЯ куча доработок. ВСЕ перенес на расширения. Не вешаю на конфу замок только потому, что пока поставщик делает все конфы с совместимостью с 8.3.8. Как только режим совместимости повысят, вообще закрою конфу
(15) Подкреплять слова "рашсирения это только обработки и отчеты. максимум формы . никаких реквизитов или объектов" фразой "нельзя добавить свой справочник" - сильно.
(16) ну и? где противоречия ты увидел?
Я от 1С уже 15 лет жду чтобы можно было свою подсистему с любыми метаданными добавлять в типовую.
Вести ее отдельно, разрабатывать. Потом подключать к базе данных. В том числе естественно со справочниками и документами и прочими обьектами которые также и БД расширяют.
А пока что все на уровне форм, отчетов и обработок. Полноценно задача не решена. Хотя обещалось что с выходом восьмерки решения будут блоковыми (хотя может я не правильно воспринял)
Пока что если ты что то дописываешь в типовой - даже нельзя поставку сделать без типовой.
(17) а для меня если нельзя добавить справочники, документы. регистры - это все равно что ничего)) Остальное вообще даже не волнует.
(19) Конечно, если вы, условно, из УТ делаете Автосервис, тогда - ДА, расширения не помогут. Но они и не предназначены для этого. А если вам надо скорректировать движения, добавить реквизит, доп расчет, автоматическое заполнение и т.п., то расширение - то что надо. Да, они и в таких задачах еще не все умеют, но скорость прогресса в возможностях впечатляет(сравните 8.3.8 и 8.3.10 - велосипед и авто). Так что .
(18) "где противоречия ты увидел?" // Ты утверждаешь несколько пунктов, а подтверждаешь только последний из них
(20) да я тоже надеюсь. А так кстати и на безрыбье рыба.
Кстати вот наверное сейчас все обработки перенесу в расширения.
Читайте также: