- Использование аннотации &Вместо на примерах
- Как обойти глюк механизма расширений. Пошаговая инструкция в картинках
- Специальные предложения
- Расширение модулей 1С 8.3. Аннотации Вместо, После, Перед
- Возможности расширения модулей
- Механизм аннотаций.
- Аннотация &Перед
- Аннотация &После
- Метод ПродолжитьВызов()
- Последовательность выполнения расширенных методов
Использование аннотации &Вместо на примерах
В этой записи подробно разберем использование аннотации &Вместо в общих модулях конфигураций 1С, модулях объектов и их форм. Для начала работы нам потребуется создать расширение конфигурации . Открываем список расширений и добавляем новое расширение. При этом обратите внимание на правильный выбор варианта назначения расширения конфигурации .
- Использование аннотации &Вместо в общих модулях
- Использование аннотации &Вместо в модулях объектов
- Использование аннотации &Вместо в формах объектов
Использование аннотации &Вместо в общих модулях
Рассмотрим пример изменения произвольной функции в общем модуле. Совершенно неважно, является функция экспортной или нет. В качестве примера изменим логику функции ДатаСеанса() в модуле ОбщегоНазначенияКлиент (конфигурация Деньги8УчебнаяВерсия). Исходный текст процедуры:
С помощью аннотации &Вместо изменим логику функции таким образом, чтобы она возвращала только текущую дату. Для этого Вам необходимо добавить общий модуль в созданное ранее расширение. Для этого находим общий модуль, в котором располагается функция и нажимаем команду «Добавить в расширение»:
После добавления модуля в расширение его содержимое будет пустым. Теперь Вам нужно перенести текст изменяемой функции или процедуры в расширение. При этом добавим аннотацию &Вместо, в которой укажем имя функции, которую мы заменяем. Также сразу необходимо изменить наименование исходной функции в расширении т.к. это уже будет другая функция, которая будет замещать исходную. Текст замещающей функции будет следующим:
Шаги, которые мы сделали:
- Добавили аннотацию &Вместо и в скобках указали имя заменяемой процедуры/функции.
- Изменили наименование процедуры/функции.
- Изменили логику процедуры/функции на нужную нам.
Все, теперь Вам осталось только обновить конфигурацию базы данных. Теперь при вызове функции ДатаСеанса() вместо нее будет вызвана фукнция ДатаСеансаДоработанная().
Использование аннотации &Вместо в модулях объектов
Чтобы изменить процедуру или функцию в объекте — Вам нужно добавить этот объект в расширение конфигурации. К примеру, Вам нужно изменить логику процедуры ПриЗаписи. В качестве примера будем использовать справочник Валюты. Добавим его в расширение конфигурации:
После добавления расширения открываем модуль объекта справочника Валюты в расширении конфигурации (после включения объекта в расширения он будет пуст). Теперь нам нужно перенести в модуль объекта в расширении изменяемую процедуру:
Теперь давайте доработаем эту процедуру — добавим аннотацию &Вместо, изменим наименование процедуры и сделаем свою вставку кода:
В результате этих простых действий мы полностью оставили логику процедуры ПриЗаписи из типовой конфигурации и дополнили ее своим кодом. После применения изменений к конфигурации БД при записи валюты будет вызываться процедура ПриЗаписиДоработанная().
Использование аннотации &Вместо в формах объектов
В формах объектов есть 2 варианта переопределения процедур и функций. Если Вам нужно переопределить событие элемента формы — Вы должны создавать обработчик события в форме, перенесенной в расширение. Если же нужно переопределить процедуру или функцию, которая не связана с обработчиками событий элементов формы — тут правила аналогичны переопределению процедур и функций в общих модулях объектов.
Теперь давайте рассмотрим более подробно переопределение событий элементов формы. Для этого добавим нужную нам форму в расширение конфигурации (в примере будем использовать форму элемента справочника Валюты):
Теперь давайте переопределим событие ПриСозданииНаСервере. Для этого находим это событие в свойствах формы и создаем новое событие. При добавлении нового события выбираем тип вызова — «Вызывать вместо».
В результате этих действий будет создан новый обработчик события, замещающий аналогичный обработчик в типовой форме:
Если Вам нужно частично сохранить логику исходного метода — перенесите ее из исходной процедуры в форме объекта, которую мы добавили в расширение. Теперь Вы полностью можете изменять текст обработчика ПриСозданииНаСервере. Ниже показан пример переноса части логики процедуры в созданное в расширении событие и произвольная доработка логики:
На этих простых примерах мы показали Вам, как можно просто доработать конфигурацию с помощью расширений и аннотации &Вместо к процедурам или функциям. Если у Вас остались вопросы — задавайте их в комментариях.
Источник
Как обойти глюк механизма расширений. Пошаговая инструкция в картинках
Суть дела. В некоторых документах, взаимствованных из основной конфигурации, со статусом «Заимствованный» пропал «Объект расширяемой конфигурации». Потеряна связь расширения с основной конфигурацией, на форме пропали реквизиты расширения.
Проблема решается следующим способом.
1. Ставим флаг «Проверять значение при подключении расширения» рядом с объектом расширяемой конфигурации.
2. F7 — Обновить конфигурацию базы данных
3. После получения «Обнаружены проблемы при применении расширения конфигурации» выполняем действие «Исправить» — «Сохранить имя, изменив соответствие»
4. F7 — Обновить конфигурацию базы данных
Специальные предложения
Изменения метаданных — в основную конфу.
Изменения форм — через заимствованный модуль модификация конфигурациии — в обработку. все программно.
Подписки на события — в основную конфу.
Только вот код &НаКлиенте на форме писать приходится. Печаль.
Хотя для некоторых случаев уже можно через общие модули работать, используя функции «Подключаемый_. »
Ну а общие модули — перехватывать и во внешних обработках править.
Результат — минимальный набор изменений.
3 года — ничего ни разу не слетело.
(15) Логично.
В типовой не проводится сравнение основной конфигурации, конфигурации поставщика и новой конфигурации.
Если замеры делать на столь мало измененных конфигурациях, то бесспорно вы правы.
Такие конфы можно вообще автоматически обновлять. Главное настроить обновлятор)
(9) Может быть потому, что на этапе разработки вы выбираете решения «проще», потоп при обновлении получается сложнее?
ИМХО, чем меньше я буду тратить времени на очень занудную задачу обновления, тем радостнее будет мне решать сложные задачи.
А для программного изменения форм есть на ИС помогаторы, инструкции, статьи и инструменты
Что за флаг? Где он? Почему на скрине совсем другие стрелочки какие-то?
У меня постоянно было такое, что при изменении формы в расширении и сравнении/объединении этого нового расширения с расширением в рабочей базе у реквизита формы Объект слетал тип этого объекта в Строка , и все реквизиты слетают в тип Строка . Вот это вряд ли полечится таким способом, там только расширение полностью загружать, а не через объединение, что может быть проблемой, если нужно только одну форму подменить.
Источник
Расширение модулей 1С 8.3. Аннотации Вместо, После, Перед
Возможности расширения модулей
Начиная с версии платформы 1С 8.3.9.1818 появилась прекрасная возможность доработки практически любых модулей конфигурации используя механизм расширений. В статье мы рассмотрим примеры использования аннотаций: Перед, После, Вместо, а также замечательного метода ПродолжитьВызов() и их комбинаций.
В качестве ограничений расширения методов можно выделить:
— запрет на заимствование в расширение глобальных серверных модулей;
— по умолчанию расширенные методы привилегированного общего модуля выполняются в непривилегированном режиме (но это можно настроить в профиле безопасности).
— запрет на создание в расширении привилегированных и глобальных серверных общих модулей;
При расширении модуля объединяется пространство имен расширяемого и расширяющего модуля. Так из расширяющего модуля можно обращаться к переменным и методам расширяемого модуля. А экспортные методы и переменные, созданные в расширяющем модуле, также доступны из других модулей конфигурации и расширения.
В заимствованном в расширение модуле можно:
— создавать собственные переменные, процедуры и функции;
— назначать собственные обработчики на события, которые не обрабатываются в конфигурации;
— перехватывать любой метод расширяемого модуля и вызывать до и/или после него собственные методы.
Механизм аннотаций.
Для перехвата методов основной конфигурации используется механизм аннотаций при помощи элементов встроенного языка – &Перед, &После, &Вместо, — они определяют последовательность исполнения расширяемого и расширяющего методов.
Ниже на примерах рассмотрим каждую аннотацию, а также возможность их комбинаций.
Аннотация &Перед
Исходя из названия, очевидно, что метод, обрамленный данной аннотацией, будет выполняться до того, как будет происходить выполнение расширяемого метода.
Наглядно это можно отразить на приведенной ниже схеме
В качестве примера решим задачу вывода Фото Физического лица на Форму элемента Справочника Сотрудники в конфигурации ЗУП 3.1. Для этого добавим в расширение метод СотрудникиФормы.СотрудникиПриСозданииНаСервере вызываемый в обработчике Формы ПриСозданииНаСервере.
Запустим 1С Предприятие в режиме конфигуратора и перейдем в общий модуль СотрудникиФормы, далее щелкнув правой кнопкой мыши по заголовку процедуры СотрудникиПриСозданииНаСервере откроем выпадающий список – в нем выберем строчку «Добавить в расширение», система спросит тип аннотации – выберем «Вызывать перед»
Далее мы увидим следующее – в расширение добавился общий модуль СотрудникиФормы и создалась процедура Расш1_СотрудникиПриСозданииНаСервере с аннотацией &Перед(«СотрудникиПриСозданииНаСервере»)
Добавим в процедуру код программного вывода изображения на форму:
Запустим 1С в режиме предприятия и убедимся что фото Физлица выведено на Форме Сотрудника
Аннотация &После
Исходя из названия, очевидно, что метод, обрамленный данной аннотацией, будет выполняться после выполнения расширяемого метода.
Для примера рассмотрим задачу изменения цвета текста в поле ФОТ на Форме элемента Справочника Сотрудники в конфигурации ЗУП 3.1. в зависимости от выведенного значения. Если ФОТ Аннотация &Вместо
Данная аннотация полностью отключает выполнение расширяемого метода и выполняется только метод расширенный
Стоит отметить, что если для процедур основной конфигурации доступны все три аннотации то при добавлении в расширение функции из основной конфигурации доступна только одна аннотация &Вместо
Для примера запустим 1С Предприятие в режиме конфигуратора и добавим используемую выше функцию получения изображения физлица КадровыйУчетРасширенный.АдресФотографииФизическогоЛица в расширение. Платформа 1С создала функцию Расш1_АдресФотографииФизическогоЛица в расширении со следующим содержимым:
Метод ПродолжитьВызов() рассмотрим ниже, а сейчас заменим содержимое функции слегка доработанным типовым кодом, добавив в него условие, что если пользователю не доступна Роль «Расш1_ПросмотрФото» то адрес изображения возвращаться не будет:
Запустим 1С в режиме предприятия и убедимся, что изображение скрыто даже для пользователя с полными правами
Метод ПродолжитьВызов()
Теперь остановимся на методе платформы 1С ПродолжитьВызов(), если добавить его в расширяемую функцию, то можно обрабатывать его результат как бы было в случае использования аннотации &После для процедуры.
Решим сейчас такую задачу – выведем вместо надписи «Картинка не установлена» собственную картинку для тех Сотрудников у которых в базе нет фото. Для этого добавим также в расширении картинку в ветку метаданных Общие картинки новый элемент Расш1_ПустоеФото с подходящим изображением
Изменим код расширяемой процедуры, чтобы он выглядел следующим образом:
Запустим 1С в режиме предприятия и убедимся, что вместо надписи «Картинка не установлена» мы видим добавленную в расширение картинку-заглушку
Если вернуться к предыдущей задаче, где мы возвращали пустое значение картинки, в случае если у пользователя нет нужной роли, код функции можно переписать, также используя метод ПродолжитьВызов()
Метод ПродолжитьВызов() можно также использовать для процедур с аннотацией &Вместо он будет равнозначен совместному использованию &Перед и &После с той лишь разницей что в случае использования метода ПродолжитьВызов() часть процедуры до его вызова и часть после будут существовать внутри одного контекста, что требуется для решения некоторых задач. Схематически отобразить это можно следующим образом:
Совместное использование &Перед и &После
Использование метода ПродолжитьВызов()
Последовательность выполнения расширенных методов
Несмотря на то что разработка расширений должна вестись по идеологии одно расширение – одни методы, платформа определяет порядок обхода по принципу пирога т.е. сначала отрабатывают внешние слои, а затем внутренние: в первую очередь отрабатывает код последнего добавленного расширения, а последним отрабатывает код основной конфигурации, наглядно это можно увидеть на схемах ниже.
Порядок следования расширений в конфигурации
Порядок обхода аннотаций &Перед и &После
Порядок обхода аннотации &Вместо совместно с методом ПродолжитьВызов() и аннотациями &Перед и &После
Порядок обхода аннотации &Вместо без метода ПродолжитьВызов()
Важно отметить что в данном случае будет выполнятся только код из Расширения 2
В данной статье мы на примерах разобрали, как работает механизм аннотаций при расширении методов начиная с версии платформы 1С 8.3.9.1818. Удачи в программировании. Спасибо.
Источник