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

Аннотации #ИзменениеИКонтроль, #Вставка и #Удаление
Для корректной работы механизма "Вызывать вместо (с контролем)" используются специальные аннотации:
#ИзменениеИКонтроль
Эта аннотация помогает управлять изменением кода в расширении. После добавления процедуры в расширение её текст копируется из основной конфигурации, и изменения нужно вносить в строгом соответствии с оригиналом. Рассмотрим пример. Ниже - исходная процедура из основной конфигурации, которая настраивает связи параметров выбора для договора.
&НаСервере Процедура НастроитьСвязиДоговора() Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; КонецПроцедуры
Добавим ее в расширение, выберем Вызвать вместо (с контролем):


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

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

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

При добавлении процедуры в расширение может появиться диалоговое окно "Метод является обработчиком события". Оно появляется, если процедура из основной конфигурации связана с обработкой событий. В этом случае 1С предлагает три варианта:
- Да — процедура сохраняет статус обработчика события, но можно выбрать только "Вместо", Перед" или "После";
- Нет — процедура больше не считается обработчиком события, но можно использовать "ИзменениеИКонтроль";
- Отмена — операция добавления процедуры прерывается.
Важно! Настоятельно рекомендую методы-обработчики событий модифицировать именно как обработчики, иначе последствия могут быть слабо предсказуемыми.
Заключение
Теперь вы знаете, как использовать механизм "Вызывать вместо (с контролем)" в 1С, а также работать с аннотациями #ИзменениеИКонтроль, #Вставка, #Удаление. Эти знания помогут вам избежать ошибок при разработке и успешно вносить изменения в конфигурации 1С.
Если статья была полезной — делитесь ею с коллегами и применяйте полученные знания на практике!
Чувствуете, что застряли в основах 1С?
Информация в интернете кажется обрывочной, а на решение простых задач уходят часы? Вы не одиноки. Я запустил Клуб для 1С разработчиков Alexcode.PRO. Внутри - продвинутые статьи, видео, материалы для скачивания, закрытый чат для резидентов и возможность влиять на контент.
