Использование аннотации #ИзменениеИКонтроль в расширениях конфигурации 1C

Что такое расширения конфигурации 1С?

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

  • Программно добавлять элементы на форму;
  • Изменять текст запросов;
  • Разрабатывать собственные алгоритмы и решения.

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

Тип вызова "Вызывать вместо (с контролем)" в 1С

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

Тип вызова Изменение и контроль в 1С

Аннотации #ИзменениеИКонтроль, #Вставка и #Удаление

Для корректной работы механизма “Вызывать вместо (с контролем)” используются специальные аннотации:

#ИзменениеИКонтроль

Эта аннотация помогает управлять изменением кода в расширении. После добавления процедуры в расширение её текст копируется из основной конфигурации, и изменения нужно вносить в строгом соответствии с оригиналом. Рассмотрим пример. Ниже – исходная процедура из основной конфигурации, которая настраивает связи параметров выбора для договора.

&НаСервере
Процедура НастроитьСвязиДоговора()
	Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора;
	
	МассивСвязей = Новый Массив;
	СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент");
	Если Не ВсеДоговоры Тогда
		МассивСвязей.Добавить(СвязьПараметровДоговора);
	КонецЕсли;
	
	НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей);
	Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи;
	
КонецПроцедуры

Добавим ее в расширение, выберем Вызвать вместо (с контролем):

Добавить метод в расширение
Добавление с контролем

#Вставка и #КонецВставки

Эта управляющая конструкция используется для того чтобы добавлять новые строки кода внутри расширяемого метода. Попытка вставить код без этих аннотаций приведет к ошибке.
Правильно:

&НаСервере
&ИзменениеИКонтроль("НастроитьСвязиДоговора")
Процедура Расш1_НастроитьСвязиДоговора()
	Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора;

	МассивСвязей = Новый Массив;
	СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент");
	Если Не ВсеДоговоры Тогда
		МассивСвязей.Добавить(СвязьПараметровДоговора);
	КонецЕсли;

	НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей);
	Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи;
	
	#Вставка
	//ВестиЛогирование - служебный реквизит, используется для вывода отладочных сообщений
	Если ВестиЛогирование Тогда
		Сообщить("Обновлены связи договора");
	КонецЕсли;
	#КонецВставки

КонецПроцедуры

Неправильно (добавленный код находится вне аннотаций #Вставка):

&НаСервере
&ИзменениеИКонтроль("НастроитьСвязиДоговора")
Процедура Расш1_НастроитьСвязиДоговора()
	Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора;

	МассивСвязей = Новый Массив;
	СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент");
	Если Не ВсеДоговоры Тогда
		МассивСвязей.Добавить(СвязьПараметровДоговора);
	КонецЕсли;

	НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей);
	Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи;
	
	//ВестиЛогирование - служебный реквизит, используется для вывода отладочных сообщений
	ВестиЛогирование = Истина;
	#Вставка
	Если ВестиЛогирование Тогда
		Сообщить("Обновлены связи договора");
	КонецЕсли;
	#КонецВставки

КонецПроцедуры

#Удаление и #КонецУдаления
Эти аннотации используются, если необходимо исключить часть кода из основной конфигурации. Рассмотрим пример – мы хотим отказаться от настройки связей. Правильно – с использованием аннотации #Удаление.

&НаСервере
&ИзменениеИКонтроль("НастроитьСвязиДоговора")
Процедура Расш1_НастроитьСвязиДоговора()
    #Удаление
	Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора;
	МассивСвязей = Новый Массив;
	СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент");
	Если Не ВсеДоговоры Тогда
		МассивСвязей.Добавить(СвязьПараметровДоговора);
	КонецЕсли;

	НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей);
	Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи;
	#КонецУдаления
КонецПроцедуры

Неправильно – в модуле под аннотацией #Удалить находится код, которого нет в исходном модуле в основной конфигурации:

&НаСервере
&ИзменениеИКонтроль("НастроитьСвязиДоговора")
Процедура Расш1_НастроитьСвязиДоговора()
	Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора;
	МассивСвязей = Новый Массив;
	СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент");
	Если Не ВсеДоговоры Тогда
		МассивСвязей.Добавить(СвязьПараметровДоговора);
	КонецЕсли;

	НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей);
	Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи;
    #Удаление
	Сообщить("Этого кода в тексте основной процедуры нет!");
	#КонецУдаления
КонецПроцедуры

Как проверить работоспособность расширения в 1С

Предположим, что мы добавили метод в расширение, внесли правки – что-то добавили, что-то удалили, и теперь хотим проверить, что наше расширение корректно работает. Для этого нужно сделать следующее:

  1. Откройте меню “Конфигурация” в конфигураторе.
  2. Перейдите в раздел “Расширения конфигурации”.
  3. Кликните правой кнопкой мыши в любом месте окна расширений, и выберите “Проверка возможности применения всех расширений”.
  4. В разделе “Служебные сообщения” появится “Проблем применения не обнаружено”. Если есть ошибки, придется идти их исправлять, разбираться, и повторно проверять применение расширения. Например, мы неправильно использовали аннотации #Удаление и #КонецУдаления. В окне ошибок увидим примерно такой текст:
Ошибка применения расширения Изменение и контроль

Как исправить ошибки при работе с "ИзменениеИКонтроль"

И все же, ошибки случаются. Ниже рассмотрены основные причины:

  • Текст процедуры изменен некорректно (лишние пробелы, отступы);
  • Не используются аннотации #Вставка и #Удаление;
  • Текст не соответствует оригинальной версии из основной конфигурации.

Особый случай - добавление в расширение обработчиков событий

Метод является обработчиком события

При добавлении процедуры в расширение может появиться диалоговое окно “Метод является обработчиком события”. Оно появляется, если процедура из основной конфигурации связана с обработкой событий. В этом случае 1С предлагает три варианта:

  • Да — процедура сохраняет статус обработчика события, но можно выбрать только “Вместо”, Перед” или “После”;
  • Нет — процедура больше не считается обработчиком события, но можно использовать “ИзменениеИКонтроль”;
  • Отмена — операция добавления процедуры прерывается.

    Важно! Настоятельно рекомендую методы-обработчики событий модифицировать именно как обработчики, иначе последствия могут быть слабо предсказуемыми.

Заключение

Теперь вы знаете, как использовать механизм “Вызывать вместо (с контролем)” в 1С, а также работать с аннотациями #ИзменениеИКонтроль, #Вставка, #Удаление. Эти знания помогут вам избежать ошибок при разработке и успешно вносить изменения в конфигурации 1С.

Если статья была полезной — делитесь ею с коллегами и применяйте полученные знания на практике!

Оставьте комментарий

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

девять − 8 =

К НАЧАЛУ