Top.Mail.Ru

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Изменить в расширении и контролировать - пример использования

Платформа предлагает еще один, иногда более удобный способ сделать доработку с аннотацией ИзменениеИКонтроль - если у нас еще нет в расширении метода с такой аннотацией, можно выделить нужный фрагмент кода, вызвать контекстное меню и выбрать пункт "Изменить в расширении и контролировать". Платформа сама добавить заготовку с удалением и вставкой:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

Чувствуете, что застряли в основах 1С?

Информация в интернете кажется обрывочной, а на решение простых задач уходят часы? Вы не одиноки. Я запустил Клуб для 1С разработчиков Alexcode.PRO. Внутри - продвинутые статьи, видео, материалы для скачивания, закрытый чат для резидентов и возможность влиять на контент.

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

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