Использование аннотации &Вместо на примерах

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

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

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

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

Функция ДатаСеанса() Экспорт Возврат ТекущаяДата() + СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПоправкаКВремениСеанса; КонецФункции

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

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

&Вместо ("ДатаСеанса") Функция ДатаСеансаДоработанная() Экспорт Возврат ТекущаяДата(); КонецФункции

Шаги, которые мы сделали:

  1. Добавили аннотацию &Вместо и в скобках указали имя заменяемой процедуры/функции.
  2. Изменили наименование процедуры/функции.
  3. Изменили логику процедуры/функции на нужную нам.

Все, теперь Вам осталось только обновить конфигурацию базы данных. Теперь при вызове функции ДатаСеанса() вместо нее будет вызвана фукнция ДатаСеансаДоработанная().

Использование аннотации &Вместо в модулях объектов

Чтобы изменить процедуру или функцию в объекте — Вам нужно добавить этот объект в расширение конфигурации. К примеру, Вам нужно изменить логику процедуры ПриЗаписи. В качестве примера будем использовать справочник Валюты. Добавим его в расширение конфигурации:

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

Процедура ПриЗаписи(Отказ) Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; // ДЕНЬГИ // При начальном заполнении справочника валюты учета может и не быть, // следовательно и проверки курсов смысла не имеют ВалютаУчета = Константы.ВалютаУчета.Получить(); Если ЗначениеЗаполнено(ВалютаУчета) Тогда РаботаСКурсамиВалют.ПроверитьКорректностьКурсаНа01_01_1980(Ссылка, ВалютаУчета); Если ДополнительныеСвойства.Свойство("ОбновитьКурсы") Тогда Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда РаботаСКурсамиВалют.ПриОбновленииКурсовВалютВМоделиСервиса(ЭтотОбъект); Иначе ОбновитьКурсВалюты(ЭтотОбъект); КонецЕсли; КонецЕсли; КонецЕсли; // Конец ДЕНЬГИ КонецПроцедуры

Теперь давайте доработаем эту процедуру — добавим аннотацию &Вместо, изменим наименование процедуры и сделаем свою вставку кода:

&Вместо ("ПриЗаписи") Процедура ПриЗаписиДоработанная(Отказ) Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; // ДЕНЬГИ // При начальном заполнении справочника валюты учета может и не быть, // следовательно и проверки курсов смысла не имеют ВалютаУчета = Константы.ВалютаУчета.Получить(); Если ЗначениеЗаполнено(ВалютаУчета) Тогда РаботаСКурсамиВалют.ПроверитьКорректностьКурсаНа01_01_1980(Ссылка, ВалютаУчета); Если ДополнительныеСвойства.Свойство("ОбновитьКурсы") Тогда Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда РаботаСКурсамиВалют.ПриОбновленииКурсовВалютВМоделиСервиса(ЭтотОбъект); Иначе ОбновитьКурсВалюты(ЭтотОбъект); КонецЕсли; КонецЕсли; КонецЕсли; // Конец ДЕНЬГИ // Наш код! Сообщить("Процедура ПриЗаписи изменена!"); // Наш код! КонецПроцедуры

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

Использование аннотации &Вместо в формах объектов

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

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

Теперь давайте переопределим событие ПриСозданииНаСервере. Для этого находим это событие в свойствах формы и создаем новое событие. При добавлении нового события выбираем тип вызова — «Вызывать вместо».

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

&НаСервере Процедура Расш1_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка) // Вставить содержимое обработчика. КонецПроцедуры

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

&НаСервере Процедура Расш1_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка) Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; Если Объект.Ссылка.Пустая() Тогда Если Параметры.Свойство("КодВалюты") Тогда Объект.Код = Параметры.КодВалюты; КонецЕсли; Если Параметры.Свойство("НаименованиеКраткое") Тогда Объект.Наименование = Параметры.НаименованиеКраткое; КонецЕсли; Если Параметры.Свойство("НаименованиеПолное") Тогда Объект.НаименованиеПолное = Параметры.НаименованиеПолное; КонецЕсли; Если Параметры.Свойство("Загружается") Тогда Объект.ЗагружаетсяИзИнтернета = Параметры.Загружается; КонецЕсли; Если Объект.ЗагружаетсяИзИнтернета Тогда Объект.ОсновнаяВалюта = Справочники.Валюты.ПустаяСсылка(); КонецЕсли; Если Параметры.Свойство("ПараметрыПрописиНаРусском") Тогда Объект.ПараметрыПрописиНаРусском = Параметры.ПараметрыПрописиНаРусском; КонецЕсли; ЗаполнитьФормуПоОбъекту(); КонецЕсли; // ДЕНЬГИ //ВалютаУчета = Константы.ВалютаУчета.Получить(); //ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(ИсторияКурсов, "ВалютаУчета", ВалютаУчета); //ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(ИсторияКурсов, "Валюта", Объект.Ссылка); //ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ИсторияКурсов.Отбор, "БазоваяВалюта", ВалютаУчета, ВидСравненияКомпоновкиДанных.Равно, "Валюта учета", Истина); //ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ИсторияКурсов.Отбор, "Валюта", Объект.Ссылка, ВидСравненияКомпоновкиДанных.Равно, "Валюта", Истина); //// Общие настройки форм элементов справочников //РаботаСФормамиСправочников.ФормаЭлементаПриСозданииНаСервере(ЭтаФорма); //УправлениеФормой(ЭтотОбъект); // Конец ДЕНЬГИ // Наш код! Сообщить("Процедура ПриЗаписи изменена!"); // Наш код! КонецПроцедуры

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

Дополнительно рекомендуем к прочтению:

Наши разработки:
Конструктор прайс-листов (прайс-заказов) для УТ11, КА2, ERP2, УНФ, Розница

Конструктор прайс-листов (прайс-заказов) для УТ11, КА2, ERP2, УНФ, Розница

Расширение позволяет формировать произвольные прайс-листы с выгрузкой в Excel и обратной загрузкой в 1С (после обработки прайс-листа клиентом). Конструктор также ...
Помощник продаж с мультикорзиной (расширение для УТ11, КА2, ERP2)

Помощник продаж с мультикорзиной (расширение для УТ11, КА2, ERP2)

Помощник продаж выполнен в виде расширения конфигурации 1С, которое существенно дополняет возможности стандартного списка номенклатуры, превращая его в полноценное рабочее ...
Расширенная форма списка номенклатуры для УТ11, КА2, ERP2

Расширенная форма списка номенклатуры для УТ11, КА2, ERP2

Расширение конфигурации позволяет выводить остатки по всем необходимым складам, отображать цены номенклатуры в списке и применять различные отборы. После установки ...
Расширенная форма РМК для УТ 11, КА 2, ERP 2

Расширенная форма РМК для УТ 11, КА 2, ERP 2

Расширение конфигурации дорабатывает рабочее место кассира (РМК) и добавляет в нее удобные инструменты для просмотра остатков по складам, остатков по ...
Розница: Расширенная форма списка номенклатуры

Розница: Расширенная форма списка номенклатуры

Расширение конфигурации изменяет форму списка номенклатуры и добавляет в него функционал, позволяющий выводить остатки по любому складу, цены номенклатуры и ...
Контроль минимальной цены и суммы в заказах и реализациях (УТ11, КА2, ERP2)

Контроль минимальной цены и суммы в заказах и реализациях (УТ11, КА2, ERP2)

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

Комментарии 4

  • Допустим, создано 2 расширения. Т.е. работают две разные компании. Одна компания применила аннотацию &Вместо для процедуры ПриЗаписи() документа. Но тут второй компании необходимо внести в эту процедуру кое-какие изменения. И что же ей делать?

    • Здравствуйте!
      Вторая компания также может использовать в своем расширении аннотацию &Вместо для процедуры ПриЗаписи() документа. Последовательность их вызова «теоретически» будет в последовательности расположения расширений.

      • То есть одна и та же процедура с небольшими изменениями будет выполнена дважды?

        • Добрый день!
          Елена, не совсем корректно написано выше. Аннотация &Вместо в первом расширении перекрывает типовой метод и перекрывает аналогичные вызовы в других расширениях, расположенных ниже. Таким образом аннотация &Вместо для одного метода отработает только один раз.

Добавить комментарий для Райса Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *