1с общая команда в расширении
В данной статье предлагаю рассмотреть, что такое «расширение конфигурации», как добавить расширение или же отключить его. Начиная с версии 1C 8.3.6.1977 в платформе введен новый механизм – расширения конфигурации. Сначала немного теории.
Что такое расширения?
Расширения представляют в 1С собой что-то вроде параллельных конфигураций, которые автоматически объединяются с основной конфигурацией поставщика. Причем в расширениях можно добавлять как свои объекты, так и заимствовать объекты основной конфигурации.
Для чего нужны расширения?
В первую очередь расширения созданы для облегчения внесения изменений в программу. То есть, если пользователи просят добавить какой-либо функционал, то до появления расширений программистам приходилось снимать конфигурацию с полной поддержки и менять типовую конфигурацию.
Снятие с полной поддержки влечет за собой ряд неудобств:
- пропадает возможность автоматического обновления, что приводит как минимум к увеличению времени на то, чтобы обновить конфигурацию;
- требуется высокая квалификация специалиста, обслуживающего программу;
- если изменения вносились в стандартные объекты типовой конфигурации, то при обновлении они могут пропасть, то есть замениться опять на типовые, от поставщика.
При использовании расширений при внесении изменений программист не будет трогать типовую конфигурацию. Все изменения будут делаться при помощи расширений, которые (как я писал выше) тоже являются конфигурациями. Таким образом, основная конфигурация останется на полной поддержке.
После обновления основной конфигурации, если произошли в новом релизе какие-то изменения с объектом, который ранее был изменен расширением, то изменения все равно возьмутся из расширения. То есть расширения имеют больший приоритет, чем основная конфигурация.
Видео — расширения в 1С за 45 минут
Пример добавления расширения в 1С
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Чтобы показать, что такое расширение, лучше привести пример его создания в конфигураторе 1С.
В конфигураторе зайдем в меню «Конфигурация» и выберем пункт «Расширения конфигурации». Откроется окно со списком расширений (если они есть). Нажмем кнопку «Добавить» и добавим новое расширение. Теперь можно открыть конфигурацию расширения:
Как видно, конфигурация расширения имеет точно такую же структуру, как и основная. Только она изначально совершенно чистая, без объектов.
Недавно я писал статью о том, как самим сделать обработку для перенумерации объектов. На её примере я хочу сделать ее встроенной при помощи расширения.
В обработке у меня есть поле со ссылкой на справочник «Организации». Поэтому мне этот справочник необходим. Но мы не будем создавать новый справочник «Организации», тем более что платформа этого и не позволит. Нельзя, чтобы в конфигурации расширения были объекты, одноименные с объектами в основной конфигурации.
Поэтому справочник мы позаимствуем из основной конфигурации:
Теперь нажмем правой кнопкой мышки на «Обработки» и выберем «Вставить внешнюю обработку, отчет…» Таким образом, добавим новую обработку в конфигурацию расширения. Если Вы используете мою обработку, то сразу переименуйте ее, так как в основной конфигурации уже есть обработка с таким именем.
Ну и последний штрих. Я хочу, чтобы моя обработка отражалась в меню «Администрирование». Для этого позаимствуем одноименную подсистему основной конфигурации. Не забудьте указать в обработке, что она относится к этой подсистеме.
Вот такая структура у меня получилась:
Посмотрим, что у нас получилось. Обновляем конфигурацию базы данных и запускаем программу в режиме 1C: Предприятие, и идем в меню «Администрирование». Да, чуть не забыл, конфигурацию расширения необходимо закрыть, иначе программа не запустится:
Таким образом, мы добавили в программу новую обработку, не изменив при этом основную конфигурацию.
Расширение можно выгрузить в файл и загрузить потом в другую конфигурацию. Это очень удобно для разработчиков. Получив заказ, программист на своей конфигурации делает расширение и передает его потом заказчику.
В заключение хочу сказать, что работа с расширениями еще не закончена. Постоянно добавляются новые возможности, расширяется круг объектов, с которыми можно работать. Поэтому, если Вы решили активно работать с расширениями, чаще обновляйте платформу.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Привет! Кто может помочь?
Я программист 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) да я тоже надеюсь. А так кстати и на безрыбье рыба.
Кстати вот наверное сейчас все обработки перенесу в расширения.
В конфигурациях на основе БСП есть возможность вывести различные команды в форме объекта через подсистему "Подключаемые команды". В статье показан пример, как, используя расширение, подключить обработку заполнения для документа "Заказ покупателя" в конфигурации "Управление нашей фирмой, ред 1.6.14".
Изменения и дополнения:
Обновлено 08.11.2018. Добавлено расширение для конфигурации "Бухгалтерия предприятия, ред. 3.0.65", пример заполнения документа "Реализация (акты, накладные)"
Обновлено 09.10.2018. Добавлено расширение для конфигурации "Зарплата и управление персоналом, ред. 3.1.7", пример заполнения документа "График отпусков"
Обновлено 08.10.2018. Добавлено расширение для конфигурации "Розница, ред. 2.2.9", пример заполнения документа "Заказ покупателя"
Обновлено 07.10.2018. Добавлено расширение для конфигурации "Управление торговлей, ред. 11.4.2", пример заполнения документа "Заказ клиента"
Добавлено 07.10.2018 Краткое содержание: описана альтернатива внешним обработкам заполнения объектов, в конфигурациях на основе БСП.
Почему не через подсистему "Дополнительные отчеты и обработки"? Мне показалось это более удобным способом именно при вызове клиентского метода, так как можно просто получить форму объекта и сам объект, удобнее отлаживать код. Плюс подключение команды имеет больше дополнительных настроек. В конечном итоге у разработчика есть выбор как решить задачу в том или ином случае.
Итак, что нужно для подключения команды заполнения объекта?
- Добавить новое расширение или использовать имеющееся.
- Добавить в расширение подсистему "ПодключаемыеОтчетыИОбработки"
- Добавить в расширение роль "БазовыеПрава"
- Добавить в расширение объект, который будем заполнять, в моем случае документ "ЗаказПокупателя"
- Создать в расширении обработку, в моем случае "ЗаполнениеЗаказПокупателя"
- В обработке "ЗаполнениеЗаказПокупателя" добавить основную форму
Это все объекты, которые понадобятся в расширении для включения через подсистему "Подключаемые команды" команды заполнения объекта.
Далее надо настроить объекты расширения и добавить программный код:
- В расширении в состав подсистемы"ПодключаемыеОтчетыИОбработки" включить обработку "ЗаполнениеЗаказПокупателя"
- В расширении для роли "БазовыеПрава" дать право "Использование" на обработку "ЗаполнениеЗаказПокупателя"
- В расширении в модуле менеджера документа "ЗаказПокупателя" надо добавить экспортную процедуру "ДобавитьКомандыЗаполнения". Процедуру надо добавить в том случае, если в основной конфигурации нет этой процедуры.
- В расширении в модуле менеджера обработки "ЗаполнениеЗаказПокупателя" надо добавить две экспортные процедуры "ПриОпределенииНастроек" и "ДобавитьКомандыЗаполнения". При добавлении команды указывается видимость команды в формах (можно указать видимость только в форме документа, как в примере), можно указать необходимость записывать ил проводить объект перед вызовом команды, определять условия видимости команды, указывать дополнительные параметры формы (более подробно в документации к БСП).
- В модуле основной формы обработки "ЗаполнениеЗаказПокупателя" добавить экспортную процедуру "Подключаемый_ЗаполнитьОбъект". Имя процедуры такое, как задано в параметре команды "Обработчик". В теле процедуры собственно код заполнения объекта. Получение формы объекта и самого объекта через параметр процедуры "ПараметрыВыполнения".
Собственно это весь необходимый минимум, согласно документации БСП. Если добавляемая команда одна, то она отображается в форме документа на командной панели формы в виде кнопки с представлением команды. Если команд несколько, то команды отображаются в подменю "Заполнить".
Для конфигурации "Управление нашей фирмой, ред 1.6.14" мне понадобилось дополнительно включить в расширение общий модуль "ЗаполнениеОбъектовПереопределяемый" и разрешить использование подключаемых команд для формы объекта "ЗаказПокупателя" добавив процедуру "ПередДобавлениемКомандЗаполнения" с аннотацией "&После".
В приложении к публикации расширение с описанным примером плюс дополнительно показано как получить объект формы на сервере и перенести изменения объекта, сделанные на сервере, в форму объекта на клиенте. Также в расширении показано как отобразить одну команду в подменю "Заполнить".
Если говорить коротко, то теперь с помощью расширений вы можете изменять модули типовой конфигурации и добавлять собственные модули.
А если подробнее, то изменять вы можете любые модули, кроме модулей обычных форм:
- Общие модули;
- Модули объектов (модуль объекта, модуль менеджера и т.п.) для всех типов объектов;
- Модуль сеанса;
- Модуль управляемого приложения;
- Модуль внешнего соединения;
- Модули команд;
- Модули форм;
- и т.д.
Надо оговориться, что модули управляемых форм вы могли изменять и раньше, но сейчас мы внесли в этот процесс некоторые изменения.
Здесь и дальше, чтобы вам было проще читать, вместо словосочетания «процедура/функция» мы будем использовать слово «метод». Итак, все изменения, которые вы можете выполнять в модулях, можно разделить на 4 группы:
Перехват
Вы можете перехватывать любые методы типовой конфигурации, обрамляя их собственными, или даже заменяя целиком.Собственные обработчики
Вы можете добавлять собственные обработчики событий типовой конфигурации. Если, например, в типовой конфигурации они не назначены.Собственные модули
Вы можете создавать в расширении собственные общие модули.Вызов
И, наконец, вы можете вызывать в своём расширении любые методы типовой конфигурации.
Когда вы заимствуете и расширяете какой-нибудь модуль типовой конфигурации, то ваш расширяющий модуль будет находиться в одном пространстве имён с типовым модулем. Поэтому, находясь в расширяющем модуле, вы можете обращаться к любым переменным и методам типового модуля напрямую.
Если же вы находитесь в другом модуле, существующем в расширении, то вам будут доступны ваши же экспортируемые переменные и методы расширяющего модуля. Потому что они добавляются в результирующий публичный контекст типового модуля.
Перехват вызовов методов
Задача перехвата вызовов, в подавляющем большинстве случаев, заключается в том, чтобы окружить вызов типового метода некоторыми перед- и/или последействиями. При этом мы не исключили и вариант полного перекрытия вызова типового метода, и реализовали такую возможность.
Необходимость перехвата того или иного типового метода вы полностью описываете в расширяющем модуле. Для этого мы ввели во встроенный язык новый структурный элемент – аннотацию. С помощью аннотации, расположенной перед определением метода, вы указываете, какой именно типовой метод перехватывает процедура/функция, и каким именно образом. Например:
Аннотация &Перед("Процедура1") означает, что перехватывается типовая процедура с именем Процедура1. Имя аннотации Перед означает, что сначала будет выполнена ваша процедура-перехватчик Расш_Проц1(), а затем - типовая Процедура1().
В настоящий момент мы добавили в платформу три возможных имени аннотаций.
Аннотация &Перед
Аннотация с таким именем означает, что ваш перехватчик будет выполнен до того, как начнётся выполнение типового метода.
На схеме типовой и расширяющий модули показаны прямоугольниками, а стрелка показывает последовательность исполнения встроенного языка.
Аннотация &После
Эта аннотация означает, что ваш перехватчик будет выполнен после того, как выполнится типовой метод.
Аннотация &Вместо
Эта аннотация как раз и реализует возможность полного перекрытия типового метода. То есть типовой метод вообще не будет выполнен. Вместо него выполнится только ваш перехватчик.
На одну и ту же типовую процедуру вы можете установить в своём расширении одну из следующих комбинаций перехватчиков:
Последняя комбинация перехватчиков (&Перед и &После) будет исполняться следующим образом:
Если же вы перехватываете типовую функцию, а не процедуру, то вы можете использовать только перехватчик &Вместо.
Вызов метода, перекрытого аннотацией &Вместо
Получается некоторая несправедливость. Процедуру вы можете перекрыть или обрамить. А функцию – только полностью перекрыть.
Чтобы избавиться от этой несправедливости, мы реализовали во встроенном языке новый метод – ПродолжитьВызов(). Если вы вызовете этот метод внутри своей функции-перехватчика, то исполнится та функция, которую вы перекрыли, после чего исполнение кода вернётся в ваш перехватчик:
На встроенном языке такая функция-перехватчик может выглядеть следующим образом:
Таким образом, ваша функция-перехватчик разбивается на две части. Ту часть, которая исполняется перед исполнением типовой функции, и ту, которая исполняется после типовой.
Метод ПродолжитьВызов() вы можете использовать не только при перекрытии функций, но и при перекрытии процедур. В этом случае результат его применения будет по смыслу такой же, как при использовании пары перехватчиков &Перед и &После. Разница будет лишь в том, что в этом случае ваша часть «до» и ваша часть «после» будут существовать внутри одного контекста. В некоторых ситуациях это может быть удобно. На встроенном языке такая процедура-перехватчик может выглядеть следующим образом:
Что лучше, &Перед, &После или &Вместо?
Когда вы перехватываете методы типовой конфигурации, всегда полезно помнить о двух вещах:
- После того, как вы написали своё расширение, типовая конфигурация будет изменяться;
- Ваша цель – добавить свою функциональность, а не навсегда отказаться от того, что есть, и что будет в типовой конфигурации.
С этой точки зрения наиболее предпочтительным является использование перехватчиков &Перед и &После. Потому что с ними перехватываемый типовой метод будет выполнен всегда, без каких либо условий. И если разработчики типовой конфигурации позже внесут в этот метод изменения, эти изменения обязательно отработают и при использовании вашего расширения.
Также вполне приемлемым является использование перехватчика &Вместо и метода ПродолжитьВызов(). Однако тут у вас появляется возможность и соблазн вызывать типовой метод не всегда, а в зависимости от каких-то своих собственных условий. К этому нужно подходить осторожно и помнить, что в тот момент, когда вы отказываетесь от вызова типового метода, вы отказываетесь от вызова не только того метода, который есть в конфигурации сейчас, но и от всех его вариантов, которые появятся в будущем. А в будущем, например, в нём могут появиться важные и полезные изменения.
И, наконец, самый «нехороший» вариант – это полное перекрытие типового метода перехватчиком &Вместо. В этом случае типовой обработчик безусловно не будет выполняться ни сейчас, ни в будущих версиях. То есть всю ответственность за работу будущих версий конфигурации вы берёте на себя, на своё расширение. Наверняка есть ситуации, когда такое полное перекрытие необходимо, но мы призываем вас подходить к его использованию очень взвешенно и осторожно.
Последовательность вызовов при перехвате методов
Здесь, прежде чем рассказывать, необходимо сделать небольшое пояснение. Важной, можно сказать, «идеологической» характеристикой расширений является их автономность. То есть расширения должны проектироваться так, чтобы не зависеть друг от друга.
Но при работе приложения, естественно и очевидно, существует некоторая последовательность вызова подключенных расширений. Эта последовательность известна и сейчас мы о ней расскажем. Но расскажем мы не для того, чтобы на её основе вы создавали взаимозависимые расширения, или расширения, подразумевающие единственную жёстко определённую последовательность подключения. А для того, чтобы вы могли разбирать возникающие проблемы и отлаживать программный код.
Когда вы подключаете расширения к типовой конфигурации, образуется «многослойный пирог». В основании этого пирога находится типовая конфигурация, а на его вершине – последнее подключенное расширение.
Что в конфигураторе, что в режиме 1С:Предприятие, последнее подключенное расширение находится в списке последним.
Таким образом, в этом примере внизу находится типовая, наверху находится Расширение2, а между ними – Расширение1. Каждое следующее расширение перехватывает (расширяет) то, что находится под ним.
Когда платформа сталкивается с перехватчиками, определёнными в расширениях, процесс исполнения встроенного языка идёт сверху вниз этого пирога, в соответствии с аннотациями, которые есть у перехватчиков. До того уровня, до которого он может дойти. После этого он возвращается наверх, если есть перехватчики, и уходит снова в типовую конфигурацию.
Пример 1
Например, если в двух расширениях перехвачен (обрамлён) один и тот же типовой метод, то последовательность вызова обработчиков будет следующая:
- Сначала будет вызван перехватчик из Расширения2, потому что оно сверху. Это будет перехватчик &Перед, потому что у него такая аннотация;
- Затем будет вызван перехватчик из Расширения1, потому что оно следующее в пироге. Это будет снова &Перед, потому что у него такая аннотация;
- После этого будет вызван типовой метод, потому что больше нет перехватчиков, препятствующих его исполнению;
- Затем, в обратной последовательности «пирога», будут вызваны перехватчик &После из Расширения1 и перехватчик &После из Расширения2.
На этом примере можно хорошо понять следующую особенность: если в одном из перехватчиков возникает необработанное исключение, то вся цепочка прерывается, и исключение продолжает распространяться.
Пример 2
Если в перехватчиках используется метод ПродолжитьВызов(), то действует тот же самый принцип «пирога».
- Сначала будет вызван перехватчик из Расширения3, потому что оно сверху. Это будет перехватчик &Вместо, потому что у него такая аннотация;
- При попытке вызвать типовой метод, будет анализироваться оставшийся «пирог». Анализироваться он будет точно таким же образом, как было описано в предыдущем примере;
- В результате исполнение кода вернётся в перехватчик &Вместо, а по его завершении – в типовую конфигурацию.
Пример 3
Важным для понимания моментом является тот факт, что при перекрытии с помощью аннотации &Вместо, по факту перекрывается не только вызов основного метода, но также и перехватчиков, находящихся ниже в «пироге».
В этом примере будет выполнен только перехватчик &Вместо из Расширения2. Потому что он перекрывает собой типовой метод, то есть весь «пирог», который находится под ним.
Пример 4
Это, по сути, вариация на тему второго примера, но когда под верхним расширением находится расширение, также «прокидывающее» вниз вызов типовой процедуры.
По сути, он просто лишний раз визуализирует тот факт, что вызов типового метода относится ко всему «пирогу», находящемуся под расширением. Именно поэтому после вызова перехватчика из Расширения2, будет вызван перехватчик из Расширения1. Потому что в оставшемся «пироге» именно он перекрывает вызов типового метода, до которого хочется «дотянуться» Расширение2.
Перехват обработчиков событий и собственные обработчики в модулях объектов, менеджеров и т.п.
Перехват любых методов в этих модулях выполняется точно так же, как было описано в начале. Однако если перехватываемая процедура является обработчиком события, существуют некоторые особенности. Эти особенности связаны с тем, что в этих модулях все обработчики событий имеют фиксированные имена.
Во-первых, в качестве имени перехватываемого метода указывается имя события. Например, ПередЗаписью:
Во-вторых, наличие типового обработчика этого события не является обязательным. Если типовой обработчик отсутствует, то будет вызван ваш перехватчик. Благодаря этой особенности вы можете назначать собственные обработчики тем событиям, которые не обрабатываются в типовой конфигурации.
Поскольку в модулях объектов обработчики событий имеют фиксированные имена, а перечень аннотаций известен, мы реализовали для вас небольшой «сервис». При создании в расширении обработчика открывается диалог, в котором вы можете выбрать тип вызова. После чего в модуле создаётся заготовка процедуры-перехватчика.
Перехват обработчиков событий и собственные обработчики в модулях форм
Перехват любых методов в этих модулях тоже выполняется точно так же, как было описано в начале. Однако и тут есть особенности, связанные с перехватом обработчиков событий. Эти особенности связаны с тем, что в этих модулях все обработчики событий назначаемые, и не имеют фиксированных имён. Как вы наверняка знаете, чтобы платформа понимала, чем нужно обрабатывать то или иное событие, в конфигураторе, в панели свойств, должна существовать привязка конкретной процедуры к конкретному событию.
Именно по этой причине и только при перехвате обработчиков событий в форме, вам нужно использовать не аннотации, а палитру свойств. Хотя любые другие методы модуля, не являющиеся обработчиками событий, вы можете перехватывать с помощью аннотаций.
Внешне перехватчик события в модуле формы выглядит следующим образом:
То есть аннотация не используется, а тип перехватчика указывается в палитре свойств. Делается это довольно просто. При создании в расширении обработчика по кнопке «лупа» открывается диалог. Он позволяет вам, помимо контекста, указать тип перехватчика (Перед, После или Вместо).
После создания заготовки процедуры в палитре свойств, рядом с именем перехватчика, появляется иконка, отображающая тип перехвата.
Если вы перекрываете типовой обработчик (Вместо), то это будет просто точка.
Если вы создаёте перехватчик Перед или После, то это будет точка рядом с вертикальной чертой. Местонахождение точки, перед или после черты, обозначает тип перехватчика. А кроме этого в палитре свойств появляется второе (пустое) поле рядом с этим событием. С его помощью вы можете задать парный перехватчик, если есть необходимость обрамить типовой обработчик парой Перед - После.
Перехватчики событий, заданные таким образом, будут работать и в том случае, если типовой обработчик этого события отсутствует. Именно таким образом вы можете назначать собственные обработчики тем событиям формы, которые не обрабатываются в типовой конфигурации.
Говоря о модулях форм нужно сделать ещё одно небольшое замечание. Мы немного изменили поведение модулей, расширяющих модули форм, которое существовало ранее. Для того чтобы оно соответствовало поведению остальных модулей, и обеспечивало стабильность программного кода.
Прежде все модули, расширяющие модуль формы, и сам модуль формы, находились в одном пространстве имён. Таким образом, существовала возможность из верхнего расширения вызывать не только методы типовой конфигурации, но и методы лежащих ниже расширений. Теперь мы эту «лазейку» закрыли, и методы лежащих ниже расширений больше недоступны. Теперь вы можете обращаться только к методам, содержащимся в том типовом модуле, который вы расширяете.
Общие модули
В расширении вы можете создавать любые собственные общие модули. Существует только два ограничения:
- Они не должны быть глобальными серверными;
- Они не должны быть привилегированными.
Когда вы расширяете общий модуль типовой конфигурации, тоже есть аналогичные ограничения:
- Нельзя заимствовать глобальные серверные модули;
- Код из вашего расширения будет исполняться только в непривилегированном режиме (если иное не разрешено в профиле безопасности).
Сама операция заимствования глобального серверного модуля не запрещена в дереве конфигурации, но на этапе обновления конфигурации базы данных вы получите ошибку, и обновление выполнено не будет.
Серверные методы расширяются не всегда
Факт того, что ваше расширение успешно подключено к типовой конфигурации, ещё не означает, что все перехватчики, которые есть в вашем расширении, будут применены и начнут выполняться. Тут есть некоторые особенности, связанные с безопасностью.
Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении вашего расширения:
- В обычном режиме исполнения встроенного языка - будут расширяться все методы типового решения, и клиентские, и серверные;
- В безопасном режиме исполнения встроенного языка - будут расширяться только клиентские методы и серверные обработчики форм. К остальным серверным процедурам / функциями расширение применяться не будет.
Когда прикладное решение работает в клиент-серверном варианте и при подключении расширения указан конкретный профиль безопасности, либо информационной базе назначены профили обычного и безопасного режима, то «серверная» часть расширения будет применяться так, как указано в соответствующем профиле.
Для этого в профиль безопасности мы добавили несколько новых свойств.
Самое простое из них – это флажок к расширению всех модулей в группе Разрешен полный доступ. Он «одним махом» разрешает расширение серверного контекста.
Есть и более точная настройка с помощью полей Доступные для расширения модули и Недоступные для расширения модули. Мы предполагаем, что вы будет использовать их следующим образом:
Общие команды — механизм платформы, предназначенный для описания часто используемых команд в конфигурации 1С 8.3.
Общие или глобальные команды удобно использовать, если одна команда нужна многих объектам конфигурации. Например, кнопка для вывода структуры подчиненности документов, команда отображения проводок документа, отчет о изменении объекта.
В команду можно передать параметры, например, из формы какого объекта он вызывается.
Настройка и свойства общей команды в 1С
Добавить новую команду и настроить общую форму достаточно просто, рассмотрим этот процесс подробнее:
- Группа — расположение будущей команды на интерфейсе.
- Тип параметра команды — определяет набор объектов, в котором будет отображаться будущая команда.
- Режим использования параметра — задает возможность передать в качестве параметра команды одно или несколько значений.
- Изменяет данные — если галка установлена, то при выполнение команды форма будет пересчитана с сервера.
- Модуль команды — обработчик выполнения команды, выполняется на клиенте.
Пример модуля команды:
Здесь ПараметрКоманды — объект, вызывающий команду. А в ПараметрыВыполненияКоманды структура, в которой описан Источник (вызываемая Форма), Окно (ОкноКлиентскогоПриложения), Уникальность, указывает, искать ли уже открытую форму или нет.
Группы команд 1С
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Объект, позволяющий вывести команды на командный интерфейс конфигурации в отдельную группу:
Видео по общим командам от Павла Чистова:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Читайте также: