&ИзменениеИКонтроль в расширениях 1С

Начиная с версии платформы 8.3.15 в расширениях можно использовать аннотацию &ИзменениеИКонтроль. При этом важна именно версия платформы, а не режим совместимости. То есть, если у Вас платформа 8.3.15, а режим совместимости установлен 8.3.12, то аннотация &ИзменениеИКонтроль будет работать.

На платформе младше 8.3.15 будет ошибка: «Ожидается оператор препроцессора #<<?>>Вставка»:

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

&НаКлиенте
Процедура Команда1(Команда)
	ИзменениеИКонтроль();
КонецПроцедуры
 
&НаСервере
Процедура ИзменениеИКонтроль()
	а = 1;
	б = 2;
	Сумма = а + б;
	Сообщить("Сумма равна");
	Сообщить(Сумма);
КонецПроцедуры

Создадим новое расширение, назовем его «ИзменениеИКонтроль» и добавим в него процедуру ИзменениеИКонтроль() из модуля формы обработки. Аннотацию выберем «Вызывать вместо (с контролем)»:

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

&НаСервере
&ИзменениеИКонтроль("ИзменениеИКонтроль")
Процедура Изм_ИзменениеИКонтроль()
	а = 1;
	б = 2;
	Сумма = а + б;
#Удаление
	Сообщить("Сумма равна");
#КонецУдаления
	Сообщить(Сумма);
КонецПроцедуры

Здесь мы использовали инструкции препроцессора #Удаление — #КонецУдаления. Код находящийся между ними будет удален из результирующего модуля. В результате, при нажатии на кнопку будет выведено только сообщение с числом 3. Если у Вас сообщение «Сумма равна» все равно выводится, проверьте снята ли галка «Безопасный режим» в списке расширений:

Теперь добавим, чтобы выводилось сообщение «Сумма из расширения равна»:

&НаСервере
&ИзменениеИКонтроль("ИзменениеИКонтроль")
Процедура Изм_ИзменениеИКонтроль()
	а = 1;
	б = 2;
	Сумма = а + б;
#Удаление	
	Сообщить("Сумма равна");
#КонецУдаления	
#Вставка	
	Сообщить("Сумма из расширения равна");
#КонецВставки
	Сообщить(Сумма);
КонецПроцедуры

Здесь мы использовали инструкции препроцессора #Вставка — #КонецВставки. Код расположенный между ними будет добавлен в результирующий модуль.

Если сейчас в исходном модуле (не в расширении) изменить значение переменной «а» на 11:

&НаСервере
Процедура ИзменениеИКонтроль()
	а = 11;
	б = 2;
	Сумма = а + б;
	Сообщить("Сумма равна");
	Сообщить(Сумма);
КонецПроцедуры

И нажать на кнопку на форме обработки, то снова будет выведено «Сумма равна» и число 13 (сумма изменилась, так как мы изменили значение одного из слагаемых).

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

Если в конфигураторе в списке расширений выделить расширение и выполнить команду Конфигурация — Проверка возможности применения, то выйдет ошибка о невозможности применения расширения:

Это позволит избежать ошибок, когда после обновления конфигурации был изменен модуль, для которого в расширении была использована аннотация &Вместо.

Автоматическое обновление модуля в расширении можно выполнить только если настроено сравнение/объединение с помощью внешних программ.

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

Но если бы наша процедура была клиентской, то расширение бы все равно применилось, несмотря на то что отличается текст процедуры.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: