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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наши разработки:
Расширенная форма заказа клиента для УТ11, КА2, ERP2

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

Расширение конфигурации позволяет выводить остатки по всем необходимым складам, отображать цены номенклатуры и дополнительные колонки номенклатуры прямо в списке товаров ...
Обмен 1С и OZON (УТ11, ERP2, КА2, БП3, УНФ, Розница)

Обмен 1С и OZON (УТ11, ERP2, КА2, БП3, УНФ, Розница)

Расширение конфигурации позволяет выполнять автоматический обмен между 1С и OZON и совместимо с актуальными конфигурациями Управление торговлей 11, ERP Управление ...
Учет сертификатов номенклатуры в УНФ (печать реестра сертификатов)

Учет сертификатов номенклатуры в УНФ (печать реестра сертификатов)

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

Управление запасами: Товары поставщиков (УТ11, КА2, ERP2)

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

Изменение записей регистра сведений (универсальная обработка)

Обработка дает возможность массово или точечно изменять записи регистра сведений. Поддерживается изменение записей в независимых регистрах и регистрах с подчинением ...
Управление запасами: Помощник закупок (УТ11, КА2, ERP2)

Управление запасами: Помощник закупок (УТ11, КА2, ERP2)

Мы постоянно общаемся с нашими клиентами и обсуждаем как можно упростить их работу. Помощник закупок - это не просто отчет! ...

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

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

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

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

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

Добавить комментарий

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